我从我的应用程序中观察到一个奇怪的行为,希望你能向我解释。你看,我有这两个 3D 纹理被发送到片段着色器并且渲染得非常好。但是有一个问题,一旦我创建了另一个纹理(它是一个 1D 纹理),就会渲染一个黑屏,而不是之前的正确结果。
关于这个 1D 纹理,我什至没有将它发送到片段着色器。在我调用 glTexImage1D(...) 的那一刻,黑屏出现了。我评论了这条线,它就消失了!!两个纹理都被渲染了。
我认为纹理单元肯定存在某种问题。因为当我使用 gDebugger 运行应用程序时,3D 纹理之一的纹理单元与分配给 1D 纹理的纹理单元相同。
我没有为一维纹理分配任何纹理单元,我只是创建了它。显然纹理单元 GL_TEXTURE0 被自动分配给一维纹理。奇怪的是,虽然我使用 GL_TEXTURE2 和 GL_TEXTURE3 作为 3D 纹理,但其中一个由于调用 glTexImage1D 而被绑定到 GL_TEXTURE0!
这是 gDebugger 的纹理列表窗口的快照:
Texture 1 (unit 2 ,bound3d)-enabled Texture 2 (unit 0 ,bound1d) Texture 3 (unit 0 ,bound3d)-Enabled (unit 3,bound3D)-启用
为什么会这样?
问题不在于为什么将纹理 1D 绑定到 GL_TEXTURE0,而是为什么它会影响另一个已绑定纹理的状态。代码是这样的:。
...
// generating the first texture_3d
glTexImage(GL_TEXTURE_3D,....);
glBindTexture(GL_TEXTURE_3D,id1);
//render loop for the first texture_3d
GLuint glEnum = GL_TEXTURE2;
vtkgl::ActiveTexture(glEnum);
glBindTexture(vtkgl::TEXTURE_3D,id1);
program->setUniform("TEX1",2);
// generating the second texture_3d
glTexImage(GL_TEXTURE_3D,....);
glBindTexture(GL_TEXTURE_3D,id2);
//render loop for the first texture_3d
GLuint glEnum = GL_TEXTURE3;
vtkgl::ActiveTexture(glEnum);
glBindTexture(vtkgl::TEXTURE_3D,id2);
program->setUniform("TEX2",3);
// generating texture 1D
glTexImage(GL_TEXTURE_1D,....);
glBindTexture(GL_TEXTURE_1D,id3);
we expect GL_TEXTURE2 and GL_TEXTURE3 to be active but gDebugger indicates that GL_TEXTURE0 and GL_TEXTURE2 are active.