Volume Fog – Ray Tracing Shadows

Posted by on July 27, 2013

这玩意并不新鲜。很早在Nvidia的demo里面看到过。当初并没有当回事。后来ENIX的引擎演示里面又见到了。再到后来Crytek前段时间的演讲里面也提到这玩意。再后来Killzone:Shadow Fall的资料里面也看到了,看样子不装备不行了。

咱一直认为说到底还是Volume Light,只不过这个是正版的,原来那个所谓屏幕空间容积光只不过是个hack。然后Crytek非要起个新名字叫Fog?!当然项目里面我还是写作Volume Light了。

具体实现可以参考一下Nvidia的文档。里面其实只要看一个开始的本质的理论描述就够了。直接看代码简直就是自寻死路。

简而言之就是做一个fullscreen trace,一步一步向前走,每一步对比一下跟shadowmap的关系。

这回还是费了一番功夫的。

最初是这幅样子。使用了一个很小的尺寸,步长直接给了1000,结果跑到死,效率低:(

这个算法的问题在于,步长如何计算,场景这么大,逐像素trace明显不现实。试了很多方法,又看了原文档,原文档里面通过求depth的最大最小值来确定追踪范围(现在觉得这方法可行,找个时间看看能不能改到CS里面做)。我这里仅仅是做了个“看起来比较舒服”的步长计算。在不要求距离的情况下甚至可以做Full-size的追踪。

理想中的全尺寸。

考虑到逐像素追踪完全不需要采样周围的数据,那么ok,把深度改成宽度,空间换时间,这是分割成两块进行计算的情况:

当采样深度比较大,超过500左右这个效率比直接计算要快,killzone里面提到的分块计算不知道是不是这个意思。

尽管如此还是离实用性差了很远,吃掉了很多时间,缩小分辨率又死的很难看。

总之现在暂时是借用了Nvidia里面的源码进行反锯齿。

最后结果就是这样。远远没有高分辨率好看,但是在现在的技术条件下只能如此。

接下来的优化:

1.back trace追踪

2.max/min depth

3.最理想的方法!:将volume直接渲染到屏幕上,cw/ccw两遍直接求出max/min depth,直接计算volume内部像素。

最后的疑问:

为什么killzone里面说所有的光源都支持volume?

Last modified on July 27, 2013

Categories: GameEngine, RedEngine
No Comments »

« | Home | »

Leave a Reply