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
,你在这里就安全了。但是,您访问的不是不完整的纹理。
制服默认初始化为零。因此,texture1
和 texture2
最初都将引用纹理单元 GL_TEXTURE0
。如果您第一次使用 texture2
时碰巧使用该单元,那么 texture1
采样器最终将访问相同的纹理。
如果我有一个使用两个纹理的着色器,并且其中一个未设置用于前几次绘制(因为我通过网络获取它),程序将使用第二个纹理进行第一次绘制一,而不是从默认黑色采样。
例如,如果我的片段着色器是:
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
,你在这里就安全了。但是,您访问的不是不完整的纹理。
制服默认初始化为零。因此,texture1
和 texture2
最初都将引用纹理单元 GL_TEXTURE0
。如果您第一次使用 texture2
时碰巧使用该单元,那么 texture1
采样器最终将访问相同的纹理。