阴影贴图定位和分辨率

时间:2015-04-28 16:26:54

标签: c++ opengl 3d shadow shadow-mapping

我目前正在学习C ++和OpenGL,并且想知道是否有人可以通过以下代码向我介绍正在发生的事情。它目前计算3D环境中阴影贴图的定位和分辨率。

代码目前有效,只是想要掌握一些事情。

Following agents belong to the agent pools which are not associated with "Tests" project

1 个答案:

答案 0 :(得分: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)的区域。

...所以,总的来说,代码是关于从描述光的矢量到光的空间中的点的矢量到2d矢量的映射,这些矢量描述点落在光的位置和#39; s视图平面 - 为生成深度贴图而渲染的平面。