Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con iluminacion en vertex shader GLSL

Iniciado por kanc, 27 de Mayo de 2014, 12:58:18 AM

« anterior - próximo »

kanc

Buenas,

Estoy empezando mis pinitos con los shaders y ando enfrascado con la iluminacion. Ahora mismo todo parece que se corrrectamente excepto por el brillo especular, no se me ve nada de nada.

Os pongo el codigo del shader para ver si entre mas ojos vemos el problema porque ya no se tocar y con esto de que los shaders no se pueden debugear...

tanto las luces como la camara tienen la posicion en espacio de escena.


#version 330 core

#define MAX_LIGHTS 8

uniform mat4 MVP;
uniform mat4 M;
uniform vec3 eyePos;
uniform bool lightingEnabled;
uniform bool lightEnabled[MAX_LIGHTS];
uniform bool perPixelLighting;
uniform vec4 lightVec[MAX_LIGHTS];
uniform vec3 lightColor[MAX_LIGHTS];
uniform float lightAtt[MAX_LIGHTS];
uniform vec3 diffuse;
uniform vec3 ambient;
uniform int shininess;

in vec3 vpos;
in vec3 vnormal;
in vec2 vuv;
out vec2 fuv;
out vec4 fcolor;

void main()
{
//definimos el color por defecto (difuso de la malla y ambiente)
fcolor = vec4( vec3(diffuse * ambient),1);

if (lightingEnabled == true)
{
vec3 combinedSpecular = vec3(0,0,0);
vec3 combinedLights = ambient;

for (int i = 0; i < MAX_LIGHTS; i++)
{
if (lightEnabled[i] == true)
{
//obtenemos la normal del vertice en espacio de la escena
vec3 N = normalize(M * vec4(vnormal,1)).xyz;
vec3 L = lightVec[i].xyz;
float attenuation = 1;

//obtenemos el vector desde la fuente de luz al vertice
L = (vec4(L,1) - (M * vec4(vpos,1))).xyz;

//si es luz puntual calculamos la atenuacion
if (lightVec[i].w == 1)
{
float distance = length(L);
attenuation = 1.0 / (1.0 + lightAtt[i] * distance + 0.01 * distance * distance);
}

//calculamos el coseno del angulo que forman la luz sobre el vertice y la normal
float NDotL = max (0.0, dot (N, normalize(L)));

//acumulamos el valor de iluminacion
combinedLights+= NDotL * lightColor[i] * attenuation;

//si hay brillo y nos afecta la incidencia de la luz en ese vertice (angulo < 90)
if (shininess > 0 &&  NDotL > 0)
{
//calculamos el vector desde la posicion de la camara hasta el vertice
vec3 SceneEyePos = ( (M * vec4(vpos,1)) - vec4(eyePos,1)).xyz;

//hayamos el vector intermedio entre la luz y la camara
vec3 H = normalize(SceneEyePos - L);
float NDotH = dot(N, H);

combinedSpecular+= max (0.0, pow(NDotH, shininess) * attenuation);
combinedSpecular+= max (0.0, pow(NDotH, shininess) * attenuation);

}
}
}

fcolor = vec4( vec3(diffuse * combinedLights + combinedSpecular),1);

}
gl_Position = MVP * vec4(vpos, 1);
fuv = vuv;
}


¿en que he podido metido la pata?

saludos y gracias

PIM

#1
Hola. Veo que todo los estás calculando por vértice y no por fragmento. Si te sirve de algo, te pongo en enlace del modelo de iluminación que uso en mi motor. Este manual es en glsl en versión 2.0, pero no creo que te sea muy difícil pasarlo a la versión que usas.

http://zach.in.tu-clausthal.de/teaching/cg_literatur/glsl_tutorial/

Es sencillo y ojalá te ayude a resolver tu problema.

Saludos.
:D






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.