openGL unattached texture指的是其他纹理

时间:2016-10-06 19:04:22

标签: opengl textures

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

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

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采样,而不是从默认的空纹理采样。那是为什么?

1 个答案:

答案 0 :(得分:3)

  

而不是从默认的黑色

采样

没有“黑色默认纹理”这样的东西。 sampler类型不引用GLSL中的纹理,而是纹理单位。所以要么有一些完整的纹理绑定到纹理单元的(匹配目标),要么没有。

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

<强>更新

从不完整的纹理中采样时,样本操作的返回值将只是未定义

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

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