在OpenGL中无法正确渲染图像/纹理,我做错了什么?

时间:2010-10-01 22:12:12

标签: c++ opengl augmented-reality texture-mapping

我正在尝试将图像渲染到窗口。超级简单(或者我认为)。无论我做什么,我总是得到这个紫色的方块。我的代码的一些花絮:

// load image from file, called one time on load:
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);

RgbImage theTexMap( filename );

glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, theTexMap.GetNumCols(), theTexMap.GetNumRows(), 0, GL_RGB, GL_UNSIGNED_BYTE, theTexMap.ImageData() );

// render quad and texture, called inside glutDisplayFunc callback
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-50.0, -50.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-50.0, 50.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(50.0, 50.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(50.0, -50.0, 0.0);
glEnd();

glFlush();
glDisable(GL_TEXTURE_2D);

我正在删除大量代码,因为我试图从第三方库(ARToolkit)扩展一个示例。这里的代码比需要显示的代码多得多。

我可能会犯错误的任何想法会显示四边形但不会渲染纹理/图像?

alt text

5 个答案:

答案 0 :(得分:2)

glutDisplayFunc()回调中重新绑定纹理对象,Just In Case™。

另外,我对GL_RGBA8有点怀疑。试试GL_RGBA。虽然我可能迷信。

答案 1 :(得分:0)

Dunno没有亲自尝试,但是对于内部格式使用GL_RGBA8而像素格式使用GL_RGB似乎有点奇怪。

就个人而言,除非我在我的纹理上使用它,否则我也会为纹理对象做GL_DISABLE(GL_LIGHTING),不知道如果这会有所帮助,但我知道我遇到了一些我没有真正做过的事情了解光与光纹理组合是关注的。

答案 2 :(得分:0)

一些想法:

在配置和上传纹理之前,不应该调用glEnable(GL_TEXTURE_2D)吗?

您确定纹理尺寸是2的幂吗?

如果您想使用GL_LINEAR放大/缩小功能,您可能希望从原始纹理生成mipmap。

答案 3 :(得分:0)

您是否尝试使用GL_REPLACE而不是GL_MODULATE?

我没有看到你用顶点传递任何颜色,GL_MODULATE将使用当前颜色进行调制。

答案 4 :(得分:-2)

您的纹理仅指定MIP级别0,而不指定其他MIP级别,因此如果未在MIP级别0渲染,则结果可能是未定义的。快速修复是:

glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE);

这是一个容易犯的错误。一个很好的参考:

http://www.opengl.org/wiki/Common_Mistakes