vec4 para multiplicación vec3 mientras se calcula el valor especular

Estoy siguiendo este tutorial para calcular el color especular de un vértice.

Uso OpenGL 2.1 con GLSL versión 120.

Esta es la fórmula que aplico:

espec = (R * ojo) ^ s * Ls * Lm

Con:

L = vértice de luz del vector de dirección;
N = vector normal;
ojo = vector de dirección vértice-ojo;
R = -2N * (L * N) + L;

Ahora el problema es que siguiendo este path necesito multiplicar un vec3 por un vec4.

Esto es lo que traté de hacer:

vec4 L= normalize(gl_LightSource[0].position - gl_Position); vec3 N= normalize (gl_NormalMatrix * gl_Normal); vec4 eye= normalize(-gl_Position); vec4 R= -2.0*N*(L*N)+L; // Syntax error: N is a vec3 vec4 spec= (R*eye)* gl_LightSource[0].specular; 

No obtendría un resultado vec3 al calcular el valor especular, este valor ignoraría el valor alfa. ¿Cómo voy alnetworkingedor de esto?

Tiene que ser un vec3 porque el 4º componente de las coorderadas homogéneas solo se usa para transformaciones 3D. Si los usa por ejemplo dot productos, es probable que contaminen el resultado final.

Hablando de productos dot, R*eye probablemente esté equivocado; quieres dot(R,eye) lugar.

Además, el producto escalar debe estar saturado para evitar valores negativos.

Este código debería funcionar mejor:

 vec3 L = normalize(gl_LightSource[0].position.xyz - gl_Position.xyz); vec3 N = normalize((gl_NormalMatrix * gl_Normal).xyz); vec3 eye = normalize(-gl_Position.xyz); vec3 R = -2.0 * N * max(dot(L, N), 0.0) + L; vec3 spec = max(dot(R, eye), 0.0) * gl_LightSource[0].specular.rgb; 

Finalmente, la potencia especular (a veces llamada shininess ) debe aplicarse al dot(R, eye) antes de multiplicarse por el color especular, por lo que algo como esto:

 vec3 spec = pow(max(dot(R, eye), 0.0), shininess) * gl_LightSource[0].specular.rgb;