鏡面照明は物体の目に面していると背面の両方に表示されます
質問
フォンシェーディングの小さなテストを書いていて、鏡面コンポーネントを作動させようとしているレンガの壁に頭を叩いています。鏡面光が物体の前後に適用されることを除いて、正しく機能するように見えます。 (対象物自体は透明で、CPU側は手動でソートされています。)
拡散成分は完全に連携しています(光源に面した側面のみが表示されます) - フラグメントシェーダに到着する法線に問題を除外するように見えるように見えます、私は思います。
私が理解しているように、鏡面成分は眼ベクトルと反射光ベクトルの間の角度のcoSに比例します。
物を超シンプルに保つために、私のテストコードは世界の空間でこれをやろうとします。カメラの位置と光のベクトルは、それぞれ(0,0,4)
と(-0.707, 0, -0.707)
としてハードコーディング(残念)です。したがって、目のベクトルは(0,0,4) - fragPosition
です。
モデル行列は回転のみを行うため、頂点シェーダは単にモデル行列で頂点を正常に変換します。 (注:これは、多くの種類の変換が正常な直交性を維持しないので、これは良好な方法ではありません。一般的な行列のために、モデルマトリックスの左上3x3の逆転置を使用する必要があります。)保持する物事は単純で、フラグメントシェーダは単一のフロートカラーチャネル上で動作し、鏡面指数をスキップします(/は1の指数を使用)。
#version 140
uniform mat4 mvpMtx;
uniform mat4 modelMtx;
in vec3 inVPos;
in vec3 inVNormal;
out vec3 normal_world;
out vec3 fragpos_world;
void main(void) {
gl_Position = mvpMtx * vec4(inVPos, 1.0);
normal_world = vec3(modelMtx * vec4(inVNormal, 0.0));
fragpos_world = vec3(modelMtx * vec4(inVPos, 1.0));
}
.
#version 140
uniform float
uLightS,
uLightD,
uLightA;
uniform float uObjOpacity;
in vec3 normal_world, fragpos_world;
out vec4 fragOutColour;
void main(void) {
vec3 vN = normalize(normal_world);
vec3 vL = vec3(-0.707, 0, -0.707);
// Diffuse:
// refl in all directions is proportional to cos(angle between -light vector & normal)
// i.e. proportional to -l.n
float df = max(dot(-vL, vN), 0.0);
// Specular:
// refl toward eye is proportional to cos(angle between eye & reflected light vectors)
// i.e. proportional to r.e
vec3 vE = normalize(vec3(0, 0, 4) - fragpos_world);
vec3 vR = reflect(vL, vN);
float sf = max(dot(vR, vE), 0.0);
float col = uLightA + df*uLightD + sf*uLightS;
fragOutColour = vec4(col, col, col, uObjOpacity);
}
.
ここでエラーが見つかりません。誰にも鏡面成分が物体の上に表示される理由と、物体の光面の側面に表示される理由を説明できますか?
解決
GLSL reflect
は通常の符号に対して鈍感であるため、あなたの鏡面貢献は表裏面と背面のために同じになるでしょう。from このリファレンス
reflect(I, N) = I - 2.0 * dot(N, I) * N
.
他のヒント
を変更してみてください
fragpos_world = vec3(modelMtx * vec4(inVPos, 0.0));
.
fragpos_world = vec3(modelMtx * vec4(inVPos, 1.0));
.
http://www.opengl-tutorial。ORG /初心者 - チュートリアル/チュートリアル-3-マトリックス/#HOMOGENEOUS_COORDINATES