开篇提醒
笔者使用Falcor的时间并不长,在使用过程中也因没有前辈带领遭遇过不少困难,因此才写了这篇文章。文中不可避免会出现一些问题及错误,希望读者细心甄别的同时给予一些包容。
Nvidia Falcor
简介及Github地址
Falcor是英伟达开发的开源实时渲染框架,具体介绍及功能特性可见官方Github:Faclor
编译及可能出现的问题
Falcor的编译条件及方式在官方的readme中有很清晰详尽的介绍,依照自己的需求跟着做就可以。但在生成解决方案时可能出现问题,导致生成不成功。如果确认自己是依照官方的说明进行,并没有错误操作的话,有可能是编码出现了问题。 读者可以尝试在Windows设置中更改系统区域设置,切换到英语(美国)或者其他英语地区,我通过这种方式解决了问题。另一种方式是降低警告等级,这也是一种方法,不过我自己没有尝试过。
两种代码编写流程
Falcor除了支持传统的作为框架来使用,即整个项目代码功能主体都由使用者自己编写的使用方式外,还支持名为Mogwai的图形化界面。使用者只需要编写渲染的Pass,并在RenderGraphEditor中进行组合后在Mogwai中调用,其余处理都由Falcor自主进行,有些类似于UE。我们接下来的介绍都基于Mogwai,请读者先熟悉Mogwai的使用流程,再继续阅读。
Falcor光追流程
Falcor的基本运行流程在官方Github/Docs中已有详细介绍,我对整体的流程暂时不做说明了,需要进一步说明或想要查询API的可以前往官方文档自行查看。 接下来我主要说明Falcor内Mogwai下的光线跟踪流程(以预设的PathTracer.py为参考),请看完官方Github/Docs后再继续阅读,否则可能难以理解。
GBufferRT和VBufferRT
GbufferRT和VBufferRT是falcor当中进行光追的第一步(如果不算场景导入的话),Falcor默认以VBufferRT作为第一步,但注意官方预设的PathTracer.py是以GBufferRT开始的,需要注意区别。 这一步事实上是为了获取场景信息,如果使用GBufferRT,则Falcor首先进行光栅化,将场景的各类信息都保存下来,之后直接使用。如果使用VBufferRT,则Falcor首先从摄像机(即视点位置)发射初级光线,将击中点的信息保存下来,以便之后调用。
MegakernelPathTracer
这是Falcor进行光追的主体部分,当然Falcor并不只有这一个PathTracer,还有MinimalPathTracer和WhittedRayTracer。 对于WhittedRayTracer,我不做解释了,大部分人一开始学的就是Whitted-Style的光追,如有需要可以看Games101的RayTracing部分。 MinimalPathTracer,顾名思义,极简的PT,没有任何加速的Trick,相当于GPU上的离线渲染器,结果可以视作GroundTruth,不过收敛速度较慢。 再说说MegkernelPathTracer,这个Tracer内部集成了Next Event Estimation(NEE), Multiple Importance Sampling(MIS)和Russian Roulette(RR),通过这些方式在提高收敛速度的同时保证精度,以此达到实时的需求。 注意,MegakernelPathTracer中只有NEE和MIS是默认开启的,RR需要手动开启,并且还存在一些问题。除此之外,还有一些默认值需要说明,SPP默认为1,light sample默认也为1,bounce默认为3,最高限制为255。通过学习MegakernelPathTracer,我们可以了解falcor光追的运行方式,并以此为基础写出我们自己的pass(shader)。 具体的功能实现请各位去研究源码,一定对Falcor学习大有裨益。我只说明一下VBufferRT与MegakernelPathTracer之间是如何传递数据的。首先在VBufferRT中,我们对屏幕上的每个像素发射光线,击中的场景中点的数据由插值得到,之后会进行编码(减少存储压力)并存入数据结构RWTexture2D。在MegakernelPathTracer中,我们以屏幕空间坐标得到之前存储在RWTexture2D中的数据,之后以此为起点再发射光线,经过一系列迭代计算,最后将计算出的颜色存储到屏幕空间坐标对应的一张图(RWTexture2D)内。值得一提的是,如果我们对存储有很大的或者特殊的需求,可以使用RWTexture2DArray,在CPU上需要创建一个Texture序列,调用的API与创建Texture是同一个,只需要更改ArraySize的大小。
AccumulatePass
在执行MegakernelPathTracer后,我们事实上只得到了一帧的运行结果,如果就这样显示出来,必然会有许多的噪声。AccumulatePass帮助我们对每帧得到的结果进行叠加,这样就可以快速收敛到一个较好的结果。
ToneMapper
色调映射,不多做解释了。
总结
这篇文章简单介绍了一下NVIDIA的Falcor渲染器,并对预设的PathTracer.py做了一些细节的描述,甚至没有官方的介绍来的详细。单单依靠这篇文章熟悉Falcor是不太可能的,毕竟涉及的方面事实上很少,只是在光追方面做了不太详细的概述。写这篇文章的主要目的是为了让Falcor的初学者有一个入门的途径,不至于陷入迷茫,只是引路的工作而已。如果能让初次使用Falcor的朋友有了深入了解的动力,这篇文章的意义也就达到了。我以后也未必会写更深入的Falcor介绍了,除非我对Falcor的了解能更进一步。
能看到这里的友友,今后也要继续加油捏!
|