NeRF在镜面反射上,有着许多artifacts,有两个原因。一个是,用外向辐射作为视角,不好插值;另一个是,NeRF会用各向同相的内部光源来假装镜面反射,结果是半透明或雾状的artifacts。
Ref-NeRF用反射光作为输入,因为表面的取向不影响它,因此MLP能在上面更好地插值。
一个问题是,反射光需要找法向量,而NeRF生成的geometry不够好,上面的法向量噪声过多。Ref-NeRF在volume density上加了一个新的正则化器,激励volume density集中在表面上,同时获得更好的法向量。
用入射光和法向量求反射光(入射光其实是发射的)
\[\mathbf{\omega_r} = 2(\mathbf{\omega_o}\cdot \mathbf{n})\mathbf{n} -\mathbf{\omega_o} \]在现实中,辐射不能仅仅用反射方向来表示,考虑到粗糙和光滑材质的区别,引入了Integrated Directional Encoding (IDE) 让MLP能表示材质的粗糙度。
首先,不用sin函数做encoding了,改用一系列球谐函数,保证了球面上的不变性。
接下来,用encode反射向量分布的方法,让MLP可以推理材质粗糙度,并引入参数\(\kappa\)表征粗糙度。
通过解耦漫反射和镜面反射的组成,进一步简化外向辐射的函数。根据定义,漫反射颜色只与位置有关,将真实颜色拆解为
\[\mathbf{c} = \gamma (\mathbf{c}_d+\mathbf{s}\odot \mathbf{c}_s) \]其中\(\mathbf{c}_d\)是漫反射颜色,\(\mathbf{s}\)是spatial MLP输出颜色,\(\mathbf{c}_s\)是directional MLP输出颜色。
将spatial MLP的输出b,作为directional MLP的输入,让它更好地表征位置变化带来的影响。
好的反射向量,依赖于好的法向量,然而NeRF出来的volume density很凌乱,而且NeRF会用内部各向同性的光源来假装反射光,这是一个局部最优解。
为了解决第一个问题,即法向量噪声多的问题,Ref-NeRF使用预测的法向量来计算反射方向,从spatial MLP中得到一个三维向量,正则化以后作为预测的法向量。MLP预测的法向量比梯度算出来的更光滑,因为梯度算子在MLP的插值卷积核上是一个高通滤波器的作用。
为了解决第二个问题,使用正则函数来惩罚雾状表面,从而避免NeRF用藏在半透明面后的内部发光源来解释镜面反射。