Opengl纹理没有显示

时间:2017-05-06 17:24:57

标签: c++ opengl graphics

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

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

1 个答案:

答案 0 :(得分:2)

默认缩小过滤设置是使用mipmap。由于您没有提供低至1×1的所有mipmap级别,并且未切换到不需要mipmapping的过滤方法,因此将跳过纹理采样。

您必须将过滤方法设置为非mipmap的内容,如下所示:

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

或者提供完整的图像级别。

因评论而更新

glTexImage2D调用也存在问题:GL_RGB8不是数据格式的有效令牌。仅允许内部格式使用明确大小的格式标记。但是对于初学者来说,你应该使用未标注的标记(只有GL_RGB而不使用8)(仅当使用明确的大小时,如果真的很重要,例如对于某些精度要求或避免转换成本)流纹理更新)。