Ogre阴影实现原理解析

作者本人对Ogre研究也不是很深,本文仅供初学者参考
这里介绍两种阴影实现原理,阴影锥阴影和纹理阴影

一、阴影锥阴影

顾名思义,阴影锥阴影其实就是创建一个椎体。

我们以光源位置为起点,和需要产生阴影的物体的外围轮廓(光源作为参考位置)连线然后无限延伸,这样就得到了一个椎体,利用这个椎体做模板测试。

我们把面对摄像机为正面的椎体面先绘制一遍,在相应的模板位置+1

我们把背对摄像机为反面的椎体面再绘制一遍,在相应的模板位置-1

最终模板测试的时候,模板数值>=1的就为阴影点,否则则不是

因为阴影锥无限延伸也不会造成变形,所以阴影锥产生的阴影是不会有锯齿边的,但是因为计算阴影锥失效率降低了很多,故大场景实时阴影用此方法不可取


二、纹理阴影

纹理阴影相对来说就会复杂一点了,但是好处也很多,后面再详细叙述
第一步,我们先创建一张RTT纹理,用于渲染阴影。在光源点创建一个摄像机(计算出视图投影矩阵为M1),将需要产生阴影的物体渲染一遍,注意此时渲染到上一步创建的纹理上面,并且只需要渲染深度值到纹理就行了(记录纹理为T1),这样第一步就完成了
第二步,我们利用Shader编程在顶点程序里面,将M1、T1传入到GPU里面,当渲染一个顶点P的时候,我们先计算出顶点的世界座标PW,利用PW和M1计算出在M1矩阵下投影出的位置PM1,取X,Y为纹理座标,取出TI里面的深度值,与PM1深度值作比较,若比PM1大,则说明是阴影,进行下一步的阴影混合
第三步,在片段程序里面进行阴影混合即可


其实想想,CF里面的喷涂,其实实现方式应该和上述纹理阴影很类似。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章