5

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 テクスチャがオーバーライドされます。これはどのように可能ですか?

4

1 に答える 1

8

過去に同様の動作を見たことがありますが、ほとんどの場合、テクスチャを不適切にバインドしていることが原因です。最新のインシデントは、テクスチャを次のようにバインドしようとしたときに発生しました。

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 メーリング リストでの最近の議論の主題)。有効なコードであること。

これがあなた固有の問題かどうかはわかりませんが、これ以上の詳細がなくても、私が提供できる最善のアドバイスです。

于 2012-05-14T22:54:40.630 に答える