快速了解Cone Tracing

单根RayTrace最大的问题,就是远处物体采样不足:

对于这些远处物体,实际上一个像素感光器所接收到的像素是所有subRay的集合:

对于这些Subray,既会都来自同一个物体,也会来自前后不同的物体:

基本概念就这么多。
------------------------------------------------------------------------------------------------
跟Ray Tracing一样,实际和理论差了一万个坑。Cone Tracing也是。
我打赌,如果你从未先入为主得看过Ray Tracing的实现,一定会和“主流”实现千差万别。为啥一个像素只发一条?为啥只在乎1bounce?为啥1bounce后面就不半球积分了?(显然数量爆炸了)...... Cone Tracing 也是。
非主流的就不多说了,比如ShaderToy上搜Cone Tracing,场景信息还是SDF,基本是拿来当AA和Motion Blur使的。
主流的是Voxel Cone Tracing,也不是我上面说的多个SubRay,而是每次Step有一个球体,检测球体里的相交信息:

通过面积占比关系可以获得alpha,通过alpha混合可以解决上面说的(单像素不同物体的采样不足)问题:

可以看到混合是很naive的,不过无所谓够用了。
显然求交合计算占比也不容易,所以把场景Voxel化,用八叉树管理。
并且最多就trace 8次,够用了。
因为把场景voxel变成Texture3D,可以把贴图的mipmap用起来,相当于一个天然的LOD。
然后第一次trace用mip7,第二次用mip6...有点类似SDFTrace时候,离得远先Trace一个简单的LOD,可以参考我之前trace地形,就是离得近才计算细节高度:链接。
主流的Voxel Cone Tracing就说完了,显然各家会有不同的细节处理,就跟现在的Renderer一样,功能一样,但出图就是各有各味儿。
----------------------------------------------------------------------------------
在Nvidia那叫VXGI,之前和ue4搞过整合,现在没声音了。
跟LPV一样,好是好的,不实用,不然早起飞了。
Two Minute Paper那种降智玩意儿,之前也做过一期。md,天天在那omg,不知道你还以为多牛逼呢,计算量上去了渲染结果能不好看吗?天天放2个图然后开始吹水。
ShaderToy上搜标题正经实现VCT的好像也就2,3个左右,这个可以看看,显然问题还是有很多的。Ray Tracing是做不到这种这么快,又无噪声的实时自发光场景的。可惜由于要把整个场景放GPU里,所以场景只能很简单了:
