在 OpenGL 纹理中使用 PNG 图像

Don*_*uck 1 c opengl png 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);
Run Code Online (Sandbox Code Playgroud)

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

问题

为了比较,这是原始图像:

原图

我用位图图像尝试了完全相同的代码,它工作得很好。

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

Har*_*ish 6

这是问题所在。

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,surface->w,surface->h,0,GL_RGB,GL_UNSIGNED_BYTE,surface->pixels);
Run Code Online (Sandbox Code Playgroud)

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

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,surface->w,surface->h,0,GL_RGBA,GL_UNSIGNED_BYTE,surface->pixels);
Run Code Online (Sandbox Code Playgroud)

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

请参阅https://www.opengl.org/sdk/docs/man/html/glTexImage2D.xhtml了解更多信息。

  • `GL_RGBA8` 不是有效的 `format` 枚举。它只允许作为`internalFormat`。对于客户端,`format` 基本上只描述通道的数量和顺序,`type` 描述每个元素的数据格式,所以 `GL_RGBA`、`GL_UNSIGNED_BYTE` 可能是正确的选择。 (4认同)