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

// 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

有帮助吗?

解决方案

重新绑定你的纹理对象 glutDisplayFunc() 回调,以防万一™。

另外,我有点怀疑 GL_RGBA8. 。尝试 GL_RGBA. 。不过,可能是我的迷信。

其他提示

不知道自己没有尝试过,但你使用的似乎有点奇怪 GL_RGBA8 对于内部格式和 GL_RGB 对于像素格式。

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

一些想法:

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

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

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

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

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

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

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top