2012-05-14 16 views
5

Ho un problema molto fastidioso con glsl in WebGL.WebGL GLSL Shader: l'accesso a texture2D ha la precedenza su altre texture

Questa dello shader funziona come previsto:

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

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

Ma questo comporta totalmente diverso:

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

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

Accedendo la texture tNormal, la trama TColor viene ignorata. Com'è possibile?

+2

Non dovrebbe essere possibile. Puoi inserire il tuo codice cliente (trame, shader, rilegatura, ecc.) Per assicurarti che non ci sia nulla di sbagliato nel farlo? – Tim

+0

Su quale piattaforma vedi questo? Chrome ANGLE/OpenGL, FF, Win, Mac ecc.? E sei sicuro che la struttura del tuo colore non sia legata a un bersaglio di rendering? – MikaelEmtinger

risposta

7

Ho visto un comportamento simile in passato, ed è quasi sempre perché lego le mie trame in modo improprio. L'incidente più recente è stato causato quando ho tentato di legare le mie trame in questo modo:

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

Quando la sintassi corretta è in realtà:

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! 

Questo è un errore abbastanza comune, e purtroppo non lo fa WebGL effettivamente lancia un errore sul primo frammento di codice (oggetto di una discussione recente nella mailing list WebGL) e può sembrare che funzioni in casi limitati, quindi è facile pensare erroneamente che sia un codice valido.

Non so se questo è il tuo problema specifico, ma è probabilmente il miglior consiglio che posso fornire senza ulteriori dettagli.

+2

nota: questa situazione dovrebbe generare un errore in entrambi i più recenti Chrome e Firefox ed è ora parte dei test di conformità WebGL – gman

+0

Questa è la soluzione, grazie! – Torsten

+0

Felice che abbia funzionato! @gman: È fantastico! So che è stato discusso, ma non ho mai sentito che sia stato effettivamente implementato. – Toji

Problemi correlati