« 乱弹OpenGL中的矩阵变换(下)学一学,FBO »

Shadow Volume 阴影锥技术之探Ⅳ

本文是ZwqXin关于Shadow volume阴影锥技术实践记录的第四辑。Z-PASS的固定管道渲染过程大概已经完成了,如之前所述,本系列会逐渐进入shader ver.和 Z-FAIL,还有优化方法的探讨记录。在此前,稍微总结一下Shadow volume技术的一些要点,也总结这一阶段结果中出现的问题。——ZwqXin.com   前文见:

本文来源于 ZwqXin (http://www.zwqxin.com/), 转载请注明
      原文地址:http://www.zwqxin.com/archives/opengl/shadow-volume-4.html

我想从我的上个DEMO的BUGS带出问题。首先就是在日志Shadow Volume Demo2的DEMO图片展最后所说的问题:部分阴影无法压到投影面(地面)上。为什么呢?首先,这个Shadow Volume Demo2 -ZwqXin.com茶壶模型哪里是“实”的哪里是“空”的应该很容易看清楚。问题是某些“非空”部分无法落影。明显的是壶盖边缘处和出水口处。这些地方有什么特点呢?都是“内陷”的。问题就在这里了:虽然我们可以看到这些“内陷”部分,但是其实它们不属于“模型的正面”。“模型的正面”是一个很难弄清楚的概念,因为我觉得它是完全依赖于模型制造者的。壶口外壁无疑会是正面,壶口内壁呢?对真实茶壶来说它是正面,反面应该是我们无论怎样也看不见的在两壁中间的那个面,理论来说只要它为我们所见,它们就是此刻的“正面”。但是即使建模工具以“逆时针为正”(之前提过的“重要假设”),假如制造者是直接平移外侧面来复制一个内侧面呢?那么它们的三角面绕向将会一致,结果导致壶口内壁那个为我们所见的面是“顺时针”绕向,具体反映到表达画面顺序的顶点索引上,然后Z-PASS渲染阴影把与之对应的阴影锥侧面(silhouette edge)放在“单单渲染反面”那一步绘制了。得出来的模板值就很难避免错误了。而且我相信这种情况即使在标准Z-FAIL算法中也应该不会改善什么:因为它的纠结在于正负面判断错误。

其次是,也许看过之前两个DEMO的都发现的:一旦我们进入了“阴影锥”内部,阴影将消失(反而四周黑掉了)。这就是Z-PASS算法致命缺点之一,锥内阴影失效。用“技术点”的话儿来说,就是not Robust。失效的道理很简单,Z-PASS就是根据连接场景某顶点的视线在阴影锥侧面(silhouette edges)中“N入M出”的道理,把“N=?M”作为判断该顶点是否位于阴影锥内部的依据的。因此你一旦眼睛入了内部,计算将会出错(见Ⅰ中的推荐文章:阴影锥(shadow volume)原理与展望---真实的游戏效果的实现)。也因此才有了Z-FAIL。这个Robustness也是Z-FAIL算法出现原因:它虽然要硬性对阴影锥(shadow volume)上下封口增加渲染量,但是也因此结合“深度测试的通过失败改变蒙板数值”而产生Robustness,即使阴影很大,视线进入阴影锥,也不怕失效。当然,更好的策略是两手准备:当相机(眼睛)没有进入阴影锥内时用效率更高的Z-PASS,当眼睛进入后立即切换到Z-FAIL。

然后说说无论是Z-PASS或者A-FAIL都无法避免的近裁切面问题。也就是视景体中近裁切面和远裁切面“减掉”了部分用于执行Z-PASS或Z-FAIL计算的阴影锥侧面(silhouette edge),导致最后的蒙板值错误。相信看图理解胜于一切:


图注:分别代表近,远裁切面造成的失效原因(from GameDev)

远裁切面的话,你在gluPerspective里把远裁切面深度调大点就可以在一般情况下囫囵避免一下,但是近裁切面就麻烦了,你设得再小也有限度吧。当然了,Z-PASS中眼睛稍微进入锥内都阴影失效,就别提这“靠近锥”的情况了(反正都是不行嘛!)。所以处理集中于Z-FAIL中的近裁切面处理。上面文章提到一种light-pyramid的方法,虽说原理就是很容易明白,构造这个light-pyramid起来可不是一般复杂,呵呵。

最后再提一下,在DEMO中我曾经说过是把阴影锥长度设成:10*d光源-顶点,这里是很随意的数字。而且因为你走不出DEMO的房间,因此即使调成“阴影锥可见”模式,你也看不到射出房间那部分阴影锥。可实际在应用,譬如游戏里,这样随意好不好呢?不好。首先,太近的话,你也知道什么结果(只有处于阴影锥里的物体才会被覆盖阴影,别忘了这阴影锥的作用!);太远的话(譬如你可以调到无穷远,改变顶点齐次坐标为0就可以了),你很可能遭到报复:看右边,在那个小三角形对应的地形那条侧边,无缘无故遭到“阴影”了,被别人看见了可怎么办(GHOST啊~)。所以,长度还是根据实际来吧。

阴影锥技术和阴影贴图技术贵为实时渲染阴影技术中老资质且简便的技术,近年来不断有人对之优化,目的可能是高效率,可能是漂亮的软阴影。过程总是复杂,但是为了什么?因为,世界上有光就有影。3D世界正是在光与影中最好展现它的视觉魅力!

下一篇见:Shadow Volume 阴影锥技术之探Ⅴ(Z-FAIL)

本文来源于 ZwqXin (http://www.zwqxin.com/), 转载请注明
      原文地址:http://www.zwqxin.com/archives/opengl/shadow-volume-4.html

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

IE下本页面显示有问题?

→点击地址栏右侧【兼容视图】←

日历

Search

网站分类

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 100427

Copyright 2008-2013 ZwqXin. All Rights Reserved. Theme edited from ipati.