Implementé la iluminación de Phong. Todo parece funcionar: el toro y las esferas se iluminan como se esperaba, etc. Pero noto algo extraño con respecto a la iluminación especular de luz direccional.
Aquí hay dos capturas de pantalla.
Primero:
Segundo:
Como puede ver, más áreas tienen iluminación especular cuando la cámara está lejos de un objeto.
Aquí están los sombreadores de vértices simplificados:
#version 330 core
layout(location = 0) in vec3 vertexPos;
layout(location = 1) in vec3 vertexNorm;
layout(location = 2) in vec2 vertexUV;
uniform mat4 MVP;
uniform mat4 M;
out vec2 fragmentUV;
out vec3 fragmentNormal;
out vec3 fragmentPos;
void main() {
fragmentUV = vertexUV;
fragmentNormal = (M * vec4(vertexNorm, 0)).xyz;
fragmentPos = (M * vec4(vertexPos, 1)).xyz;
gl_Position = MVP * vec4(vertexPos, 1);
}
... y fragment shader:
#version 330 core
in vec2 fragmentUV;
in vec3 fragmentNormal;
in vec3 fragmentPos;
struct DirectionalLight {
vec3 Color;
vec3 Direction;
float AmbientIntensity;
float DiffuseIntensity;
};
uniform sampler2D textureSampler;
uniform vec3 cameraPos;
uniform float materialSpecularFactor;
uniform float materialSpecularIntensity;
uniform DirectionalLight directionalLight;
out vec4 color;
void main() {
vec3 normal = normalize(fragmentNormal); // should be normalized after interpolation
vec4 ambientColor = vec4(directionalLight.Color, 1) * directionalLight.AmbientIntensity;
float diffuseFactor = clamp(dot(normal, -directionalLight.Direction), 0, 1);
vec4 diffuseColor = vec4(directionalLight.Color, 1) * directionalLight.DiffuseIntensity * diffuseFactor;
vec3 vertexToCamera = normalize(cameraPos - fragmentPos);
vec3 lightReflect = normalize(reflect(directionalLight.Direction, normal));
float specularFactor = pow(clamp(dot(vertexToCamera, lightReflect), 0, 1), materialSpecularFactor);
vec4 specularColor = vec4(directionalLight.Color, 1) * materialSpecularIntensity * specularFactor;
color = texture(textureSampler, fragmentUV) * (ambientColor + diffuseColor + specularColor);
}
El código fuente completo sin ninguna simplificación se puede encontrar en este repositorio .
Quería saber si implementé algo mal. ¿O está bien para la iluminación Phong?
Respuestas:
Sí, me parece bien.
Se supone que el área especular para las luces direccionales es más o menos constante con respecto a la cámara, dada la misma superficie de reflexión. Para comparar, podemos observar el fenómeno conocido como sunglint , que es básicamente un reflejo especular del Sol sobre el agua, y dado que el Sol es aproximadamente una fuente de luz direccional para fines terrestres, y la superficie de reflexión es la Tierra, que es aproximadamente plana, Este es un buen análogo de su iluminación Phong.
Ejemplo 1: área de sunglint aproximadamente igual a un lote residencial
Ejemplo 2: área de sunglint aproximada a los Grandes Lagos
De hecho, el área de Sunglint seguirá agrandándose hasta que esté lo suficientemente lejos de la Tierra para que sea más redonda que plana, desde su perspectiva.
En términos del modelo de reflexión de Phong, el especular depende de tres direcciones: el ojo, la luz y la superficie. Dado que su cámara está mirando a la misma superficie, simplemente alejándose, el ojo permanece igual; la superficie permanece igual en virtud de ser plana, y la luz permanece igual por definición (es una luz direccional), por lo tanto, la reflexión especular será la misma, desde la perspectiva de la cámara / pantalla, por supuesto.
fuente