フォン照明-鏡面照明には非常に奇妙なものがあります


17

Phongライティングを実装しました。トーラスと球体は予想どおりに点灯するなど、すべてが機能しているように見えます。しかし、指向性ライトの鏡面照明に関して奇妙なことに気付きます。

以下に2つのスクリーンショットを示します。

最初:

ここに画像の説明を入力してください

第二:

ここに画像の説明を入力してください

ご覧のように、カメラがオブジェクトから遠い場合、より多くの領域に鏡面照明があります。

以下は、単純化された頂点シェーダーです。

#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

指向性ライトの鏡面照明

カメラがオブジェクトから遠い場合、より多くの領域に鏡面照明があります

うん、私には正しいようです。

指向性ライトの鏡面領域は、同じ反射面が与えられた場合、カメラに対してほぼ一定であると想定されています。比較するために、sunglintとして知られる現象を見ることができます。これは基本的に水面での太陽の鏡面反射であり、太陽はほぼ地球上の指向性光源であり、反射面はほぼ平坦な地球です。これは、Phongライティングの優れたアナログです。

例1:住宅地とほぼ同じサングリントの面積

湖の上の太陽の輝き

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

例2:五大湖に近いサングリントのエリア

五大湖のサングリント

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

実際、あなたの視点から見ると、太陽から平らな部分よりも丸くなるほど地球から遠く離れるまで、サングリント領域は拡大し続けます。

Phong反射モデルでは、鏡面反射は3つの方向、つまり目、光、表面に依存します。カメラは同じ表面を見て、離れるだけなので、目は変わりません。表面は平らであるため同じままであり、ライトは定義上同じままです(指向性ライト)。したがって、鏡面反射は同じです-もちろん、カメラ/スクリーンの視点から。


1
プログラミングの質問に対する実例の回答が
大好き

ちなみに、あなたは私にただ投票するためにアカウントを作成させました。
スポンジマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.