Neural Radiance Caching

本文介绍了Thomas Müller等人在SIGGRAPH 2021上发表的Neural Radiance Caching技术,该技术使用神经网络存储辐射缓存,替代传统的球谐函数,以提高实时光线追踪的质量。通过在线训练网络,在渲染过程中实时更新,有效解决了实时光追中黑像素的问题。文章还提到了如何使用训练集和反向传播计算能量值,以及采用指数移动平均稳定网络权重,实现了在保持高质量渲染的同时,降低计算开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论文链接

视频链接

这是 Thomas Müller 等人在 SIGGRAPH 2021 上发表的。论文写的有点 pedantic,没有看懂,但是看了视频就懂了。

Radiance Caching

Radiance Caching 是个老算法了。主要就是把一个点辐射出的 Radiance 编码成 Spherical Harmonics,然后在实时渲染中帮助做 shading。可以作为 precomputation 算法,也可以用来加速实时光追。

Irradiance Caching, Radiance Caching and Pre-convolved Radiance Caching

Pre-convolved Radiance Caching 这篇文章里写的很清楚了:Radiance Caching (Middle row, Right) projects incoming radiance into the SH basis, for every pixel converts the BRDF into SH and
performs a dot-product between two dense vectors per pixel.

Neural Radiance Caching

首先是 Radiance Caching 在实时光追中的应用。我们知道,离线渲染的时候,一条 Ray 可以 bounce 多次,如 64;而实时光追中,往往只能 bounce 一次。或者说,离线渲染里的 path 是很长的,实时光追里的 path 是很短的。

那如果说一条光线已经完成 bounce 了,但没有 hit 到 light source 或者 skybox,没法计算能量,那就只能抛弃了,这就导致渲染图上的黑像素。当然,使用一些重要性采样算法,比如 Bitterli 的 ReSTIR 可以很好地改善:

ReSTIR

但如果有 Radiance Cache 的加持的话,那些没有得到能量的 ray,可以直接查找最后一次交点在 Radiance Cache 上的值,就知道能量是多少了。因此 Radiance Cache 可以改善实时光追质量。

这篇文章非常 NB 地用神经网络来存储 Radiance Cache,而不是用球谐函数,就是说训练了一个黑箱 N N N,可以方便地得到点 x \mathbf{x} x 处的 Radiance L s L_s Ls

L s = N

### 实现 Neural Radiance Fields (NeRF) 的 Julia 版本 Neural Radiance Fields 是一种用于从多视角图像合成新视图的技术。该方法通过训练一个连续的场景函数来表示三维环境中的辐射度,从而能够渲染高质量的新视角图像。 在 Julia 中实现 NeRF 需要几个关键组件: 1. **数据准备** 数据集通常由一组不同角度拍摄的对象或场景的照片组成。这些照片需要经过预处理以便于后续模型训练[^1]。 2. **网络架构设计** 使用深度学习库 Flux 或 Knet 来构建一个多层感知器(MLP),这个 MLP 将位置坐标作为输入并预测对应的颜色和体积密度值。为了提高效率,可以采用分层采样策略以及引入空间编码技术如 Positional Encoding[^2]。 3. **损失函数定义** 定义合适的损失函数对于优化至关重要。常见的做法是计算预测像素颜色与真实图片之间的均方误差(MSE)[^3]。 4. **渲染过程模拟** 渲染阶段涉及到沿着射线积分得到最终观察到的颜色。这一步骤可以通过数值积分完成,在实践中常用的方法有反向投影法等[^4]。 下面是一个简单的伪代码框架展示如何用 Julia 和 Flux 库搭建基本版 NeRF: ```julia using Flux, Statistics, Random struct NerfModel model::Chain end function positional_encoding(x, L=10) encoded = [] for i in 0:L-1 push!(encoded, sin.(2^(i)*π*x)) push!(encoded, cos.(2^(i)*π*x)) end vcat(encoded...) end # 初始化神经网络结构 nerf_model = Chain( Dense(63, 256, relu), Dense(256, 256, relu), Dense(256, 256, relu), Dense(256, 4) ) # 训练循环简化版本 for epoch in 1:num_epochs # 获取一批次的数据 batch_data = get_batch() # 前向传播 predictions = nerf_model(positional_encoding(batch_data["points"])) # 计算损失 loss_value = mean((predictions .- batch_data["colors"]) .^ 2) # 反向传播更新参数... end ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值