3

私は現在 C++ と OpenGL を学んでおり、以下のコードで正確に何が起こっているのかを誰かが教えてくれるかどうか疑問に思っていました. 現在、3D 環境内のシャドウ マップの位置と解像度を計算しています。

コードは現在機能しており、物事を把握しようとしています。

//Vertex Shader Essentials.
Position = ProjectionMatrix * ViewMatrix * WorldMatrix * vec4 (VertexPosition, 1);
Normal = (ViewMatrix * WorldMatrix * vec4 (VertexNormal, 0)).xyz;
EyeSpaceLightPosition = ViewMatrix * LightPosition;
EyeSpacePosition = ViewMatrix * WorldMatrix * vec4 (VertexPosition, 1);
STCoords = VertexST;

//What is this block of code currently doing?
ShadowCoord = ProjectionMatrix * ShadowMatrix * WorldMatrix * vec4 (VertexPosition, 1);
ShadowCoord = ShadowCoord / ShadowCoord.w;  
ShadowCoord = (ShadowCoord + vec4 (1.0, 1.0, 1.0, 1.0)) * vec4 (1.0/2.0, 1.0/2.0, 1.0/2.0, 1.0);

//Alters the Shadow Map Resolution. 
//    Please Note - c is a slider that I control in the program execution.
float rounding = (c + 2.1) * 100.0;
ShadowCoord.x = (floor (ShadowCoord.x * rounding)) / rounding;
ShadowCoord.y = (floor (ShadowCoord.y * rounding)) / rounding;
ShadowCoord.z = (floor (ShadowCoord.z * rounding)) / rounding;


gl_Position = Position;
4

1 に答える 1

1
ShadowCoord = ProjectionMatrix * ShadowMatrix * WorldMatrix * vec4 (VertexPosition, 1);

これにより、ライトの目の空間内でこの頂点の位置が計算されます。再計算しているのPosition = ProjectionMatrix * ViewMatrix * WorldMatrix * vec4 (VertexPosition, 1);は、シャドウ バッファーにレンダリングしていたときにラインが生成したはずのものです。

ShadowCoord = ShadowCoord / ShadowCoord.w;  

これは透視投影を適用し、影の座標がライトのビュー プレーンのどこに位置するかを判断します。

次のように考えてみてください。ライトの視点から見ると、(1, 1, 1) の座標は (2, 2, 2) の座標と同じ場所に表示されるはずです。どちらの場合も、深度バッファーの同じ 2D 位置をサンプリングする必要があります。で割ることwでそれが達成されます。

ShadowCoord = (ShadowCoord + vec4 (1.0, 1.0, 1.0, 1.0)) * vec4 (1.0/2.0, 1.0/2.0, 1.0/2.0, 1.0);

これは、適切な場所でサンプリングすることでもあります。上の投影では、ライト ビューの中心にあるものがあり、たとえば (0, 0, 1) にあるものは (0, 0) になります。ただし、(0, 0) はライト マップの左下であり、中心ではありません。この行により、ライトの投影空間で (-1, -1) から (1, 1) までの領域をカバーするライトマップが作成されます。

...全体として、コードは、ライトからライトの空間内のポイントまでのベクトルを表す 3 次元ベクトルから、ポイントがライトのビュー プレーン上のどこにあるかを表す 2 次元ベクトルへのマッピングに関するものです。深度マップを生成するためにレンダリングされます。

于 2015-04-28T16:50:28.667 に答える