关于shadow map

来源:互联网 发布:考研 软件 编辑:程序博客网 时间:2024/05/21 17:51

想了好久才想通是怎么回事,之前不知道整个场景要渲染两次,所以一直想不明白

第一次渲染:把摄像机挪到灯光位置,然后把把场景中的顶点乘以灯光的视点矩阵,投影矩阵,把坐标变换为-1~1之间,然后进行光栅化,光栅化的时候只取投影变换后的坐标的z/w值,即每个顶点最后渲染到屏幕上的深度值,最后渲染到一幅纹理上,姑且称之为shadow_map(这里需要改变渲染目标,否则就会渲染到屏幕上,不过之后要把渲染目标改回来,否则你接下来无论渲染什么东西都看不到的)

第二次渲染:这次摄像机正常摆放,然后把场景中的等点乘以摄像机的视点矩阵,投影矩阵变换到-1~1,这个坐标称之为,注意往shader传的东西里有一个矩阵(暂且称之为ViewToLightProj),这个矩阵的作用是把一个顶点从第二次渲染的时候的相机坐标系转换到第一次渲染的时候的经过视点变换和投影变换的坐标(这里注意一下,在shader里面要额外保存一份顶点坐标,这个顶点坐标是第二次渲染的时候的摄像机坐标系里坐标暂且称之为vPos),然后要做的是把vPos乘以ViewToLightPro矩阵变换到的第一次渲染的投影后的坐标,这个坐标暂时叫LPos,然后把这个坐标取x和y,然后把x和y变换到0~1,然后把这个坐标作为shadow_map的纹理坐标,因为有了纹理坐标和shadow_map纹理,通过tex2D函数取出每个点对应shadow_map上的值(前面说了是个深度值),然后把这个深度值和Lpos的z/w比较,如果深度之比较大的话,说明这个顶点不在阴影中,否则这个顶点就在阴影中

原创粉丝点击