Pregunta

Trato de poner en práctica las luces puntuales en OpenGL con GLSL. Puedo enviar todos los datos requeridos a los shaders. Por simplicidad sólo utilizo la luz difusa aquí.

Mi ejemplo muestra un enorme triángulo que quiero iluminar con una sola fuente de luz. La fuente de luz se muestra como un pequeño triángulo azul.

Para la luz difusa que necesito saber el ángulo entre la luz y la superficie. Por lo tanto, puedo calcular las normales y la dirección de la luz. El punto-producto será entonces dame un número entre -1 y 1, mientras que todo lo que entre 0 y 1 se ilumina.

Sin embargo, aquí estoy atascado debido a este ángulo se calcula incorrectamente en mi ejemplo. Dado que es difícil de shaders de depuración, he utilizado varias salidas como el color de mi superficie. He utilizado el normal, como el color del triángulo y donde la luz era, la superficie estaba siempre verde. Es decir, los puntos normales hasta el eje Y y por lo tanto se calculan derecha. Es decir, la dirección de la luz debe estar mal. Sin embargo, no puedo encontrar la razón por la que es un error. La posición de la luz y la posición de vértice' se pasan en el espacio mundo para el shader de vértice, que luego los transforma al espacio ojo, calcular la dirección de la luz y pasar esta a la shader fragmento:

vértice shader:

vec4 pos = modelview_matrix * <input vertex>;
vec4 lightPos = modelview_matrix * <light position>;

vec3 lightDir = normalize(lightPos.xyz - pos.xyz);

fragmento shader:

float NdotL = max(dot(normalize(<correct normal>), normalize(lightDir)), 0.0);
gl_FragColor = vec4(1.0, NdotL, 0.0, 1.0);

He adjuntas algunas fotos de este ejemplo, que sin duda demuestran, que la interpolación es muy raro. Sé que quiero saber si el código Pegué es correcta o si necesita saber más del código. Por otra parte, este comportamiento es la interpolación normal o es un error en mi código?

http://img41.imageshack.us/img41/3566/interpolation.png http://img189.imageshack.us/img189/3566/interpolation.png

Sobre todo la primera imagen muestra que el punto central de la luz es no directamente bajo la luz, pero poco se trasladó al centro del triángulo.

Si paso "pos" al fragment shader (es decir, que se interpola) y después calcular "lightDir" en el fragment shader, todo funciona bien.

¿Fue útil?

Solución

Creo que la normalización de su lightDir en el vertex shader afecta el resultado que se obtiene cuando la interpolación de los vectores, ya que toma la longitud de la ecuación y por lo tanto afecta a la "velocidad" de la interpolación.

Si desea una explicación (visual), trata de dibujar en 2D en papel. Primero dibuja una línea (el triángulo) y un punto (fuente de luz). Añadir dos líneas (lightDir) para ambos extremos de la línea a la fuente de luz y luego reducir el tamaño (normalizar) esas líneas lightDir para que tengan la misma longitud y ambos se encuentran en la fuente de luz. Si conecta los dos extremos de las líneas lightDir normalizados obtendrá una línea no paralela (si la fuente de luz no está exactamente en el centro de su primera línea). Ahora bien, si se traza una línea que pasa exactamente por el centro de una de las líneas verá que no pasa por el medio de la otra línea, pero llegará un poco hacia la izquierda o hacia la derecha.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top