1

我从我的应用程序中观察到一个奇怪的行为,希望你能向我解释。你看,我有这两个 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.
4

2 回答 2

4

打电话glActiveTexture之前glBindTexture

glBindsTexture 绑定到当前活动纹理,因此在当前代码中,您首先将 id1 绑定到纹理 0,然后将其再次绑定到纹理 2,然后将 id2 绑定到纹理 2(替换 id1)等。

于 2012-05-07T14:06:43.457 回答
1

您不应该同时将 1D 和 3D 纹理绑定到同一个纹理单元。为避免这种情况,要么取消绑定 3D 纹理:glBindTexture()要么切换到新的纹理单元:vtkgl::ActiveTexture()在绑定 1D 纹理之前。

正如上面的海报所说,对的调用vtkgl::ActiveTexture()必须在相应的调用之前来glBindTexture()

于 2012-05-09T00:21:58.320 回答