2

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

// 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)扩展一个示例。那里的代码比这里需要显示的要多得多。

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

替代文字

4

5 回答 5

2

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

另外,我对GL_RGBA8. 试试GL_RGBA。不过可能是我的迷信。

于 2010-10-01T22:21:36.580 回答
0

一些想法:

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

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

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

于 2010-10-01T22:35:58.417 回答
0

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

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

于 2010-10-02T08:39:19.717 回答
0

GL_RGBA8不知道自己没有尝试过,但是您将其用于内部格式和GL_RGB像素格式似乎有点奇怪。

就个人而言,除非我在纹理上使用它,否则我也会GL_DISABLE(GL_LIGHTING)为纹理对象做一个,不知道这是否会有所帮助,但我知道我遇到了一些我不太了解的东西,就光和纹理组合而言担心。

于 2010-10-01T22:29:08.487 回答
-2

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

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

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

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

于 2010-10-01T23:05:02.373 回答