NeRF之体渲染 (Volume Rendering)理解

 光子与粒子

     为了建模这种非刚性物体的渲染,体渲染把气体等物质抽象成一团飘忽不定的粒子群。光线在穿过这类物体时,其实就是光子在跟粒子发生碰撞的过程。

        下图是体渲染建模的示意图。光沿直线方向穿过一堆粒子 (粉色部分),如果能计算出每根光线从最开始发射,到最终打到成像平面上的辐射强度,我们就可以渲染出投影图像。而体渲染要做的,就是对这个过程进行建模。为了简化计算,我们就假设光子只跟它附近的粒子发生作用,这个范围就是图中圆柱体大小的区间。

体渲染把光子与粒子发生作用的过程,进一步细化为四种类型:

  • 吸收 (absorption):光子被粒子吸收,会导致入射光的辐射强度减弱

  • 放射 (emission):粒子本身可能发光,比如气体加热到一定程度就会离子化,变成发光的「火焰」。这会进一步增大辐射强度;

  • 外散射 (out-scattering):光子在撞击到粒子后,可能会发生弹射,导致方向发生偏移,会减弱入射光强度;

  • 内散射 (in-scattering):其他方向的光子在撞到粒子后,可能和当前方向上的光子重合,从而增强当前光路上的辐射强度。

出射光与入射光之间的变化量,可以表示为这四个过程的叠加: 

吸收 (absorbing)

我们先剖析下吸收的过程。

(文章最后提供了常微分方程的求解方法,感兴趣的读者可自行查阅)。

公式 (3) 有丰富的物理意义。

不同光学厚度下,光线透射度对比

放射 (emission)

除了吸收之外,粒子本身也可能发光。

外散射 (out-scattering)

粒子除了吸收光子,也可能会弹射光子,这个过程称为外散射,即光子被弹射出原本的光路,导致光线强度减弱。

内散射 (in-scattering)

光子可以被弹射走,自然就有其他光路的光子被弹射到当前光路,这一过程就是内散射。

内散射的过程比外散射又更加复杂,因为弹射到当前光路的光子可能来自多条不同的光路,因此需要综合考虑其他光路的辐射强度以及各种弹射角度。

体渲染方程

我们把以上四个过程都综合到一个公式中:

计算机中的体渲染

公式 (11) 在计算机中是无法表达的,需要进一步离散化。

常微分方程求解

体渲染公式 (9) 是一种很典型的常微分方程 (ordinary differential equation, ODE)。

总结

这篇文章基本把体渲染建模的原理和公式推导介绍完了,并顺带推出了 NeRF 中最重要的两个公式。从中可以看出,NeRF 对体渲染做了一些简化,但整体上遵循体渲染的模型框架。NeRF 所说的神经辐射场,其实就是用网络来建模场景中的光学厚度以及自发光颜色等信息,这也是 NeRF 最重要的贡献。

下一章会进一步深入 NeRF 的建模过程,看看如何把深度学习融入到整个体渲染框架中,从而实现三维重建。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Cesium中实现渲染需要使用VolumeRendering模块。该模块使用积数据集(包括密度值和颜色值)来生成渲染效果。 以下是一个简单的示例代码,演示如何在Cesium中实现渲染: ```javascript var viewer = new Cesium.Viewer('cesiumContainer'); // 创建积数据集 var volume = new Cesium.Volume({ slices: [ // 每个切片包含一个二维密度数组和一个二维颜色数组 { densities: [0.1, 0.2, 0.3, ...], colors: [new Cesium.Color(1.0, 0.0, 0.0, 0.1), new Cesium.Color(0.0, 1.0, 0.0, 0.2), new Cesium.Color(0.0, 0.0, 1.0, 0.3), ...] }, { densities: [0.4, 0.5, 0.6, ...], colors: [new Cesium.Color(1.0, 0.0, 0.0, 0.4), new Cesium.Color(0.0, 1.0, 0.0, 0.5), new Cesium.Color(0.0, 0.0, 1.0, 0.6), ...] }, ... ], dimensions: new Cesium.Cartesian3(100, 100, 100) }); // 创建渲染器 var renderer = new Cesium.VolumeRenderer({ volume: volume, transferFunction: new Cesium.TransferFunction({ colorMap: Cesium.ColorMapType.HOT }), clippingPlanes: new Cesium.ClippingPlaneCollection({ planes: [ new Cesium.ClippingPlane(new Cesium.Cartesian3(1.0, 0.0, 0.0), 10.0), new Cesium.ClippingPlane(new Cesium.Cartesian3(-1.0, 0.0, 0.0), 10.0), new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, 1.0, 0.0), 10.0), new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, -1.0, 0.0), 10.0), new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, 0.0, 1.0), 10.0), new Cesium.ClippingPlane(new Cesium.Cartesian3(0.0, 0.0, -1.0), 10.0) ] }) }); // 将渲染器添加到场景中 viewer.scene.primitives.add(renderer); ``` 以上示例代码创建了一个积数据集,并使用HOT颜色映射和六个裁剪面创建了一个渲染器。你可以根据需要更改密度值、颜色值、颜色映射和裁剪面来生成不同的渲染效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值