转自:http://blog.csdn.net/zjull/article/details/11819923

Shadow Map和Shadow Volume是当今比较流行的实时阴影渲染方法,跟Shadow Map相比,Shadow Volume最大的优点是没有阴影锯齿问题,但由于它是基于几何的方法,每帧都有可能要构造和渲染阴影锥,而且有些工作必须由CPU完成,使得它在效率上没有Shadow Map高,因为其计算都是在GPU端完成的;不过对于室内场景或者objects不多的室外场景,Shadow Volume仍有用武之地,阴影锥的实现有多种算法,而且可以做比较多种优化,这里学习一下Z-PASS和Z-FAIL算法,它们都是multipass的,暂时没考虑优化问题。

Z-PASS算法

pass1:打开depth test,按正常方式渲染整个场景,得到depth map。

pass2:打开stencil test,关掉z writing和color buffer writing,渲染shadow volumes;设置stencil test always pass,对于front faces,若z test pass,则stencil value +1,若z test fail,则不更新stencil value;对于back faces,若z test pass,则stencil value -1。

pass3:pass2完成之后,stencil buffer中value不为0的像素就处于阴影区域,据此绘制阴影效果即可。

图1:Z-PASS算法

Z-PASS算法在视点位于阴影锥内或者跟近裁剪面相交时,会得到错误的stencil values,如下图所示:

图2:Z-PASS算法失效的情况

Z-FAIL算法

Z-FAIL算法是 John Carmack,Bill Bilodeau 和 Mike Songy 各自独立发明的,其目的就是解决视点进入 shadow volume 后 Z-PASS 算法失效的问题;

pass1:跟Z-PASS算法一样

pass2:打开stencil test,关掉z writing和color buffer writing,渲染shadow volumes;设置stencil test always pass,对于front faces,若z test fail,则stencil value -1,若z test pass,则不更新stencil value;对于back faces,若z test fail,则stencil value +1。

pass3:跟Z-PASS一样

如图3所示,Z-FAIL算法不论视点位于阴影锥外面,里外还是近裁剪面与阴影锥相交,都可以正确得到stencil values。

图3:Z-FAIL算法

Z-FAIL要求Shadow Volume必须是闭合的,图4左将得到错误的stencil values,加上阴影锥caps(图4右)可以纠正。

图4:Z-FAIL算法的失效场景以及补救措施

阴影锥实现(Z-PASS)

Shadow Map与Shadow Volume的比较

Shadow Map的优势:

实现简单,不需要任何几何计算,shadow map可以完全由GPU生成。

不需要模板缓存,只需要为每个光源保存一张shadow map,没有缓存高填充率问题。

Shadow Map的劣势:

在阴影边缘容易形成锯齿,降低了阴影质量,特别在光源离阴影投射体很远的时候更明显。

对于每个光源,场景都需要渲染一次以得到shadow map,对于点光源,需要做更多的工作。

Shadow Volume的优势:

可获得高质量的阴影效果,没有阴影边缘锯齿问题;

能方便处理聚光照,方向光等多种光源。

Shadow Volume的劣势:

当光源或者投射物体的几何信息发生变化时,阴影锥都需要重新计算,占据比较多的CPU时间;

对几何体的拓扑有要求,即几何体必须是闭合的;

需要模板缓存,不优化的情况下存在高填充率问题,常见的优化方法有:有限阴影锥(Finite Volumes)、XY裁剪(XY Clipping)、Z限定(Z-Bounds);

无法处理具有透明材质物体的阴影投射,如公告板,粒子系统,树叶,grass等;

要求场景中的所有物体都接收投射的阴影,即使接收不到的情况下。

参考链接

http://http.developer.nvidia.com/GPUGems/gpugems_ch09.html

http://blog.donews.com/yyh/archive/2005/05/19/387143.aspx

 
2

