2012-05-14 12 views
5

WebGLのglslで非常に不安な問題があります。WebGL GLSLシェーダ:texture2Dにアクセスすると他のテクスチャがオーバーライドされます

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

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

をしかし、この1つは別の総振る舞い:

このシェーダは、期待どおりに動作

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

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

をtNormalテクスチャにアクセスすることにより、TColorのテクスチャが上書きされます。これはどのように可能ですか?

+2

できません。あなたのクライアント側のコード(テクスチャ、シェーダ、バインディングなど)を置いて、間違ったことがないことを確認できますか? – Tim

+0

あなたはこれをどのプラットフォームで見ていますか? ChromeのANGLE/OpenGL、FF、Win、Macなど?あなたのカラーテクスチャがレンダリングターゲットにバインドされていないことを確かめていますか? – MikaelEmtinger

答えて

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メーリングリストの最近の話題)にエラーが表示され、限られたケースでしか動作しないように見えることがあるので、誤って正しいコードであると考えるのは簡単です。

私はこれがあなたの特定の問題であるかどうかわかりませんが、それ以上の詳細なしで私が提供できる最良のアドバイスかもしれません。

+2

注:この状況では、最新のChromeとFirefoxの両方でエラーが発生し、WebGL適合テストの一部になります – gman

+0

これは解決策です。ありがとうございます! – Torsten

+0

うれしかった! @グマン:それは素晴らしいです!私は議論されたことを知っていますが、実際にそれが実装されたと聞いたことはありません。 – Toji

関連する問題