Tor*_*ten 5 shader textures glsl webgl
我对WebGL中的glsl有一个非常令人不安的问题.
此着色器按预期工作:
uniform sampler2D tColor;
uniform sampler2D tNormal;
varying vec2 vUv;
void main() {
gl_FragColor = texture2D( tColor, vUv );
}
Run Code Online (Sandbox Code Playgroud)
但是这个表现完全不同:
uniform sampler2D tColor;
uniform sampler2D tNormal;
varying vec2 vUv;
void main() {
vec4 test = texture2D( tNormal, vUv );
gl_FragColor = texture2D( tColor, vUv );
}
Run Code Online (Sandbox Code Playgroud)
通过访问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);
Run Code Online (Sandbox Code Playgroud)
当实际的语法正确时:
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!
Run Code Online (Sandbox Code Playgroud)
这是一个相当常见的错误,遗憾的是WebGL实际上并没有在第一个代码片段(WebGL邮件列表中最近讨论的主题)上出现错误,并且它似乎在有限的情况下工作,因此很容易误认为它是有效的代码.
我不知道这是否是您的具体问题,但如果没有进一步的细节,这可能是我能提供的最佳建议.