ShadowMap相关
一、基础技术
-
将光源作为相机,渲染场景,将lightWorldViewProjectPos——处于光源相机透视坐标系下的 z/w 值写入深度图中
注意此时光源相机的projectMatrix应为: D3DXMatrixPerspectiveFovLH(&mLightProjection, D3DX_PI / 2, 1, 0.01, 4000);
-
采用正常相机,利用深度图再次渲染场景。
将此时场景的顶点先变换到光源相机的ProjectSpace中,并与深度图数据进行比较,若被遮挡,则为黑色
二、VSM技术(资料vsm_paper.pdf)
- 同样将光源作为相机,渲染场景,不过此时得存入(lightDepth,lightDepth * lightDepth)——(x, x * x))至深度图中
-
BlurPass,得到 E(x * x)(深度平方的平均值), E(x) * E(x)——(深度平均值的平方)(平均值通过两次blurPass得到)
-
采用正常相机渲染,并用下面P值作为像素fragment颜色的因子,得到最终场景图
三、CSM——视锥分割,用于超大型场景(资料cascaded_shadow_maps.pdf)
-
按照viewCamera视锥进行分割,并得到每个分块的LightCameraCropMatrix
步骤:1、得到分块的8个点的世界坐标,并转换到LightViewSpace中,并得到最小深度minZ、最大深度maxZ
2、构建初始LightProjectionMatrix:glOrtho( -1.0, 1.0, -1.0, 1.0, -maxZ, -minZ)
3、将棱柱分块8个点转换到LightViewProjection Space中,并计算minX、maxZ、minY、maxY,并得到cropMatrix (实际上cropMatrix*LightProjectMatrix是个标准正交投影矩阵)
-
使用各分块层cropMatrix * LightProjectionMatrix * LightViewMatrix,计算shadowCaster的光照深度,得到shadowMapArray
-
根据场景顶点处于viewCamera棱柱分块的序号,分别选取对应的shadowMap,并进行比较,此处还可结合VSM技术。
This article was written in springnote.
浙公网安备 33010602011771号