2012-05-14 14 views
5

Ich habe ein sehr störendes Problem mit Glsl in WebGL.WebGL GLSL Shader: Zugriff auf Textur2D überschreibt andere Textur

Dieser Shader funktioniert wie erwartet:

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

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

Aber dieses verhält sich total anders:

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

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

Durch die tNormal Textur zugreift, wird die TColor Textur außer Kraft gesetzt. Wie ist das möglich?

+2

Sollte nicht möglich sein. Kannst du deinen clientseitigen Code (Texturen, Shader, Binding usw.) aufstellen, um sicherzustellen, dass dort nichts falsch läuft? – Tim

+0

Auf welcher Plattform sehen Sie das? Chrome ANGLE/OpenGL, FF, Win, Mac usw.? Und bist du sicher, dass deine Farbtextur nicht an ein Renderziel gebunden ist? – MikaelEmtinger

Antwort

7

Ich habe ähnliches Verhalten in der Vergangenheit gesehen, und es ist fast immer, weil ich meine Texturen nicht ordnungsgemäß binde. Das jüngste Ereignis verursacht wurde, als ich versuchte, meine Texturen zu binden, etwa so:

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

Wenn die korrekte Syntax tatsächlich ist:

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! 

Dies ist ein recht häufiger Fehler, und leider WebGL nicht tatsächlich einen Fehler auf das erste Code-Snippet werfen (ein Thema der letzten Diskussion in der WebGL-Mailing-Liste) und es kann scheinen, in begrenzten Fällen zu funktionieren, so dass es leicht ist, fälschlicherweise zu denken, dass es ein gültiger Code ist.

Ich weiß nicht, ob das Ihr spezifisches Problem ist, aber es ist wahrscheinlich der beste Rat, den ich ohne weitere Details geben kann.

+2

Hinweis: Diese Situation sollte sowohl im neuesten Chrome als auch in Firefox einen Fehler erzeugen und ist nun Bestandteil der WebGL-Konformitätstests – gman

+0

Das ist die Lösung, danke! – Torsten

+0

Froh, es hat funktioniert! @gman: Das ist großartig! Ich weiß, dass es diskutiert wurde, aber ich habe nie gehört, dass es tatsächlich umgesetzt wurde. – Toji