如果我使用了两个纹理的着色器,并且其中一个未设置为前几个绘图(因为我通过网络获取它),程序将使用第二个纹理第一个,而不是从默认黑色中采样。
例如,如果我的片段着色器是:
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
采样,而不是从默认的空纹理采样。那是为什么?
答案 0 :(得分:3)
而不是从默认的黑色
采样
没有“黑色默认纹理”这样的东西。 sampler
类型不引用GLSL中的纹理,而是纹理单位。所以要么有一些完整的纹理绑定到纹理单元的(匹配目标),要么没有。
正如Andon M. Coleman在评论中所指出的,概念上没有办法没有纹理绑定,因为纹理对象0指的是GL中的有效纹理对象,即默认纹理对象。但最初并不包含任何图像数据,所以它只是不完整。
<强>更新强>
从不完整的纹理中采样时,样本操作的返回值将只是未定义。
实际上,正如Reto Koradi在评论中指出的那样,GL中不完整纹理的采样是明确定义的。它将产生(0,0,0,1)。但是,在不完整的纹理上使用texelFetch
时,结果将是未定义的(除非上下文是使用robust buffer access behavior创建的。)
但是既然你使用了texture2D
,那么你在这里会很安全。但是,您没有访问不完整的纹理。
默认情况下,制服初始化为零。因此,texture1
和texture2
最初都会引用纹理单元GL_TEXTURE0
。如果您在第一次使用texture2
时碰巧使用该单位,那么texture1
采样器将最终访问相同的纹理。