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颜色的因子,得到最终场景图

    vsm.JPG

 

 

三、CSM——视锥分割,用于超大型场景(资料cascaded_shadow_maps.pdf)

csm1.JPG

  • 按照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是个标准正交投影矩阵)

    csm2(1).JPG

  • 使用各分块层cropMatrix * LightProjectionMatrix * LightViewMatrix,计算shadowCaster的光照深度,得到shadowMapArray

  • 根据场景顶点处于viewCamera棱柱分块的序号,分别选取对应的shadowMap,并进行比较,此处还可结合VSM技术。

This article was written in springnote.

posted @ 2012-05-17 22:21  ActionFG  阅读(317)  评论(0)    收藏  举报