Фонг-освітлення - з дзеркальним освітленням відбувається щось дуже дивне


17

Я реалізував освітлення Phong. Все, здається, працює - торус і сфери запалюються так, як очікувалося, і т. Д. Але я помічаю щось дивне щодо дзеркального освітлення спрямованого світла.

Ось два скріншоти.

Спочатку:

введіть тут опис зображення

Друге:

введіть тут опис зображення

Як ви можете бачити більше області має дзеркальне освітлення, коли камера далеко від об'єкта.

Ось спрощена вершина шейдера:

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

... і фрагмент шейдера:

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

Повний вихідний код без будь-якого спрощення можна знайти в цьому сховищі .

Мені хотілося знати, чи я реалізував щось не так. Або це нормально для освітлення Phong?


2
Існує стек комп’ютерної графіки, на який ви можете знайти кращі відповіді на це питання.
Ендрю Вілсон

Відповіді:


34

дзеркальне освітлення спрямованого світла

більша площа має дзеркальне освітлення, коли камера далеко від об'єкта

Так, мені здається.

Зона окулярів для спрямованих вогнів повинна бути більш-менш постійною в режимі камери, враховуючи однакову відбивальну поверхню. Для порівняння ми можемо розглянути феномен, відомий як сонячний крем , який в основному є дзеркальним відображенням Сонця на воді, і оскільки Сонце є орієнтовним джерелом світла для наземних цілей, а поверхня відбиття - Земля, яка приблизно рівна, це хороший аналог вашого освітлення Phong.

Приклад 1: площа сонцезахисного крему приблизно така ж, як і житлова ділянка

Sunglint над озером

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

Приклад 2: площа сонячного крему наближена до Великих озер

Сонячний крем над Великими озерами

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

Насправді область сонцезахисту просто продовжуватиметься збільшуватися, поки ви не будете досить далеко від Землі, щоб вона стала вашою круглішою, ніж плоскою.

З точки зору моделі відображення Фонга, окуляр залежить від трьох напрямків: ока, світла та поверхні. Оскільки ваша камера дивиться на ту саму поверхню, просто віддаляючись, око залишається таким же; поверхня залишається однаковою в силу плоскості, а світло залишається таким же за визначенням (це спрямоване світло), тому дзеркальне відображення буде однаковим - звичайно, з точки зору камери / екрана.


1
Полюбіть приклади з реального життя, які відповідають на питання програмування
дефлот

чорт, ти змусив мене створити обліковий запис просто для того, щоб подати заявку.
Spongman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.