2012-05-14 17 views
5

Tengo un problema muy preocupante con glsl en WebGL. funcionaWebGL GLSL Shader: el acceso a texture2D anula otra textura

Este sombreado como se esperaba:

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

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

Pero éste se comporta totalmente diferente:

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

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

Al acceder a la textura tNormal, la textura TColor se anula. ¿Cómo es esto posible?

+2

No debería ser posible. ¿Puedes poner tu código del lado del cliente (texturas, sombreadores, encuadernación, etc.) para asegurarte de que no hay nada incorrecto allí? – Tim

+0

¿En qué plataforma estás viendo esto? Chrome ANGLE/OpenGL, FF, Win, Mac, etc. ¿Y estás seguro de que tu textura de color no está vinculada a un objetivo de renderizado? – MikaelEmtinger

Respuesta

7

He visto un comportamiento similar en el pasado, y casi siempre es porque estoy vinculando mis texturas de forma incorrecta. El incidente más reciente se produjo cuando me trató de obligar a mis texturas de este 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); 

Cuando la sintaxis correcta es en realidad:

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! 

Esto es un error bastante común, y por desgracia no lo hace WebGL de hecho arrojar un error en el primer fragmento de código (un tema de discusión reciente en la lista de correo de WebGL) y puede parecer que funciona en casos limitados, por lo que es fácil pensar erróneamente que es un código válido.

No sé si este es su problema específico, pero es probablemente el mejor consejo que puedo proporcionar sin más detalles.

+2

nota: esta situación debería generar un error tanto en el último Chrome como en Firefox y ahora es parte de las pruebas de conformidad de WebGL – gman

+0

¡Esa es la solución, gracias! – Torsten

+0

¡Me alegro de que funcionó! @gman: ¡Eso es genial! Sé que se discutió, pero nunca escuché que realmente se implementó. – Toji