笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。
CSDN视频网址:http://edu.csdn.net/lecturer/144
最近给读者介绍关于阴影技术的实现原理,当试图为点光源生成阴影时,您需要一个方向矢量才能生成阴影贴图,而且由于点光源将光线投射到整个场景,所以很难获得这样的矢量。 虽然有办法解决这个问题,但它们有点复杂,其实影子贴图技术更适合聚光灯。 Stencil Shadow Volume是一种有趣的技术,可以为点光源的问题提供直接的解决方案。 这种技术是由William Bilodeau和Michael Songy于1998年发现的,由John Carmack在Doom 3引擎(2002)中普及。
实际上在我们的“延迟着色”中看到了这种技术的介绍, 通过延迟着色,我们需要一种阻止光线影响的方法, 我们仅在光照范围内的物体上处理照明, 现在我们要做相反的事情, 我们将创建一个阴影体积,并仅在其外部的物体上处理照明,我们将使用模板缓冲区作为算法的关键组件, 因此名称 - Stencil Shadow Volume。
阴影体积算法背后的想法是将光线减弱时创建的对象轮廓扩展到一个Volume中,然后使用一些简单的模版操作将该Volume映射到模板缓冲区中。 关键的想法是,当一个对象在Volume内(因此在阴影中)时,Volume前面的多边形会对对象的多边形进行深度测试,并且该Volume后部的多边形将失效相同的测试,或者说不参与测试。
我们将根据称为Depth Fail的方法设置模板操作,人们经常使用更直接的方法称为Depth Pass来开始描述阴影体积技术,但是当观看者本身位于影子内并且Depth Fail修复该问题时,我们已经跳过Depth Pass,直接去Depth Fail。 看看下面的图片: