2

SDL_LoadBMP 将位图倒置加载并在 OpenGL 中镜像。可能是什么问题?

unsigned int loadTexture (const char * fileName)
{
    unsigned int texId;
    GLenum format;
    GLint colorCount;

    SDL_Surface * image = SDL_LoadBMP (fileName);

    colorCount = image->format->BytesPerPixel;
    if (colorCount == 4)
    {
         if (image->format->Rmask == 0x000000ff)
             format = GL_RGBA;
         else
             format = GL_BGRA;
    }
    else if (colorCount == 3)
    {
         if (image->format->Rmask == 0x000000ff)
             format = GL_RGB;
         else
             format = GL_BGR;
    }

    glGenTextures(1, &texId);
    glBindTexture(GL_TEXTURE_2D, texId);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glTexImage2D(GL_TEXTURE_2D, 0, colorCount, image->w, image->h, 0, format, GL_UNSIGNED_BYTE, image->pixels);

    SDL_FreeSurface(image);
    return texId;
}

..这就是我绘制测试四边形的方式..

glBegin(GL_QUADS);
    glTexCoord2i(0, 0); glVertex3f(-1.0, -1.0, 0.0);
    glTexCoord2i(1, 0); glVertex3f( 1.0, -1.0, 0.0);
    glTexCoord2i(1, 1); glVertex3f( 1.0,  1.0, 0.0);
    glTexCoord2i(0, 1); glVertex3f(-1.0,  1.0, 0.0);
glEnd();
4

1 回答 1

1

OpenGL 总是假定纹理图像的原点位于“左下角”。

严格来说,OpenGL 假定纹理的数据从原点开始,并随着纹理坐标的增加而前进。所以如果你绘制一个纹理坐标向右和向上的纹理,图像原点将在左下角。

在 OpenGL 端无法更改此行为,因此您必须对加载的图像数据进行适当调整,或使用一些着色器技巧来翻转那里的方向。然而,大多数图像加载库都允许您选择您期望的原点,因此我将其设置为左下方。然后库在内部处理数据。

于 2012-07-16T06:39:18.883 回答