OpenGL纹理未显示

kmb7vmvb  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(175)

我试图在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();

我知道问题出在纹理上,因为我可以在屏幕上画出实心的形状。

fwzugrvs

fwzugrvs1#

默认的缩小过滤设置是使用mipmap。由于您没有提供低至1×1的所有mipmap级别,也没有切换到不需要mipmap的过滤方法,纹理采样将被跳过。
您必须将设置filter方法添加到非mipmapped的内容中,如下所示:

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

或者提供图像级别的完整堆栈。
glTexImage2D调用还有一个问题:GL_RGB8不是数据格式的有效标记。只有 internal 格式才允许使用显式大小的格式标记。但是,对于初学者,您可能应该使用无大小的标记(只有GL_RGB,没有8)(显式大小应该仅在其真正重要时使用,例如,对于某些精度要求或避免用于流式纹理更新的转换成本)。

相关问题