片段着色器如何在单个纹理单元中使用sample1D和sample2D?

时间:2014-02-05 23:01:45

标签: textures glsl

我正在使用仅使用默认纹理单元GL_TEXTURE0的OpenGL客户端代码。它永远不会创建纹理,因此它始终引用默认纹理名称0.在发出绘图命令时,如果需要新纹理,则会动态创建它 - GL_TEXTURE_1D或GL_TEXTURE_2D。

我的理解是1D和2D纹理都将引用相同的单位= 0.根据使用的纹理 - 1D或2D - 我将统一标志传递给着色器,以便它知道如何处理纹理

我还在片段着色器中定义了sampler1D和sampler2D。我将单位0分配给两者 - 至少,这是我对我应该做的事情的理解。

在片段着色器中,我使用代码

  uniform sampler1D texture1;
  uniform sampler2D texture2;
  uniform int texflagf;
  void main()
  {
 if(texflagf == 1) {
        gl_FragColor = texture1D(texture1, gl_TexCoord[0].s);
 } else if(texflagf == 2) {
        gl_FragColor = texture2D(texture2, gl_TexCoord[0].st);
 } else {
    gl_FragColor = gl_Color;
 }
  }

其中texflagf取值0,1和2,具体取决于我是在没有纹理的情况下绘制,使用1D纹理还是使用2D纹理。请注意,在两者中我使用gl_TexCoord [0],因为只有一个单元是活动的。顶点着色器只是通过这些TexCoords:

gl_TexCoord[0] = gl_MultiTexCoord0;

1)我看到的是,如果我第一次绘制一维纹理,则不会显示二维纹理;反之亦然。为什么呢?

2)客户端代码通过代码

分配单元
     tex1Dloc = glGetUniformLocation(prog,"texture1");
     glUniform1i (tex1Dloc,0);
     tex2Dloc = glGetUniformLocation(prog,"texture2");
     glUniform1i (tex2Dloc,0);

这表明我将单位设置为1D和2D纹理为0。

如果我现在将tex2Dloc设置为单元1 - 即使整个代码中没有对GL_TEXTURE1的引用! - 这似乎有效。但我甚至从未在顶点着色器中传递单元1的纹理坐标,仍然在sampler1D和sampler2D中访问gl_TexCoord [0]。

我不明白为什么将其中一个采样器设置为不同的(不存在的!)单元。

有人可以向我解释这里发生了什么吗?

感谢。

0 个答案:

没有答案