2012-05-14 17 views
5

WebGL'de glsl ile ilgili çok rahatsız edici bir sorunum var.WebGL GLSL Shader: texture2D'ye erişmek diğer dokuları geçersiz kılar

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

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

Ama bu farklı toplam davranır:

Bu gölgelendirici beklendiği gibi çalıştığını

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

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

tNormal dokusunu erişerek, TColor doku geçersiz kılınır. Bu nasıl mümkün olabilir?

+2

Mümkün değil. Orada yanlış bir şey olmadığından emin olmak için müşteri yan kodunuzu (dokular, gölgelendiriciler, ciltleme vb.) Koyabilir misiniz? – Tim

+0

Bunu hangi platformda görüyorsunuz? Chrome ANGLE/OpenGL, FF, Win, Mac vb. Ve renk yapınızın bir render hedefine bağlı olmadığından emin misiniz? – MikaelEmtinger

cevap

7

Geçmişte benzer davranışlar gördüm ve neredeyse her zaman dokularmı yanlış bir şekilde bağladığımdan.

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); 

doğru sözdizimi aslında olduğunda::

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! 

Bu oldukça yaygın bir hatadır ve WebGL yok ne yazık ki şöyle benim dokular bağlamak çalışırken en son olay neden oldu Aslında ilk kod snippet'inde (WebGL postalama listesindeki son tartışmanın konusu) bir hata atıyor ve sınırlı durumlarda çalışabiliyor gibi görünebilir, bu yüzden yanlışlıkla geçerli bir kod olduğunu düşünmek kolaydır.

Bu sizin özel sorununuz olup olmadığını bilmiyorum, ancak muhtemelen daha fazla ayrıntı vermeden verebileceğim en iyi tavsiyedir.

+2

not: Bu durum hem en yeni Chrome hem de Firefox'ta bir hata oluşturmalı ve şimdi WebGL uygunluk testlerinin bir parçası olmalıdır – gman

+0

Çözüm budur, teşekkürler! – Torsten

+0

Çalıştığına sevindim! @gman: Bu harika! Bunun tartışıldığını biliyorum ama aslında uygulandığını hiç duymadım. – Toji