次の 2 つのパスを使用して、ポイントライトの影を計算したいと考えています。
最初に、シーンオブジェクトのモデル空間、キューブマップの面に対応するビューマトリックス、および 90 度 FOV の投影マトリックスを使用して、ポイントライトのビューからキューブマップにシーンを 6 方向すべてにレンダリングします。次に、頂点とライト位置の間の距離をワールド空間に格納します (これはカメラの位置なので、ワールド空間でレンダリングされた頂点の長さだけです)。ここにワールド空間を保存するのは正しいですか?
キューブマップは GL_DEPTH_COMPONENT タイプのテクスチャです。指向性ライトとスポットライトのシャドウイングは非常にうまく機能しますが、それらは単一の 2D テクスチャです
これは、距離を保存しようとするシェーダーです。
頂点シェーダー:
#version 330
layout(location = 0) in vec3 vertexPosition;
uniform mat4 modelMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
out vec4 fragmentPosition_ws;
void main(){
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(vertexPosition, 1.0);
fragmentPosition_ws = modelMatrix * vec4(vertexPosition, 1.0);
}
フラグメントシェーダー:
#version 330
// Ouput data
layout(location = 0) out float fragmentdist;
in vec4 fragmentPosition_ws;
void main(){
fragmentdist = length(fragmentPosition_ws.xyz);
}
2 番目のステップでは、照明自体をレンダリングするときに、次のように距離の値を取得しようとします。
float shadowFactor = 0.0;
vec3 fragmentToLightWS = lightPos_worldspace - fragmentPos_worldspace;
float distancerad = texture(shadowCubeMap, vec3(fragmentToLightWS)).x;
if(distancerad + 0.001 > length(fragmentToLightWS)){
shadowFactor = 1.0;
}
注:
shadowCubeMap
タイプ samplerCube のサンプラーです
lightPos_worldspace
ワールド空間のライト位置です (ライトは既にワールド空間にあります - モデルマトリックスはありません)
fragmentPos_worldspace
ワールド空間のフラグメント位置 ( * モデル行列)
その結果、すべてが別名で照らされます。影ではありません。確かに、シャドウマップへのレンダリングは機能します。影を計算するいくつかの実装を試してみましたが、オブジェクトである可能性のある影のようなものを見たことがあります。しかし、これは距離法ではなく、NDC の影の深さによるものでした。ですから、これも間違いがないかチェックしてください。