我目前正在学习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;
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)的区域。
...因此,总的来说,代码是关于将描述从光到光空间中的点的3d向量映射到描述该点在光的视平面上的位置的2d向量的映射。渲染以生成深度图。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句