OpenGL纹理未显示

OpenGL texture is not showing

本文关键字:显示 纹理 OpenGL      更新时间:2023-10-16

我正在尝试在OpenGL中显示一个简单的纹理(来自数组(,但我只是得到一个空白的白色屏幕。

我的代码生成纹理:

GLbyte textureData[] = { 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255 };
GLsizei width = 2;
GLsizei height = 2;

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
glGenTextures(1, &textureName);
glBindTexture(GL_TEXTURE_2D, textureName);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_UNSIGNED_BYTE, GL_RGB8, (GLvoid*)textureData);

和显示代码:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureName);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(0.0, 0.0);
glVertex2f(-1.0, -1.0);
glTexCoord2f(1.0, 0.0);
glVertex2f(1.0, -1.0);
glTexCoord2f(0.0, 1.0);
glVertex2f(-1.0, 1.0);
glTexCoord2f(1.0, 1.0);
glVertex2f(1.0, 1.0);
glEnd();
glutSwapBuffers();

我知道问题在于纹理,因为我可以在屏幕上绘制固体形状。

默认的缩放过滤设置是使用mipmaps。由于您不提供所有MIPMAP级别降低到1×1,也不会切换到不需要MIPMAPPIP的过滤器方法,因此将跳过纹理采样。

您必须将设置过滤器方法添加到非映射的内容,例如:

glTexImage2D(…);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

或提供图像级别的完整堆栈。

也有glTexImage2D调用的问题:GL_RGB8不是数据格式的有效令牌。明确的格式令牌仅适用于 internal 格式。但是,对于初学者,无论如何,您可能应该使用未介绍的令牌(只有8((只有GL_RGB((仅在真正重要的情况下才能使用明确的大小,例如,例如,对于某些精度要求,或避免用于流纹理更新的转换成本(。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<