OpenGL3两套着色器,纹理呈现黑色

时间:2012-08-25 23:36:02

标签: c++ opengl opengl-3

我最近成功制作了一个带有GL_TEXTURE_RECTANGLE的小型测试应用程序。现在我正在尝试将它集成到我的大项目中,但是当我在render函数中调用glBindTexture(GL_TEXTURE_RECTANGLE,_tex_id [0])时,它会导致GL_INVALID_OPERATION错误。纹理图像有时会显示几分之一秒,然后变黑并保持黑色。

我试图通过使用两组顶点和片段着色器,一组用于3D场景,一组用于2D叠加,但我以前从未尝试过这样做,所以我不知道是不是导致错误的原因是什么,或者我是否应该以不同的方式解决这个问题。着色器都在编译和连接正常。

任何见解都会非常感激,如果它有助于查看一些代码,请告诉我,我会发布一些代码(虽然我认为任何人都可以合理地浏览一下)。

编辑: gDEBugger在调用glBindTexture()时中断,当点击断点时,属性窗口显示我的一个其他纹理的图片(一个由3D场景加载的纹理) shaders),它显示它正在尝试加载纹理编号1,但我知道这个数字已经被用于绘制属性窗口中显示的相同3D场景的纹理...为什么glGenTextures()会给我重叠纹理id号?这是正常的还是问题的一部分?

1 个答案:

答案 0 :(得分:0)

黑色纹理是由于我没有将一些顶点着色器输入(法线)转发到片段着色器,即使我没有在2D叠加着色器中使用法线。一旦我为所有输入添加了输出,并将它们一起转发到片段着色器,纹理就不再是黑色,但它在几分之一秒后仍然消失。这是因为我在渲染函数结束时调用glBindTexture(GL_TEXTURE_RECTANGLE,0),希望它能清理一些状态......这显然是错误的做法,因为删除该调用会导致2D纹理留在屏幕上。此外,使用GL_TEXTURE_RECTANGLE目标调用glBindTexture()似乎在纹理设置阶段起作用,但在渲染期间,GL_TEXTURE_RECTANGLE目标导致GL_INVALID_OPERATION错误。仅在渲染函数中将目标更改为GL_TEXTURE_2D会使错误消失,现在一切似乎都很好。