通过顶点投射的方式实现简单的实时阴影
实时阴影的实现方法有很多种,shadowMap适用性最好,但性能开销也大,有时候我们的项目其实并不需要那么通用的阴影,我们只需要一个“适用某些特定场合”的一个“看起来正确”的实时阴影。
本文所说的,就是一种利用顶点投射的方法实现的实时阴影技术,在一些阴影质量要求不高,地面平整的项目是一个非常合适的方案。
原理
忽略自身阴影不谈,如果我们只考虑物体在地面上的阴影的话,其实就可以把这个问题简单概括为求一个物体每一个顶点在某个平面上的投影位置了。
公式推导
其实就是算出点W沿着光照方向与投影平面相交点P即可
现在从图中就可可以直接得到Py = h,所以真正需要计算得到的只有Px
从图可以很容易看出这两个三角形其实是相似的
所以通过相似三角形的定律,可以得到公式
所有的变量除了Px都是已知的
所以只要通过简单的换算就可以得到
Px和Py都求出来,其实就已经得到了点M在高度为h的平面上X轴方向上的投影点P
同理也可以求出点M在Z轴的投影点
最终结合就是三维空间中的投影点
在shader中实现
有了公式以后,剩下的就简单了,我们只需要在shader中把所有的顶点的投影的位置计算出来,再进行渲染即可,不过该公式是基于同一坐标系下计算才成立的,所以需要把所有模型从自身空间转换到世界空间中进行计算,核心代码如下: