Ogre阴影实现原理解析
2014-02-26 18:26
211 查看
作者本人对Ogre研究也不是很深,本文仅供初学者参考
这里介绍两种阴影实现原理,阴影锥阴影和纹理阴影
一、阴影锥阴影
顾名思义,阴影锥阴影其实就是创建一个椎体。我们以光源位置为起点,和需要产生阴影的物体的外围轮廓(光源作为参考位置)连线然后无限延伸,这样就得到了一个椎体,利用这个椎体做模板测试。
我们把面对摄像机为正面的椎体面先绘制一遍,在相应的模板位置+1
我们把背对摄像机为反面的椎体面再绘制一遍,在相应的模板位置-1
最终模板测试的时候,模板数值>=1的就为阴影点,否则则不是
因为阴影锥无限延伸也不会造成变形,所以阴影锥产生的阴影是不会有锯齿边的,但是因为计算阴影锥失效率降低了很多,故大场景实时阴影用此方法不可取
二、纹理阴影
纹理阴影相对来说就会复杂一点了,但是好处也很多,后面再详细叙述第一步,我们先创建一张RTT纹理,用于渲染阴影。在光源点创建一个摄像机(计算出视图投影矩阵为M1),将需要产生阴影的物体渲染一遍,注意此时渲染到上一步创建的纹理上面,并且只需要渲染深度值到纹理就行了(记录纹理为T1),这样第一步就完成了
第二步,我们利用Shader编程在顶点程序里面,将M1、T1传入到GPU里面,当渲染一个顶点P的时候,我们先计算出顶点的世界坐标PW,利用PW和M1计算出在M1矩阵下投影出的位置PM1,取X,Y为纹理坐标,取出TI里面的深度值,与PM1深度值作比较,若比PM1大,则说明是阴影,进行下一步的阴影混合
第三步,在片段程序里面进行阴影混合即可
其实想想,CF里面的喷涂,其实实现方式应该和上述纹理阴影很类似。
相关文章推荐
- Unity Shader:实现菲涅尔+色散效果以及相关原理解析
- jquery源码解析:jQuery队列操作queue方法实现的原理
- 数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)
- 数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
- 顺序线性表 ---- ArrayList 源码解析及实现原理分析
- CSS实现三角形图标原理解析
- C++ *深度解析*【函数重载】的实现原理
- 数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器
- 数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器
- 数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器
- 数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器
- Android中免Root实现Hook的Dexposed框架实现原理解析以及如何实现应用的热修复
- Android中的Apk的加固(加壳)原理解析和实现
- Epoll实现原理解析 http://blog.csdn.net/wangxiaoqin00007/article/details/14450021
- 深入解析SQL Server高可用镜像实现原理
- 数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
- 数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
- 数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
- OGRE启动过程详解(OGRE HelloWorld程序原理解析)
- struts2 实现原理解析