Shadow Volume( 阴影体)渲染技术的实现细节及感受(一)之 阴影体生成

  首先贴一个链接,该链接内有大量基于OpenGL的渲染技术教程和Code Sample,本文基本上在其Tutorial 40的基础上进行了翻译,并加入了部分自己的理解。原文在此:

  http://ogldev.atspace.co.uk/index.html

  

  Shadow Volume,即阴影体技术。是CG中非常常见的阴影渲染技术。在自己动手实现之前,也看了好多原理上的东西。但是纸上得来终觉浅,绝知此事要躬行啊! 以此文记录下Shadow Volume实现过程中的种种。

  简单地讲,光线照射空间几何物体,被物体遮挡住的空间没有不能受到光源光线的直射,这个空间同样可以用一个几何体表示,这个几何体就是所谓的Shadow Volume(以下简称SV),即阴影体。位于SV里的物体的即为被阴影包围的物体。

  实现时的一些关键点:

  1、SV的生成。

  2、Z-Fail Stencil Test.

  3、阴影的渲染。

1、SV的生成:

  

  如上图所示,左图的绿色部分和右图的灰色部分即为 阴影体。阴影体是实实在在的Mesh,跟左图的”人“和右图的”摩托车"一样,都是由三角形面片组成的。我们需要根据光源的位置和阴影的生产者(Shadow Caster)的形状去生成这个Mesh(某物体A遮住了光源,产生了阴影,我们称物体A为Shadow Caster,简称SC。某物体B被物体A遮挡,在B上造成了阴影,我们称物体B为Shadow Receiver,简称SR)。仔细观察上图,我们会发现阴影体起始于SC面向光源的面,而终止于SR。阴影体在SC上的面像个盖子(cap),在SR上的面像底儿(bottom),盖子和底儿之间的三角形面片围一圈形成边儿(surrounding),这个密闭空间就是阴影体的空间。用一个简单的三角形作为SC,如下图所示:

  

  绿色的Cap(即三角形ABC),深灰的bottom(即三角形A‘C‘B‘)以及surroundings(四边形CBB‘C‘, CC‘A‘A, AA‘B‘B)组成了SV Mesh。!注意上述三角形的顺序,遵循右手定则。

  但是实际上,阴影体的Cap并不是位于SC上,而是沿着光源的方向有一个小的偏移量。阴影体的Bottom也不在SR上,而在无穷远处,上图中的A‘,B‘,C‘分别为A,B,C沿着入射光方向被投射到无穷远处的对应点。如下图所示:

  

  紫色的三角形A‘‘B‘‘C‘‘是真正的Cap。这是为了避免Z-fighting。

  那么,生成阴影体Mesh的问题可以转化为寻找盖子,底儿和边儿的过程。有了这些面儿,将它们围起来就是一个闭合的阴影体Mesh。

  下面开始生成SV Mesh。对于SC的一个三角形面片T,它有三个边a,b,c,三个邻面Ta,Tb,Tc,分别与T共享边a,b,c。那么伪代码如下:

  

 1 for every triangle facet T in the SC:
 2
 3     if T faces the light
 4
 5       generate the cap triangle by applying a displacement to the original T.     //生成Cap
 6
 7       generate the bottom triangle by projecting the original T to infinity.   //生成Bottom
 8
 9       for every adjacent triangle Tx ( x = a,b,c )
10
11         if Tx faces the light
12
13            edge x is not part of the silhouette, continue.
14
15         else
16
17           edge x is part of the silhouette, generate the surrouding triangles.
18
19      else
20
21       continue 

  上面的伪代码在Geometry Shader中实现。

  上面的伪代码中提到了 Silhouette (轮廓)。是的,SV Mesh 的 Surrounding Triangles 只在属于 Silhouette 的三角形边处生成。关于silhouette如何检测,上述伪代码已经说得比较清楚了,其原理也比较简单,但是Silhouette detection在大多数情况下仍然作为一个单独的问题来讨论。

  下面就简单提一下:

  silhouette Detection(边界检测)。边界检测相关资料很多了,原理也很简单。在计算机图形学中,物体由三角形面片(triangle facet)组成。以光照边界检测为例,物体外部有某光源(point,spot or direction light ),这个物体上的所有三角面片要么直接受该光源照射(该面法向量与入射光线方向夹角大于90小于180°),要么不直接受光源照射(该面法向量与入射光线方向夹角大于等于0°小于等于90°),那么必然有一个“边的集合”位于这两种三角形面片相交的边界处。边缘检测即找出这个“边的集合”。如下图二维示意图所示。面向和背向光源的三角面片共享的边即我们需要寻找的边。(该图摘自http://ogldev.atspace.co.uk/www/tutorial39/tutorial39.html  ,在原图基础上加入中文图示)

      

  如何去寻找呢?很简单。如下图所示,对某三角形A,有邻面B,C,D。如果A面对光源,那么遍历其三个邻面,如果邻面背对光源,那么A与该邻面共享的那条边即是边界。如果其三个邻面也全都面对光源,那么面A的三条边都不属于边界。

  

  该边缘检测的计算过程可以在Geometry shader中进行。由于Geometry shader 可以访问Primitive的adjacency信息,所以可以方便地对每个三角形的邻面进行信息读取和计算。当然,在OpenGL Application端需要向Pipeline提供具有adjacency信息的数据并按照一定地规则进行排列。例如上图中的三角形A,在提供此Primitive信息的时候应该按顶点索引(0,1,2,3,4,5)的顺序在内存中排列。具体如何从任意3d模型中计算adjacency信息,在此不详细说明。

  如何将SC上的顶点project到无穷远处作为Bottom的顶点呢?如下图所示:

  

  光源将顶点P投射到无穷远处,然后投影到near clip(近裁剪面)的上,其X轴坐标为Xndc.

(图引自 http://ogldev.atspace.co.uk/www/tutorial40/tutorial40.html )

  n为近裁剪面的距离,v为光源到顶点P的向量,t为标量,从0到正无穷。当t趋向正无穷时,就得到我们想求的Xndc。

(图引自 http://ogldev.atspace.co.uk/www/tutorial40/tutorial40.html )

  同理,Yndc也可由此得到。

  至此,SV的生成到此结束。

  下图是实验结果:五环上方有旋转的点光源,下方是个球体。粉色的部分是阴影体。

  

时间: 2024-09-30 06:26:19

Shadow Volume( 阴影体)渲染技术的实现细节及感受(一)之 阴影体生成的相关文章

(转)阴影锥(Shadow Volume)

转自:http://blog.csdn.net/zjull/article/details/11819923 Shadow Map和Shadow Volume是当今比较流行的实时阴影渲染方法,跟Shadow Map相比,Shadow Volume最大的优点是没有阴影锯齿问题,但由于它是基于几何的方法,每帧都有可能要构造和渲染阴影锥,而且有些工作必须由CPU完成,使得它在效率上没有Shadow Map高,因为其计算都是在GPU端完成的:不过对于室内场景或者objects不多的室外场景,Shadow

Shadow Map阴影贴图技术之探 【转】

这两天勉勉强强把一个shadowmap的demo做出来了.参考资料多,苦头可不少.Shadow Map技术是目前与Shadow Volume技术并行的传统阴影渲染技术,而且在游戏领域可谓占很大优势.本篇是第一辑.——ZwqXin.comShadow Map的原理很简单,但是实现起来到处是雷.当然这只是我的体会.恩,不过就是“从光源处看场景,那些看不见的区域全部都该是阴影”.很容易看出,与针对 特定模型的Shadow Volume不同,Shadow Map是针对场景的.这就是说,对一个光源应用一次

Shadow Map阴影贴图技术之探

这两天勉勉强强把一个shadowmap的demo做出来了.参考资料多,苦头可不少.Shadow Map技术是目前与Shadow Volume技术并行的传统阴影渲染技术,而且在游戏领域可谓占很大优势.本篇是第一辑.--ZwqXin.comShadow Map的原理很简单,但是实现起来到处是雷.当然这只是我的体会.恩,不过就是"从光源处看场景,那些看不见的区域全部都该是阴影".很容易看出,与针对特定模型的Shadow Volume不同,Shadow Map是针对场景的.这就是说,对一个光源

(转)Shadow Map & Shadow Volume

转自:http://blog.csdn.net/hippig/article/details/7858574 shadow volume 这个术语几乎是随着 DOOM3 的发布而成为FPS 玩家和图形学爱好者谈论的对象的.虽然这个游戏还没有上市,但是凭借 John Carmack 的传奇经历以及 DOOM3发布的一些让人惊讶的预览图片,我们仍然有理由认为它将会是 2004 年最热门的 FPS 游戏之一. id software向来都不吝惜为了达到最好的图像效果而使用最先进的渲染技术,这曾经使得玩

ZFXEngine开发笔记之Shadow Volume

作者:i_dovelemon 来源:CSDN 日期:2014 / 10 / 20 主题: Shadow Volume 引言 游戏中,往往有很多的光影效果.想要营造出很好的光影效果,物体在光源照射下的阴影就必不可少.本节内容就向大家讲述如何构建阴影. Shadow Volume 构建阴影的方法有很多,常用的两种方法是Shadow Volume和Shadow mapping.本片博文将向大家讲述使用Shadow Volume来构建阴影的方法. Shadow Volume的算法是由Frank Crow

剖析Unreal Engine超真实人类的渲染技术Part 2 - 眼球渲染

目录 三.眼球渲染 3.1 眼球的构造及理论 3.1.1 眼球的构造 3.1.2 眼球的渲染理论 3.2 眼球的渲染技术 3.2.1 角膜的半透和光泽反射 3.2.2 瞳孔的次表面散射 3.2.3 瞳孔的缩放 3.2.4 虹膜的颜色 3.2.5 其它眼球细节 3.3 眼球的底层实现 3.4 眼球的材质 3.4.1 眼球主材质 3.4.2 眼球附属物材质 3.5 眼球渲染总结 特别说明 参考文献 三.眼球渲染 都说眼睛是人类心灵的窗户,若是眼睛渲染得逼真,将给虚拟角色点睛之笔,给予其栩栩如生的灵魂

[sig14&gdc14]crytek的《罗马之子》的渲染技术

crytek关于son of rome在gdc和siggraph都做了presentation,两者有些地方一样的,干脆一勺烩了吧: http://advances.realtimerendering.com/s2014/crytek/Sigg14_Schulz_Mader_Ryse_Rendering_Techniques.pptx http://www.crytek.com/download/2014_03_25_CRYENGINE_GDC_Schultz.pdf 看到一直推动行业水准前进的

游戏中的渲染技术

游戏中的渲染技术 游戏为了提高画面质量.更加接近于真实世界,使用了诸多先进的图形技术,特效的使用大幅提升了游戏画面水平~今天卡拉维德专业游戏美术学习交流平台为大家分享游戏中都有哪些渲染技术.1.运动模糊(Motion Blur)运动模糊技术的目的有二:一是增强快速移动场景的真实感,二是在FPS并不高的时候让游戏显得不是很卡.运动模糊技术并不是在两帧之间插入更多的位移信息,而是将当前帧同前一帧混合在一起所获得的一种效果.传统的运动模糊技术,游戏只是简单虚化了环境,而对高速运动的物体则仅仅保留运行轨

【Unity灯光与渲染技术】Global Illumination全局光照

本系列主要参考Unity灯光与渲染技术教程Unity Lighting And Rendering,同时会加上一点个人实践过程和理解. ========================================== 分割线 ========================================== 这篇文章主要讲全局光照,在看教程的时候就有一个点不是很理解,就是作者开启物体的static这个选项.在网上查找一些资料,有的说"static表示物体时静态的,多用于静止不动的物体,此外