当前位置: 首页 > 知识库问答 >
问题:

OpenGl纹理单元

冯皓
2023-03-14

“我在我的申请中发现了一个奇怪的行为,希望你能解释给我听。”。你看,我有两个3D纹理,它们被发送到片段着色器,渲染得非常好。但有一个问题,当我创建另一个纹理(它是1D纹理)时,一个黑屏正在被渲染,而不是正确的前一个结果。

关于这个1D纹理,我甚至没有将其发送到片段着色器。当我调用glTexImage1D(…)时,黑屏就出现了。我评论这句话,它就消失了!!这两种纹理被渲染。

我觉得纹理单位肯定有问题。因为当我使用gDebugger运行应用程序时,其中一个3D纹理的纹理单元与指定给1D纹理的纹理单元相同。

我没有为1D纹理指定任何纹理单元,我只是创建了它。显然,纹理单元GL_TEXTURE0被自动指定给1D纹理。奇怪的是,虽然我在3D纹理中使用了GL_TEXTURE2和GL_TEXTURE3,但其中一个被绑定到了GL_TEXTURE0,这是调用glTexImage1D!

以下是gDebugger的纹理列表窗口中的快照:

纹理1(单元2,边界3D)-启用纹理2(单元0,边界1D)纹理3(单元0,边界3D)-启用(单元3,边界3D)-启用

为什么会发生这种情况?

问题不在于纹理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.

共有2个答案

东郭骁
2023-03-14

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

正如上面的海报所述,对vtkgl::ActiveTexture()的调用必须先于对glBindTexture()的相应调用。

袁山
2023-03-14

glBindTexture

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

 类似资料:
  • 最近我发现了一个OpenGL示例,它应用纹理而没有指定纹理图像单元并且没有将相应的单元整数均匀发送到着色器中,是否可以在不使用纹理单元的情况下应用纹理??或者它只是为活动纹理单元及其着色器采样器值使用默认值。 我的代码块(纹理相关): 我的片段着色器:

  • 我有一个用于OpenGL中模型渲染的纹理数组。此数组包含漫反射和镜面纹理。由于某些网格没有镜面纹理,因此我在每次渲染后简单地将NULL纹理绑定到我的镜面采样器,并且只有当网格具有镜面纹理时,我才绑定一个。但是,我仍然在没有镜面纹理的网格上看到镜面纹理。 这是我的渲染代码 材质索引保存数组中纹理的索引,如果网格没有镜面纹理 索引为-1 纹理单元0用于漫反射 纹理单元2用于镜面

  • 所以最近我开始阅读OpenGL维基文章。这就是我在这里描述OpenGL纹理的方式。不过,有几点尚不清楚。 以下陈述是真的、假的还是视情况而定? 将两个纹理绑定到同一个纹理单元是不可能的。 将两个采样器绑定到同一个纹理单元是不可能的。 将一个纹理绑定到两个不同的纹理单元是不可能的。 将一个采样器绑定到两个不同的纹理单元是不可能的。 应用程序有责任明确将什么采样器类型传递给什么统一变量。 着色器程序有

  • 在andrid上的opengl es中,当我将两个纹理相邻放置时,会有一个轻微的接缝,可以看到它们后面绘制的对象。基本上看起来是一个小差距。我把范围缩小到了地图上 glTexParameteri(GL_纹理_2D、GL_纹理_最小过滤器、GL_线性_MIPMAP_线性);glTexParameteri(GL_纹理_2D、GL_纹理_MAG_过滤器、GL_线性); 如果我将它们都设置为距接缝最近的G

  • 假设我有一个金字塔…我知道如何绘制它,我知道如何为整个金字塔设置纹理,但如何为每面墙设置不同的纹理? 我通过在 我试图通过添加<code>GL11.glBindTexture(GL11.GL_TEXTURE_2D,TEXTURE.getTextureID())来绑定纹理 后,但

  • 好的,所以我需要创建我自己的纹理/图像数据,然后在OpenGL中将它显示到一个四边形上。我让四边形工作,我可以用我自己的纹理加载器在上面显示一个TGA文件,它完美地映射到四边形。 但是我如何创建自己的“自制图像”,即每个像素1000x1000和3个通道(RGB值)?纹理数组的格式是什么,例如如何将像素(100,100)设置为黑色? 这就是我对完全白色的图像/纹理的想象: 编辑:下面的答案是正确的,