我正在尝试在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();
我知道问题在于纹理,因为我可以在屏幕上绘制实体形状。
答案 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
)(仅当使用明确的大小时,如果真的很重要,例如对于某些精度要求或避免转换成本)流纹理更新)。