Phong aydınlatma - aynasal aydınlatmada çok garip bir şey var


17

Phong ışıklandırmasını uyguladım. Her şey işe yarıyor gibi görünüyor - torus ve küreler beklendiği gibi yanıyor.

İşte iki ekran görüntüsü.

İlk:

resim açıklamasını buraya girin

İkinci:

resim açıklamasını buraya girin

Gördüğünüz gibi, kamera bir nesneden uzak olduğunda daha fazla alanın aynasal aydınlatması vardır.

İşte basitleştirilmiş köşe gölgelendirici:

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

... ve parça gölgelendirici:

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

Herhangi bir basitleştirme olmadan tam kaynak kodu bu depoda bulunabilir .

Yanlış bir şey uygulayıp uygulamadığımı bilmek istedim. Yoksa Phong aydınlatması için uygun mu?


2
Bu soruda daha iyi yanıtlar bulabileceğiniz bir bilgisayar grafik yığını var.
Andrew Wilson

Yanıtlar:


34

yönlü ışığın aynasal aydınlatması

kamera bir nesneden uzak olduğunda daha fazla alanın aynasal aydınlatması vardır

Evet, bana doğru görünüyor.

Yönlü ışıkların speküler alanının, aynı yansıma yüzeyi göz önüne alındığında, kamera için az ya da çok sabit olduğu varsayılmaktadır. Karşılaştırmak için, temelde Güneş'in su üzerinde speküler yansıması olan sunglint olarak bilinen fenomene bakabiliriz ve Güneş karasal amaçlar için yaklaşık olarak yönlü bir ışık kaynağı olduğundan ve yansıma yüzeyi yaklaşık olarak düz olan Dünya'dır, Bu, Phong aydınlatmanızın iyi bir analogudur.

Örnek 1: Sunglint alanı kabaca bir yerleşim yeri ile aynı

Göl üzerinde Sunglint

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

Örnek 2: Büyük Göllere yaklaşık güneşlenme alanı

Büyük Göller Üzerinde Sunglint

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

Aslında, sunglint alanı, Dünya'dan düz olandan daha yuvarlak olacak kadar perspektifinize kadar yeterince genişleyene kadar büyümeye devam edecektir.

Phong yansıma modeli açısından, speküler üç yöne bağlıdır: göz, ışık ve yüzey. Kameranız aynı yüzeye baktığından, sadece uzaklaştığından, göz aynı kalır; yüzey düz olması nedeniyle aynı kalır ve ışık tanım gereği aynı kalır (yönlü bir ışıktır), bu nedenle ayni yansıma elbette kamera / ekran açısından aynı olacaktır.


1
Programlama sorusuna verilen gerçek hayattan örnekleri seviyorum
defhlt

kahretsin, sadece oy vermek için bir hesap oluşturmamı sağladın.
Spongman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.