【Paper阅读】NeRV: Neural Reflectance and Visibility Fields for Relighting and View Synthesis
本篇文章主要专注于实现NeRF的Relighting,也就是试图对NeRF场对应的场景进行编辑。
在Introduction中,作者提到,传统意义上的NeRF,全称为Neural Radiance Field,实际上计算的是整个场每个点的出射radiance,而本篇文章提出的NeRV则是Neural Reflectance and Visibility Field,实际上是将整个场分成了两部分,一部分负责计算反射(依照文中意思基本等于计算材质着色),另一部分则是负责计算场内两点之间的可见性。这后面实际上代表了神经网络对于场景的两种抽象:NeRF仅仅考虑场景中粒子发射的光,而NeRV则更加物理上合理,考虑了粒子吸收和反射的光。
一些阅读Paper带来的问题
首先,我可能之前对于Relighting的理解有问题,总之文中在谈到Relighting的时候似乎是在假定这样一个场景:我们应该从已有的照片中分离出材质(可以认为是Reflectance Field)和几何(可以认为是Visibility Field),至于光源信息是可以不用管的。而在训练得到这个总和的Field之后,我们需要的就是自行随意设定光源信息,来进行计算。
而我之前认为的Relighting,可能是需要将光源信息也分析出来之后,甚至训练出一个代表光源的MLP。但是从可用性来说确实本文所阐述的思路更为合理。
另一个问题在于自己对BRDF的模型实在是基本忘完了,看的时候发现BRDF在最经典的模型下竟然除了BaseColor就一个参数……(但是好像也是这篇文章中没有或者故意避开了金属度这个参数,然而在展示中又展现了金属材质,属实有点讨巧)
以上是阅读中产生的一些吐槽问题。
内容
下面开始简要过一遍该paper。
本文比较重要的一个思路是按照图形学里求解渲染方程的一个常见思路,将可见项和BRDF项分开处理。因此就像开始的时候我们所说的,本文将传统意义上的Radiance Field分成了两部分:Visibility Field和Reflectance Field。同时,这篇文章还将直接光照和间接光照分开讨论,来试图达到全局光照的效果。
(实际上最关键的就是这个公式中的四张图分别是怎么得到的)
Reflectance Field
文章中提到的处理反射的场,实际上按照原文来说应该是由两个MLP组成的,一个MLP负责导出密度及法线,一个MLP负责导出BRDF的参数(一个三维的albedo以及一个粗糙度值)。
BRDF
可以通过Reflectance Field训练完的MLP直接得到。
Direct Illumination
Reflectance Field的任务实际上是为了之后求出任意一个点的直接光照。Reflectance Field可以让我们获取任意一个点的BRDF的环境贴图,但是仅仅只有环境贴图是不够的,我们还需要光源信息。
这里对于光源信息的处理文章中似乎省去了一部分,实际上最关键的地方在于如何获取Direct Illumination的环境贴图。简单来说,我们就单纯就从像素打到的这个点开始出发向环境贴图的像素发射射线,让这些射线和光源包围盒求交,同时不要忘记衰减。这样就可以获取一份直接光照贴图。直接光照贴图获取之后,整个流程就相对清晰很多了。我们基本上就可以得到直接光照部分的结果了。
Visibility Field
Visibility Field的输入实际上是空间中任意一个点和任意一个方向,得到的输出是从这个点出发这个方向上的可见性($V$)以及深度($D$)。
以下这张图表示的应该更清晰。其中$\sigma(x)$表示传统NeRF中的密度。
Light Visibility
通过训练完的Visibility Field的MLP可以直接得到。
Indirect Illumination
文章中专门强调了这里的间接光照有两个近似:一个是我们这里考虑的间接光照都是One-Bounce的,也就是说,我们只计算一次光线弹射;另一个就是我们这里的间接光照都是单纯按照One-Bounce打到位置的直接光照来近似的。
这里在得到One-Bounce对应的光照时,也是利用Visibility Field内得到的Depth值获取的。可以得到One-Bounce之后打到的位置,同时再重新得到这个位置应该得到的直接光照,考虑衰减之后成为该点在这个方向上的间接光照。
到这里,以上四张图都可以得到了,我们就可以理解整个渲染的流程了。