阴影体实现测试,RenderCraft图形底层, 兼容OpenGL和DirectX两种实现.
1.算法的本质是如何判断一个像素点代表的3D空间点是否在一个多面体内,用的是经典的直线穿越次数判断算法,即判断一个像素3D空间点是否在阴影体内,在于判断从视点到该点的连线穿越阴影体面的次数,算法映射到硬件模拟上,利用Stencil Buffer作计数器.
2.要保证算法的Robust,肯定要用ZFail算法,ZPass是靠不住的.使用shader实现后zpass优化也是没有必要的.
3.兼容支持Two side stencil的显卡,Nvidia是GL_EXT_stencil_two_side扩展, ATI是GL_ATI_separate_stencil扩展.
4.调试中最容易出现的问题是,出现半个阴影区,或阴影交叠处没有阴影,这是由于Shadow Volume没有封住Cap导致.
5.封Cap的问题: zfail只需要封住远平面.
对于shadow volume的frontface(既面对视点的这一面),如果depth test 的结果是pass,说明shadow volume的该front face是在场景物体之前,视线要到达场景物体必然需要穿过该face.
反之如果depth test 的结果是fail,说明shadow volume的该front face是在场景物体之后.
而对于shadow volume的back face(远离视点的一侧),如果depth test的结果是pass,说明shadow volume的该back face是在场景物体之前,视线要到达场景物体必然需要穿过该face.
反之如果depth test 的结果是fail,说明shadow volume的该back face是在场景物体之后.
The rendering of a vector (w = 0.0) in clip space would be semi-infinite.
http://www.cnitblog.com/Files/linghuye/ShadowVolumeDemo.rar
Reference:
ShaderX2