在 OpenGL 纹理中使用 PNG 图像

Using PNG images in OpenGL textures

我正在使用 OpenGL 1.4,我想在 OpenGL 纹理中使用 PNG 图像。这是我用来初始化纹理的代码(使用 SDL 1.2 和 SDL 图像):

GLuint texture;
SDL_Surface *surface;
surface = IMG_Load("image.png");
glGenTextures(1,&texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,surface->w, surface->h, 0, GL_RGB, GL_UNSIGNED_BYTE, surface->pixels);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
SDL_FreeSurface(surface);

image.png 是一个 128x128 大小的 PNG 图像,位于与可执行文件相同的文件夹中。这是我得到的屏幕截图:

对比一下,这里是原图:

我用位图图像尝试了完全相同的代码,效果很好。

为什么要这样做?正确的做法是什么?

问题来了。

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,surface->w,surface->h,0,GL_RGB,GL_UNSIGNED_BYTE,surface->pixels);

您的 format 参数不正确。应该是:

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,surface->w,surface->h,0,GL_RGBA,GL_UNSIGNED_BYTE,surface->pixels);

GL_RGBA(不是 GL_RGB 将代表每个通道 8 位,这是我认为您的解决方案中需要的。)

更多信息请参考https://www.opengl.org/sdk/docs/man/html/glTexImage2D.xhtml