C++ 我做错了什么,我可以';是否在OpenGL中正确渲染图像/纹理?

C++ 我做错了什么,我可以';是否在OpenGL中正确渲染图像/纹理?,c++,opengl,augmented-reality,texture-mapping,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, &

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

// 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)的示例。里面的代码比这里显示的代码多得多

我可能会犯一个错误,显示四边形,但不渲染纹理/图像,有什么想法吗


glutDisplayFunc()
回调中重新绑定纹理对象,以防万一™.


另外,我对
GL\u RGBA8
有点怀疑。试试
GL\u RGBA
。不过我可能有点迷信。

glutDisplayFunc()
回调中重新绑定纹理对象,以防万一™.


另外,我对
GL\u RGBA8
有点怀疑。试试
GL\u RGBA
。我可能有点迷信。

我自己也不知道,但你用
GL\u RGBA8
表示内部格式,用
GL\u RGB
表示像素格式,这似乎有点奇怪


就个人而言,除非我在纹理上使用它,否则我也会对纹理对象执行
GL\u禁用(GL\u照明)
,不知道这是否会有帮助,但我知道我遇到了一些在灯光和纹理组合方面我并不真正理解的事情

我自己也不知道,但你使用
GL_RGBA8
作为内部格式,而使用
GL_RGB
作为像素格式似乎有点奇怪

就个人而言,除非我在纹理上使用它,否则我也会对纹理对象执行
GL\u禁用(GL\u照明)
,不知道这是否会有帮助,但我知道我遇到了一些在灯光和纹理组合方面我并不真正理解的事情

一些想法:

在配置和上传纹理之前,是否应该调用glEnable(GL_TEXTURE_2D)

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

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

一些想法:

在配置和上传纹理之前,是否应该调用glEnable(GL_TEXTURE_2D)

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


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

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

glTexParameteri(GL_纹理2D,GL_生成MIPMAP,GL_真)

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


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

glTexParameteri(GL_纹理2D,GL_生成MIPMAP,GL_真)

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


您是否尝试使用GL\U替换而不是GL\U调制


我看不到您在顶点中传递任何颜色,并且GL\u MODULATE将使用当前颜色进行调制。

您是否尝试使用GL\u REPLACE而不是GL\u MODULATE


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

两个过滤器参数均未指定mipmapping。两个过滤器参数均未指定mipmapping。如何确保“纹理维度为2的幂”-这是否意味着图像像素宽度和高度需要为2的幂?或者这与顶点位置有关?两种纹理的威力在GL中已经很久没有要求了。您实施的是哪一版本的GL?我可以告诉您GLUT 3.7.6包括在内;不确定GL的哪个版本。这有帮助吗?glTexImage2D的MSDN条目规定,对于某些整数n,宽度和高度必须为2^n+2(边框),其中(边框)是第六个参数。如何确保“纹理尺寸是2的幂”-这是否意味着图像像素的宽度和高度必须是2的幂?或者这与顶点位置有关?两种纹理的威力在GL中已经很久没有要求了。您实施的是哪一版本的GL?我可以告诉您GLUT 3.7.6包括在内;不确定GL的哪个版本。这有帮助吗?glTexImage2D的MSDN条目规定,对于某个整数n,宽度和高度必须为2^n+2(边框),其中(边框)是第6个参数。在详细阅读后,我改为GL_RGBA和GL_RGB-但仍然没有解决我的问题。你的灯光迷信也没有在详细阅读之后,我改为GL_RGBA和GL_RGB,但仍然没有解决我的问题。你的灯光迷信也没有试过了。没有看到任何变化。还有其他想法吗?试试看。没有看到任何变化。还有其他想法吗?你是我最好的新朋友。。。好的,现在有没有关于如何正确绑定纹理的想法?显然,我以前绑定得太早,有些东西被删除了,而且(我想?)在每个显示回调上重新绑定也不是正确的解决方案。。。想法?@japollock:我通常会在使用之前重新绑定纹理。所以在你打电话之前,你是我最好的新朋友。。。好的,现在有没有关于如何正确绑定纹理的想法?显然,我以前绑定得太早,有些东西被删除了,而且(我想?)在每个显示回调上重新绑定也不是正确的解决方案。。。想法?@japollock:我通常会在使用之前重新绑定纹理。因此,在您的情况下,就在您的
glBegin(GL\u QUADS)
调用之前。