2011-07-12 11 views
7

Estoy desarrollando una aplicación OpenGL 2.1 usando sombreadores y estoy teniendo un problema con mi iluminación por fragmento. La iluminación es correcta cuando la escena se carga inicialmente, pero a medida que navego por la escena, la iluminación se mueve con la "cámara", en lugar de permanecer en una ubicación estática. Por ejemplo, si coloco mi luz hacia la derecha, se iluminará el lado derecho de los objetos. Si luego muevo la cámara al otro lado del objeto y apuntar en la dirección opuesta, la iluminación sigue estando en el lado derecho del objeto (en lugar de estar a la izquierda, como debería ser ahora). Supongo que estoy calculando la iluminación en el sistema de coordenadas incorrecto, y esto está causando el comportamiento incorrecto. Estoy cálculo de la iluminación de la siguiente manera ...sistema de coordenadas de iluminación por fragmento

En vertex shader ...

ECPosition = gl_ModelViewMatrix * gl_Vertex; 
WCNormal = gl_NormalMatrix * vertexNormal; 

donde vertexNormal es la normal en el espacio del objeto/modelo.

En el shader fragmento ...

float lightIntensity = 0.2; //ambient 
lightIntensity += max(dot(normalize(LightPosition - vec3(ECPosition)), WCNormal), 0.0) * 1.5; //diffuse 

donde LightPosition es, por ejemplo, (100,0, 10,0, 0,0), lo que pondría la luz en el lado derecho del mundo como se describe anteriormente. La parte de la que no estoy seguro es la parte gl_NormalMatrix. No estoy exactamente seguro de qué es esta matriz y de qué espacio de coordenadas pone mi normalidad (supongo que es espacio mundial). Si lo normal se pone en el espacio mundial, entonces pensé que el problema era que ECPosition está en el espacio visual mientras LightPosition y WCNormal están en el espacio mundial. Algo sobre esto no parece correcto, pero no puedo resolverlo. También traté de poner ECPosition en el espacio mundial y lo multipliqué por mi propia matriz de modelo que solo contiene las transformaciones que hago para llevar las coordenadas al espacio mundial, pero esto no funcionó. Avíseme si necesito proporcionar otra información sobre mis sombreadores o código.

Respuesta

6

gl_NormalMatrix transforma su normal en el espacio visual (vea this tutorial para más detalles).

Creo que para que tu luz esté en una posición estática en el mundo, deberías transformar tu LightPosition en espacio visual también multiplicándolo por tu matriz de visión actual.

+0

buen tutorial sobre gl_NormalMatrix. Lo entiendo ahora. Voy a tratar de transformar mi LightPosition en el espacio de los ojos y ver qué pasa. Buena sugerencia. – Nitrex88

+0

¡sí que funcionó! Tiene sentido ... gracias amigo! – Nitrex88

Cuestiones relacionadas