我对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纹理。这怎么可能?
答案 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邮件列表中最近讨论的主题)上出现错误,并且它似乎在有限的情况下工作,因此它很容易错误地认为它是有效的代码。
我不知道这是否是您的具体问题,但如果没有进一步的细节,这可能是我能提供的最佳建议。