跳转至

8 Advanced Topics in Rendering

文本统计:约 1885 个字

8.1 Advanced Light Transport

Biased vs. Unbiased Monte Carlo Estimators

  • An unbiased Monte Carlo technique does not have any systematic error : The expected value of an unbiased estimator will always be the correct value, no matter how many samples are used

  • Otherwise, biased : One special case, the expected value converges to the correct value as infinite #samples are used — consistent

总的来说就是无偏差是等于的意思,而有偏差是随着样本量增加而收敛的意思。

8.1.1 Unbiased light transport methods

8.1.1.1 Bidirectional Path Tracing (BDPT)

  • Trace sub-paths from both the camera and the light
  • Connects the end points form both sub-paths

对于光源部分的光线传递比较困难的模型比较适合用 BDPT

Note

相当于对光源进行一次预处理,将发光的小光源处理为一次反射的一个大光源

8.1.1.2 Metropolis Light Transport (MLT)

A Markov Chain Monte Carlo (MCMC) application

  • Jumping from the current sample to the next with some PDF
  • Very good at Locally exploring difficult light paths

思想在于对一条有效路径周围扰动后继续采样

对于复杂光路场景运用这种方法效果很好

缺点:难以估计收敛速度;所有操作都是局部的,无法保证每个像素收敛速度相同,从而的得到的图比较脏,因此通常不用来渲染动画。

8.1.2 Biased light transport methods

8.1.2.1 Photon Mapping

  • 适合渲染caustics(焦散)

  • Very good at handling Specular-Diffuse-Specular (SDS) paths and generating caustics

光子映射的一种实现方法

  • 光子从光源被源源不断地打出来,经过反射、折射,在diffuse表面会停下来;从摄像机开始往各个方向打多种路径,经过反射折射等也会在diffuse表面停下来。

  • 局部密度估计 (local density estimation):光子分布越集中越亮,因此对任何一个着色点取周围最近的N个光子,找出这N个光子的占据的面积,从而算出密度。

为什么是有偏差的?我们需要计算的是\(\text{d}N/\text{d}A\), 但我们实际计算的是\(\Delta N/\Delta A\),二者并不相同。

当N取较小时,噪声大,N取较大时,会模糊。一般应该取足够小的面积即让\(\Delta A\)足够小,选择面积内的光子数量来计算密度。顺应这个思路,当打出的光子足够多时,相对面积就会很小。

若取固定的面积来计算,当光子很多时,会导致面积内光子变多,造成结果依旧不准确。我们需要的是收敛的结果。

8.1.2.2 Vertex Connection and Merging

A combination of BDPT and Photon Mapping

主要思想:

  • Let’s not waste the sub-paths in BDPT if their end points cannot be connected but can be merged

  • Use photon mapping to handle the merging of nearby “photons”

在子路径端点很接近时运用光子映射合并。

8.1.3 Instant Radiosity

将已经照亮的表面认为是虚假光源,用这些虚假的光源进行进一步的渲染。

  • Shoot light sub-paths and assume the end point of each sub-path is a Virtual Point Light (VPL)

  • Render the scene as usual using these VPLs

优势:快并且能在复杂场景中给出较好结果(比如下左图,两侧都是光源)

劣势:渲染出来有些地方可能会莫名地发光(比如下右图)。不能针对glossy的物体

8.2 Advanced Appearance Modeling

8.2.1 Non-Surface Models

8.2.1.1 Participating Media

云,雾。光打过来会被小颗粒散射到四面八方。

使用相位函数 (Phase Function) 来描述光在散射介质中的分布

如何渲染?光线往某方向走多远取决于介质的吸收能力,遇到小颗粒会反射,在任何一点都可能改变方向,找到一个与光源相连的路径计算其贡献。

8.2.1.2 Hair Appearance

考虑光线与每根头发的作用

Kajiya-Kay Model: 光线打到头发上发生散射形成一个圆锥

Marschner Model: 光线不仅会反射(R),穿进头发发生折射(T),穿进头发再穿出(TT),穿透反射再穿透(TRT)

将头发当成一个玻璃圆柱,外层叫 cuticle,里面叫 cortex。

Fur Appearance

不能使用人的头发渲染方法来渲染动物的毛。生物结构上不同。动物的毛的髓质多。

使用双层圆柱模型来建模动物毛发,更为复杂。

8.2.1.3 Granular (颗粒) Material

远看是沙丘,近看是小颗粒堆积的。

8.2.2 Surface Models

8.2.2.1 Translucent Material

透光性材质,比如说玉石,水母等等物体的材质

Subsurface Scattering: 次表面散射

由于光线进入的地方与出去的地方并不相同而导致的一些表面的视觉特性

Scattering Functions

类似于 BRDF 我们定义了一个新的量称为 BSSRDF,规定了在某个点进来的光线到另一个点出去的光线的相关系数

\[ S(x_i,\omega_i,x_o,\omega_o) \]

那么这时我们的渲染方程就变为了

\[ L(x_o,\omega_o)=\int_A\int_{H^2}S(x_i,\omega_i,x_o,\omega_o)L_i(x_i,\omega_i)\cos\theta_i\text{ d}\omega_i\text{d}A \]

Dipole Approximation 通过引入两个点光源来近似次表面散射的效果(上面的光源是为了增强真实感引入的)。

BRDF vs BSSRDF

8.2.2.2 Cloth

布料是一系列缠绕的纤维组成的

缠绕有两级:纤维(Fiber)第一次缠绕会成为股(Ply),股(Ply)缠绕会成为线(Yarn)。

然后再将线编织为布料(左图更像机器织的,右图就是人工织的结果)

这样的布料有三种渲染的方式

(1)Render as Surface: 给定编制的模式,然后得到结果,是一种基于BRDF的模型

当然这种模型在遇到天鹅绒这样的材质的时候,就不是特别合理了

(2)Render as participating Media: 把单根纤维的性质与纤维的分布转化为散射有关的参数,渲染布料就如同渲染云和雾那样来做。

(3)Render as Actual Fibers: Render every fiber explicitly,对每根纤维都进行单独渲染

8.3 Detailed Appearance

尽管说我们得到结果已经很不错了,但是看上去依然缺少真实感,主要原因是我们渲染出来的结果太完美了。

比如说上面的车子,即使是新车也不可能表面如此光滑,现实中的结果往往如下图所示

回忆一下微表面模型,对于 NDF (Normal Distribution Function)

于是我们可以选择给表面进行法线贴图,然而对于微表面模型来说,由于每个表面都被认为是镜面反射,我们的路径很难达到光源上

所以我们选择对一个像素进行整体考虑,然后得到一个像素覆盖的微表面的法线分布,接着替代原来光滑表面的法线。

然后对于不同的范围,法线分布随着范围的增大越有统计学特征,在范围较小的情况下,细节更多。

8.4 Recent Trend: Wave Optics

当我们引入细节的时候,几何光学的结果不能满足我们的需求了,需要引入波动光学

波动光学得到的 BRDF 相比于几何光学是不连续的

8.5 Procedural Appearance

程序化生成图像,不需要纹理贴图来定义细节。需要查询的时候生成

3D noise(噪声函数) 可以直接通过噪声函数来计算细节,使用这种方法可以看到被切割或断裂的内部纹理。

比如说

if noise(x,y,z) > threshold:
    reflectance = 1
else
    reflectance = 0

应用于地形,水面,木头

评论区

对你有帮助的话请给我个赞和 star => GitHub stars
欢迎跟我探讨!!!