Stencil Shadow Volume Using HLSL 2

前文再续,书接上一回(Stencil Shadow Volume using HLSL)。在NVidia SDK 9,5中已经有一个用HLSL Vertex Shader实现的stencilVolume.fx的例子还有一个解释的PDF,不清楚StencilShadow的朋友可以去下载《Shader X2 - Introductions & Tutorials With Directx 9》中的一章“The Theroy of Stencil Shadow Volumes" 或者看看GameDev的《The Theory of Stencil Shadow Volumes》(btw,同一个作者)。

其实已经万事俱备了,DirectX9的Effect非常简单,大家没有理由不会;NVidia FXComposer 1.8中写Shader又是十分简单的事情,而且把Shader和Effect Link在一起也不是什么痛苦的事情(使用GLSL的朋友就比较不幸了,据说把RenderMokey生成Shader放到程序中要调试N久...)。今天要介绍的是,怎么在3Ds Max中对场景中产生阴影(cast shadow)的物体进行预处理。参照"Ghost Polygon"的目的,简单的Maxscript如下:
1convertToMesh obj --collapse to Editable_Mesh
2
3select obj    -- select the obj again
4
5subobjectLevel = 4    -- change to polygon select mode
6
7for f = 1 to obj.numfaces by 1 do -- travel all faces and extrude them
8    meshop.extrudeFaces obj #{f} 0.0 0.0 dir:#common    -- dir should be common or u will get a weird artifact
9update obj --update the mesh

做的事情如图:


最后在Fx Composer调试结果:



再看看没有经过与处理的物体和处理后物体的对比:


初步结果还不错,总结一下:
Stencil Shadow实用 Vertex Shader的优点:
1,速度快,CPU占用率低,试CPU可以解放出来做AI,Sorting和Scene Management。
2,可以用FX Composer快速调试效果(这个不知道ATI的Fans会不会打我...)

缺点:
1,由于SM3.0还不支持增加Vertex的操作(据说在SM4.0增加Geometry Shader可以自由的进行Vertex的增,删,改,期待中...),所以所有要Cast Shadow的物体都要进行一个预处理,所以预处理的效果和性能显得很重要。
2,当Ghost Polygon的数量大于原来Polygon数量的1/2时,会出现性能的下降。

展望:
1,修改maxscript,以适应更多的模型。
2,希望尽快用C++重写代码,提高效率。
3,用OpenGL和DreictX都实现一个Demo,要求实时改变光照方向,阴影跟着改变,FPS30以上(估计要一个星期吧至少)。

posted on 2007-04-08 18:22  SigEric  阅读(1006)  评论(0)    收藏  举报

导航