Why Differentiable Rendering?
传统的渲染(正向渲染),是指像游戏渲染画面那样只管从场景到输出结果,不需要考虑太多。然而可微渲染不一样,它要求渲染函数是可导的。
可是,对渲染函数求导有什么作用呢?我们一步步往下看。
反向渲染 Inserve Rendering
反向渲染,顾名思义,和正向渲染相反。正向渲染就是正常的场景参数-渲染结果的流程,通俗地说就是 3D 场景参数-2D 图像 的过程,而反向渲染则是从 2D 图像-3D 场景参数 的过程。
例如一些利用 2D 图像就能渲染出 3D 场景的炫酷软件,它们的核心之一正是反向渲染。
不过,我们不是一开始就能把扫出来的 2D 图像给好好 3D 渲染出来的,最开始渲染出来的结果一定是很粗糙的,与真实值(Ground Truth)有一定的差距,于是我们需要一次次地优化场景参数,利用优化后的场景参数进行渲染,才能逐渐接近 Ground Truth。
正向渲染 - 抽象化表示
、几何体参数 、材质参数 、光照参数 ),然后输出一张图片 。
,则渲染过程可表示为:
这是一个多元函数。
,此时渲染函数变成了一元函数:
核心:场景参数优化
在选择性必修第三册里,我们学习了一定的数理统计知识。例如一元正态线性回归模型、最小二乘法估计参数等。你是否觉得这些知识离应用很远,只是个便于抢分的知识点?待会儿就不是了。你会真的感受到它们在前沿领域中正在扮演着十分重要的角色。
,而与之对应的 3D 重新渲染出的图像序列为 。
和 有差距,那么我们的目的就是尽可能缩小差距。如何量化这个差距呢?这就是课本里的“随机误差”,它定义如下:
是预测值, 是真实值。它们分别对应我们的渲染值和 Ground Truth。
的例子来说明,也就是找出参数 让总体随机误差平方和:
达到最小,这就是最小二乘法。课本教的方法是暴力构造出一个二次函数,得到了 的最小二乘估计:
在 处取得最小值的方法,进一步地,想到前不久才学习过的导数,我们能不能利用导数的方法进行研究呢?
这就是可微渲染中的“微”!
不过很遗憾,高中只学一元函数的导数,没学多元的,这里 是个二元函数。多元函数的导数称为偏导数,大学才学。不过引入偏导数会让推导过程变得十分直观简洁,在《概率论与数理统计》里,推导 最小二乘估计的篇幅只有高中教材的一小半。
不过,我们知道了利用求导来最小化随机误差平方和,即最小二乘,是个好办法。
实际上是个非常非常复杂的函数(和 The Rendering Equation 有关的多重积分),求出某一点导数的解析解几乎是不可能的,于是我们发明了梯度下降法(Gradient Descent),这是一种不求解析解的数值求导方法,用于解决最小二乘估计的问题。
。例如渲染函数 的导数可以记作 ,为了便于理解,我们写成一个喜闻乐见的形式:
这下看懂了。
定义一个总体随机误差平方和 ,其中 是优化的场景参数。
我们的目的,是要让:
使平方和最小。
和 复合起来的函数,于是我们可以使用在选择性必修第二册里学到的链式法则:
得到
进行求导了。对渲染函数进行求导,就是可微渲染的核心部分。
求了导还没完,别忘了最终目的是优化参数。接着,我们使用梯度下降法不断更新参数,就可以找出 了。
哇袄,这不就纯纯是机器学习,跟图形学有个毛的关系啊!(确实没啥关系
可微渲染的主要工作
学术界的工作就是集中研究如何更好地求出 。
它是非常费脑筋的。渲染方程本身复杂多变,例如它里面的 Visibility 函数就处处充斥着不连续性。
不连续就必不可导,如果一个渲染器的算法存在不连续性,可微渲染将会变得十分困难,虽然理论上可以使用近似差分的方法,然而始终是没有拿得出手的效果。
由于计算机视觉、机器学习的火热,学术界在最近几年产出了很多成果。例如来自 MIT CSAIL 的论文 "Differentiable Monte Carlo Ray Tracing through Edge Sampling",它从采样出发,分别使用 Edge Sampling 和 Area Sampling 两种不同的策略去处理渲染方程的导数。
考虑到这篇文章的定位,故不打算讲渲染方程了(前面的区域以后再来探索吧
Future
可微渲染同时是计算机图形学、计算机视觉和机器学习中的前沿领域。随着 AI 的不断普及,可微渲染的重要性将会越来越高。
Reference
[1]《普通高中教科书 数学 选择性必修 第三册》,人民教育出版社,2019.