(转)阴影锥(Shadow Volume)的更多相关文章

  1. 阴影锥(shadow volume)原理与展望

    转记:找了不少关于shadow volume原理的资料,还是这个帖子讲解的一目了然,转帖在这里,方便查阅.引用链接:http://blog.donews.com/yyh/archive/2005/05 ...

  2. (转)Shadow Map & Shadow Volume

    转自:http://blog.csdn.net/hippig/article/details/7858574 shadow volume 这个术语几乎是随着 DOOM3 的发布而成为FPS 玩家和图形 ...

  3. OpenGL 阴影之Shadow Mapping和Shadow Volumes

    先说下开发环境.VS2013,C++空项目,引用glut,glew.glut包含基本窗口操作,免去我们自己新建win32窗口一些操作.glew使我们能使用最新opengl的API,因winodw本身只 ...

  4. OpenGL阴影,Shadow Volumes(附源程序,使用 VCGlib )

    实验平台:Win7,VS2010 先上结果截图:    本文是我前一篇博客:OpenGL阴影,Shadow Mapping(附源程序)的下篇,描述两个最常用的阴影技术中的第二个,Shadow Volu ...

  5. OpenGL阴影,Shadow Mapping(附源程序)

    实验平台:Win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): 本文描述图形学的两个最常用的阴影技术之一,Shadow Mapping方法(另一种是Sh ...

  6. [UWP]使用GetAlphaMask和ContainerVisual制作长阴影(Long Shadow)

    1. 什么是长阴影 前几年扁平化设计(Flat Design)十分流行,后来在扁平化的基础上又流行起了长阴影(Long Shadow).长阴影其实就是扩展了对象的投影,感觉是一种光线照射下的影子,通常 ...

  7. (转)unity中基于alpha通道的shadow volume实现

    转自:http://blog.163.com/wmk_2000_ren/blog/static/138846192201019114117466/ 实现呢,Aras大神已经给出了, http://fo ...

  8. OSG的组成结构

    OSG的组成结构 核心结构 OSG的功能类采用“命名空间+类名称”的形式来命名.命名空间的命名方式为:第一个单词小写,后继单词的首字母大写,例如osg.osgUtil.osgViewer等:类的名称则 ...

  9. Unreal引擎术语表

    转自:http://www.cnblogs.com/hmxp8/archive/2012/02/10/2345274.html Unreal引擎术语表 转载自UDN: ‍Actor - 一个可以放置在 ...

随机推荐

  1. 移动端调试工具推荐 小苹果和debugap

    小苹果的安装很简单,这是官网,一看就会,完全小白教程. http://www.xbole.com/ debugap的也很简单,这里简单附图介绍一下 ps 官网: http://www.debuggap ...

  2. 管理权限<八>

    权限:如果用户要访问其它方案的对象,则必须为其授予对象的权限.为权限  权限 权限是指执行特定类型 sql 命令或是访问其它方案对象的权利,包括系统权限和对象权限两种. 系统权限  系统权限介绍 ...

  3. HighChats报表使用C#mvc导出本地图片

    最近工作使用了HighCharts,要用到保存成图片功能,但是是内部使用,不允许连接外网,于是就学习了下highcharts生成本地图片. highcharts有一个exporting.js来负责导出 ...

  4. Microsoft Language and Locale Codes(微软语言和地区代码汇总)

    https://msdn.microsoft.com/en-us/library/ms533052(v=vs.85).aspx

  5. ARM Linux 3.x的设备树(Device Tree)

    http://blog.csdn.net/21cnbao/article/details/8457546 宋宝华 Barry Song <21cnbao@gmail.com> 1.     ...

  6. java开发中的一些工具软件

    1. XJad, 反编译工具,类似于.Net中的Refractor.可以反编译单个jar文件或一个文件夹下的class文件,效果还不错. 2. dirtyJOE, class文件直接修改工具.有时想修 ...

  7. Acunetix Web漏洞扫描器

    1.主要程序介绍 主要操作区域简介: b).工具栏 从左到右分别是(这些都可以在主要操作区域找到,所以不常用): 新建扫描——网站扫描——网站爬行——目标查找——目标探测——子域名扫描——SQL盲注— ...

  8. 第35讲:List的map、flatMap、foreach、filter操作代码实战

    List类的高阶方法          val fmap = List( 1,2 ,3). map { _ + 1 } //List(2, 3, 4)    val fruit_rev2 = frui ...

  9. TypeScript 0.9.1 发布,新增 typeof 关键字

    TypeScript 0.9.1 发布了,该版本提升了编译器和语言的性能,增加新的语言特性 typeof ,更好的 this 处理等.详细介绍请看发行说明. TypeScript 是微软新推出的一种语 ...

  10. sqlhelper sqlparameter 实现增删改查

    这是sqlHelper.cs类,类内里封装了方法 using System; using System.Collections.Generic; using System.Linq; using Sy ...