欢迎来到nerf最核心的公式证明:怎么合成一条光线上的所有粒子的图像?
- nerf认为,图像上一个像素的rgb值 = 从观察点发出,沿着这个像素方向的一条光线上所有粒子的颜色和密度的合成。
- 那就需要知道:每个位置的颜色和密度RGBσ。 这个可不好算,就用一个神经网络FΘ表达,然后训练得到。
- 通过输入样本图像与 神经网络FΘ输出的RGBσ生成的图像 的 不同来训练的优化神经网络FΘ 以使其准确。
- 知道每个位置的颜色和密度RGBσ,就完成了三维重建。 因为可以用RGBσ生成任意视角的图像,也可以转换为三角网。
- 场景由发光粒子组成。
- 一条光线上所有位置上的颜色和密度的合成,就是图上的像素RGB值。
- 只考虑粒子对光线的吸收(由密度σ决定)和发射(由颜色值rgb决定)。
- 发光粒子的密度σ:只跟位置x,y,z有关。 也就是r(t)。
- 发光粒子的颜色rgb:除了跟位置x,y,z有关,还有观察角度θ,φ有关。也就是与(r(t),d)相关。
这里假设已经建立神经网络FΘ(x,y,z,θ,φ)=RGBσ可以得到任意位置的颜色和密度。
- 已知:一条光线上任意位置的颜色和密度RGBσ。
- 求:这条光线合成的像素点在图像上的RGB值。
- 分析单点P对成像的贡献。P距离距线起点的距离为t, 然后根据上一篇光线的表示知道P点的坐标r(t)
- 密度越高,透明度越低,所以单看P点,它的成像颜色就是 c x σ
- σ=1.0:完全不透明,它的成像颜色就是c x 1.0 = c
- σ=0.0:完成透明,它的成像颜色就是c x 0.0 = 0
- 同时,光线从相机出发,由于密度σ的存在,强度不断减弱,不一定能到到P点,到达的概率时记为Τ(t)
- 可以想象,Τ应该是密度δ和距离t的函数
- 那么汇总到一起:场景中一点P对光线成像的贡献:Τ(t) x c(r(t),d) x σ(r(t))。
- 其中r(t)是光线上点的坐标,d是光线方向,t是光线上点与相机中心距离。
- 密度越高,透明度越低,所以单看P点,它的成像颜色就是 c x σ
- 整条光线成像:知道了的单点,整条光线成像就是对光线上所有的点求积分,且考虑光线只需有限区间tn-tf之间,得光线r成像:
- 上面(2)式式连续函数积分,计算机不好算,来把它离散化
- 离散化:把光线分成N段,不要求一定等分,C(r)变成求每一段的积分 然后再累加。
- t_1是起点
- t_1 到 t_2是 第1段
- t_2 到 t_3是 第2段
- t_i 到 t_{i+1}是 第i段
- t_N 到 t_{N+1}是 第N段, 最后一段
- 假设每一段内有恒定的颜色和密度, 且每一段不一样