WebGL GLSL Shader:访问texture2D会覆盖其他纹理

时间:2012-05-14 20:50:01

标签: 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 vUv;

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

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

1 个答案:

答案 0 :(得分:7)

我在过去看到过类似的行为,而且几乎总是因为我不正确地绑定了我的纹理。最近的事件是在我尝试绑定我的纹理时引起的:

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邮件列表中最近讨论的主题)上出现错误,并且它似乎在有限的情况下工作,因此它很容易错误地认为它是有效的代码。

我不知道这是否是您的具体问题,但如果没有进一步的细节,这可能是我能提供的最佳建议。