Iluminación Phong: hay algo muy extraño con la iluminación especular

17

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:

ingrese la descripción de la imagen aquí

Segundo:

ingrese la descripción de la imagen aquí

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?

Aleksander Alekseev
fuente
2
Hay una pila de gráficos de computadora que puede encontrar mejores respuestas con esta pregunta.
Andrew Wilson

Respuestas:

34

iluminación especular de luz direccional

más área tiene iluminación especular cuando la cámara está lejos de un objeto

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

Sunglint sobre el lago

http://academic.emporia.edu/aberjame/remote/lec10/lec10.htm

Ejemplo 2: área de sunglint aproximada a los Grandes Lagos

Sunglint sobre los Grandes Lagos

http://earthobservatory.nasa.gov/IOTD/view.php?id=78617

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.

congusbongus
fuente
1
Amo los ejemplos de la vida real, responde a una pregunta de programación
defhlt
maldita sea, me hiciste crear una cuenta solo para votar.
Spongman