openGL unattached texture 引用其他纹理

openGL unattached texture refers to other texture

如果我有一个使用两个纹理的着色器,并且其中一个未设置用于前几次绘制(因为我通过网络获取它),程序将使用第二个纹理进行第一次绘制一,而不是从默认黑色采样。

例如,如果我的片段着色器是:

uniform sampler2D texture1;
uniform sampler2D texture2; // this is a color filter

varying mediump vec2 v_textureCoordinate;

void main() {
  mediump vec3 rgb = texture2D(texture1, v_textureCoordinate);
  rgb.r = texture2D(texture2, vec2(rgb.r, 0.5).r);

  gl_FragColor = vec4(rgb, 1.0);
}

并且我在设置 texture2 之后和设置 texture1 之前使用它,从 texture1 采样将从 texture2 采样,而不是从默认的空纹理采样.这是为什么?

instead of sampling from a default black

没有 "black default texture" 这样的东西。 sampler 类型不引用 GLSL 中的纹理,而是纹理 units。因此,要么有一些完整的纹理绑定到该纹理单元的(匹配目标),要么没有。

正如 Andon M. Coleman 在评论中指出的那样,从概念上讲,没有纹理绑定是不可能的,因为纹理对象 0 指的是 GL 中的有效纹理对象,即默认纹理对象。但它最初不包含任何图像数据,所以它只是不完整。

更新

从不完整的纹理中采样时,采样操作的 return 值将只是 undefined.

实际上,正如 Reto Koradi 在评论中指出的那样,从不完整的纹理中采样在 GL 中有明确的定义。它将产生 (0,0,0,1)。但是,当在不完整的纹理上使用 texelFetch 时,结果将是未定义的(除非上下文是使用 robust buffer access behavior 创建的)。

但是既然你使用了texture2D,你在这里就安全了。但是,您访问的不是不完整的纹理。 制服默认初始化为零。因此,texture1texture2 最初都将引用纹理单元 GL_TEXTURE0。如果您第一次使用 texture2 时碰巧使用该单元,那么 texture1 采样器最终将访问相同的纹理。