WebGL GLSL着色器:访问texture2D将覆盖其他纹理

WebGL GLSL着色器:访问texture2D将覆盖其他纹理,glsl,textures,shader,webgl,Glsl,Textures,Shader,Webgl,我对WebGL中的glsl有一个非常令人不安的问题 此着色器按预期工作: uniform sampler2D tColor; uniform sampler2D tNormal; varying vec2 vUv; void main() { gl_FragColor = texture2D( tColor, vUv ); } 但这一个表现完全不同: uniform sampler2D tColor; uniform sampler2D tNormal; varying vec2 v

我对WebGL中的glsl有一个非常令人不安的问题

此着色器按预期工作:

uniform sampler2D tColor;
uniform sampler2D tNormal;
varying vec2 vUv;

void main() {
    gl_FragColor = texture2D( tColor, vUv );
}
但这一个表现完全不同:

uniform sampler2D tColor;
uniform sampler2D tNormal;
varying vec2 vUv;

void main() {
    vec4 test = texture2D( tNormal, vUv );
    gl_FragColor = texture2D( tColor, vUv );
}

通过访问tNormal纹理,tColor纹理将被覆盖。这怎么可能呢?

我在过去也见过类似的行为,几乎都是因为我绑定的纹理不正确。最近的一次事件是我试图像这样绑定纹理时引起的:

gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, colorTexture);
gl.uniform1i(colorUniform, gl.TEXTURE0);

gl.activeTexture(gl.TEXTURE1);
gl.bindTexture(gl.TEXTURE_2D, normalTexture);
gl.uniform1i(normalUniform, gl.TEXTURE1);
当正确的语法实际上是:

gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, colorTexture);
gl.uniform1i(colorUniform, 0); // 0 to indicate texture unit 0!

gl.activeTexture(gl.TEXTURE1);
gl.bindTexture(gl.TEXTURE_2D, normalTexture);
gl.uniform1i(normalUniform, 1); // 1 to indicate texture unit 1!
这是一个相当常见的错误,不幸的是,WebGL实际上并没有在第一个代码段(WebGL邮件列表中最近讨论的主题)上抛出错误,而且它似乎在有限的情况下工作,因此很容易错误地认为它是有效的代码


我不知道这是否是您的具体问题,但这可能是我能提供的最好建议,无需进一步详细说明。

不可能。您是否可以设置客户端代码(纹理、着色器、绑定等),以确保没有错误发生?您在哪个平台上看到这一点?Chrome ANGLE/OpenGL、FF、Win、Mac等。?你确定你的颜色纹理没有绑定到渲染目标吗?注意:这种情况应该会在最新的Chrome和Firefox中产生错误,并且现在是WebGL一致性测试的一部分@格曼:太好了!我知道有人讨论过这个问题,但我从来没有听说它实际上得到了实施。