Illuminazione Phong - c'è qualcosa di molto strano nell'illuminazione speculare


17

Ho implementato l'illuminazione Phong. Tutto sembra funzionare - il toro e le sfere sono illuminati come previsto, ecc. Ma noto qualcosa di strano riguardo all'illuminazione speculare della luce direzionale.

Ecco due schermate.

Primo:

inserisci qui la descrizione dell'immagine

Secondo:

inserisci qui la descrizione dell'immagine

Come puoi vedere più area ha un'illuminazione speculare quando la fotocamera è lontana da un oggetto.

Ecco uno shader di vertici semplificato:

#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);
}

... e frammento 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);
}

Il codice sorgente completo senza alcuna semplificazione può essere trovato in questo repository .

Volevo sapere se ho implementato qualcosa di sbagliato. O va bene per l'illuminazione Phong?


2
C'è una pila di computer grafica che potresti trovare risposte migliori con questa domanda.
Andrew Wilson,

Risposte:


34

illuminazione speculare della luce direzionale

più area ha illuminazione speculare quando la fotocamera è lontana da un oggetto

Sì, mi sembra giusto.

L'area speculare per le luci direzionali dovrebbe essere più o meno costante rispetto alla telecamera, data la stessa superficie di riflessione. Per fare un confronto, possiamo guardare al fenomeno noto come sunglint , che è fondamentalmente il riflesso speculare del Sole sull'acqua, e poiché il Sole è approssimativamente una fonte di luce direzionale per scopi terrestri, e la superficie di riflessione è la Terra che è approssimativamente piatta, questo è un buon analogo della tua illuminazione Phong.

Esempio 1: area di occhiali da sole all'incirca la stessa di un lotto residenziale

Sunglint sul lago

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

Esempio 2: area di occhiali da sole approssimativa ai Grandi Laghi

Occhiali da sole sui Grandi Laghi

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

In effetti l'area della pianta del sole continuerà ad allargarsi fino a quando non sarai abbastanza lontano dalla Terra per essere più rotondo che piatto, dalla tua prospettiva.

In termini di modello di riflessione Phong, lo speculare dipende da tre direzioni: l'occhio, la luce e la superficie. Dal momento che la tua fotocamera guarda la stessa superficie, appena si allontana, l'occhio rimane lo stesso; la superficie rimane la stessa in virtù dell'essere piatta e la luce rimane la stessa per definizione (è una luce direzionale), quindi il riflesso speculare sarà lo stesso - dal punto di vista della telecamera / schermo, ovviamente.


1
Adoro gli esempi di vita reale che rispondono a una domanda di programmazione
defhlt

dannazione, mi hai fatto creare un account solo per votare.
Spongman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.