转自: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. poi管道流的导入导出

    /** * 导入学生信息 * * @param classid * @param uploadFilePath * @return */ public boolean uploadStudentFil ...

  2. sql常用语法

    --在表中添加字段if col_length('JX_DomesticStudy','XL') is null begin alter table JX_DomesticStudy add PXlev ...

  3. nginx 版本介绍

    Nginx官网提供了三个类型的版本Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版Stable version:最新稳定版,生产环境上建议使用的版 ...

  4. centos(Linux)系统阿里云ECS搭建 jdk,tomcat和MySQL环境,并部署web程序

    之前我对这个东西一无所知,攻击力为0,谢谢各个论坛上面的兄弟们的帮助. 过程: 首先ssh远程登陆: ssh root@你的公网ip ,输入密码 1,jdk我用的版本是jdk-7u80-linux-x ...

  5. Linux-FTP

    VSFTPd:Very Secure FTP Daemon FTP服务安全吗?1.用户名和密码不加密2.所传输的文件也不加密 FTP协议原生不安全 TFTP和FTP的区别 1.FTP用TCP协议,TF ...

  6. asp.net写验证码

    生成验证码与匹配验证码的服务端代码 <%@ WebHandler Language="C#" Class="ValidataeCodeHandler" % ...

  7. 0001-Weekly Meeting on 13th and 20th March, 2015

    13th March, 2015 (1) Nearest Neighbors Using Compact Sparse Coding  ->appearing in ICML2014       ...

  8. 虚拟机Ubuntu14/15启用root用户登录

    1. 为root用户设置密码 sudo passwd root 需要先输入一次当前用户的登陆密码,然后输入两次root用户的密码(自己设置). 2. 切换至root用户 sudo -s 3. 编辑登陆 ...

  9. PL/SQL 创建视图语法

    使用create view 语句创建视图 create [or replace][force | noforce] view [user.] viewName (column [,column2].. ...

  10. IP协议

    因特网协议(Internet Protocol, IP)是Internet的核心协议之一, 工作在网络层.IP协议提供节点间的寻址,路由以及顺序控制, 流量控制等服务. IP协议分为IPv4和IPv6 ...