微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Opengl纹理映射和图像重排

如何解决Opengl纹理映射和图像重排

| 我正在使用opengl和纹理贴图。 问题在于,当应用的纹理为512×32像素时,所有事物都可以正常工作,但是当其为128×128时,纹理无法正确应用。 纹理没有正确地重复,它被应用于对象的开始,其余部分则没有任何纹理。 在代码中:length参数约为100。 LoadTexture:读取.bmp文件并返回纹理索引的函数。 这是我正在使用的代码
int LoadTexture(char *filename,int alpha) 
{
    using namespace std;
    int i,j=0; //Index variables
    static int num_texture;
    ifstream l_file(filename);
    unsigned char *l_texture; //The pointer to the memory zone in which we will load the texture

    // windows.h gives us these types to work with the Bitmap files
    BITMAPFILEHEADER fileheader; 
    BITMAPINFOHEADER infoheader;
    RGBTRIPLE rgb;

    num_texture++; // The counter of the current texture is increased

    if(!l_file) return (-1); // Open the file for reading

    l_file.read(reinterpret_cast<char *>(&fileheader),sizeof(fileheader)); // Read the fileheader

    //fseek(l_file,sizeof(fileheader),SEEK_SET); // Jump the fileheader
    l_file.read(reinterpret_cast<char *>(&infoheader),sizeof(infoheader)); // and read the infoheader

    // Now we need to allocate the memory for our image (width * height * color deep)
    l_texture = new byte [infoheader.biWidth * infoheader.biHeight * 4];
    // And fill it with zeros
    memset(l_texture,infoheader.biWidth * infoheader.biHeight * 4);

    // At this point we can read every pixel of the image
    for (i=0; i < infoheader.biWidth*infoheader.biHeight; i++)
    {            
          // We load an RGB value from the file
          l_file.read(reinterpret_cast<char *>(&rgb),sizeof(rgb)); 

          // And store it
          l_texture[j+0] = rgb.rgbtRed; // Red component
          l_texture[j+1] = rgb.rgbtGreen; // Green component
          l_texture[j+2] = rgb.rgbtBlue; // Blue component
          l_texture[j+3] = alpha; // Alpha value
          j += 4; // Go to the next position
     }

     l_file.close(); // Closes the file stream

     glBindTexture(GL_TEXTURE_2D,num_texture); // Bind the ID texture specified by the 2nd parameter

     // The next commands sets the texture parameters
     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); // If the u,v coordinates overflow the range 0,1 the image is repeated
     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // The magnification function (\"linear\" produces better results)
     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); //The minifying function

     // Finally we define the 2d texture
     glTexImage2D(GL_TEXTURE_2D,4,infoheader.biWidth,infoheader.biHeight,GL_RGBA,GL_UNSIGNED_BYTE,l_texture);

     // And create 2d mipmaps for the minifying function
     gluBuild2DMipmaps(GL_TEXTURE_2D,l_texture);

     delete [] l_texture; // Free the memory we used to load the texture

     return num_texture; // Returns the current texture OpenGL ID
}
这就是我在做地图坐标的方法
void drawStreetStraight(Vector2d & point1,Vector2d & point2,Vector2d & point3,Vector2d & point4,double length)
{
    glEnable(GL_TEXTURE_2D);
    glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECR); 
    glBindTexture(GL_TEXTURE_2D,streetTexture);
    glBegin(GL_QUADS);
    glTexCoord2f(0,0);
    glVertex3d(point1.x,point1.y);
    glTexCoord2f(1,0);
    glVertex3d(point2.x,point2.y);
    glTexCoord2f(1,length/2.0);
    glVertex3d(point3.x,point3.y);
    glTexCoord2f(0,length/2.0);
    glVertex3d(point4.x,point4.y);
    glEnd();
    gldisable(GL_TEXTURE_2D);
}
    

解决方法

我不确定这是否是您的示例的修复程序,但似乎您没有在任何地方使用glGenTextures。 是否有一个原因? 我准备这样的纹理:
    glGenTextures( 1,&texPlane);
glBindTexture( GL_TEXTURE_2D,texPlane );
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexEnvf( GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE );
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_GENERATE_MIPMAP,GL_TRUE);  
glTexImage2D( GL_TEXTURE_2D,GL_RGBA,512,GL_UNSIGNED_BYTE,texPlanes);
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。