zhouqijie

概述

为了渲染逼真的场景,我们需要物理上精确的全局光照算法。




基于图像的光照

许多高级的光照以及着手技术都会大量使用图像数据,这些数据通常是以二维纹理贴图形式表示的。这些技术统称为基于图像的光照(image-based lighting)算法。

基于图像的光照常用的贴图有:法线贴图、高度贴图、环境贴图、镜面/光泽贴图等。




高动态范围光照(HDR)

显示设备只能产生有限的强度范围。这是为何帧缓冲里的色彩通道限于0~1之间的原因。然而在真实世界,光的强度可以任意增大。高动态范围(high dynamic range)光照尝试捕捉如此大范围的光照强度。

使用HDR光照时,不会把计算结果随意截取。其结果影像会以某种格式保存,该格式容许存储大于1的强度。把影像显示于屏幕之前,还需进行色调映射(tone-mapping)处理,把影响的强度调整至显示设备支持的范围。

可以仿造很多真实效果例如从暗处到亮处的短暂失明、敷霜(Bloom)效果等。

HDR影像的表示方法之一 就是把红蓝绿通道各存储为32位浮点数而不是8位浮点数。另一种方法是使用完全不同的色彩模型,例如log-LUV色彩模型就是HDR光照的常用模型。

LUV模型中色彩由一个强度(intensity)通道L和两个色度(chromaticity)通道UV去表示。由于人眼对强度的敏感程度高于色度,所以 L通道用16位存储,而U和V用8位。此外L是以底数为2的对数比例表示的,以捕捉非常大范围的光照强度。




全局光照

全局光照(global illumination,GI)是指一类光照算法。这些光照算法考虑到光从光源传送至摄像机之间与多个物体的互动。

全局光照可营造不同的效果,例如遮挡物产生阴影、反射、焦散、以及一个物体的颜色能溢出至附近的物体。

1.阴影渲染

光源路径被表面遮挡就会产生阴影。最流行的阴影渲染技巧为阴影体积(shadow volume)阴影贴图(shadow map)

软阴影(soft-shadow):有些地方能被光源的一部分照射,不能被光源其他部分照射,该模糊部分称为半影(penumbra)。半影出现的原因是光源有面积。

物体可标识为产生阴影/不产生阴影以及接收阴影/不接受阴影。光源也可以标识为产生阴影/不产生阴影。

阴影体积:

阴影体积技术,会从光源位置观察每个投射阴影的物体并判定物体轮廓边缘(silhouette edge),然后沿着光线方向挤出(extrude)一个几何体,代表光线被遮挡的体积。

阴影体积使用一种特殊的全屏缓冲,称为模板缓存(stencil buffer),它对应屏幕每一个像素存储一个整数值,渲染时可用模板缓冲作为遮罩。

- 步骤一: 首先要渲染一遍没有阴影的场景。 - 步骤二: 把模板缓存清空使每个像素值为0。之后从摄像机视角渲染阴影体积,如果像素属正向三角形就让模板缓冲的值加1,如果是背向三角形就让模板缓冲的值减1。这样一来被遮挡的部分模板值就是1。 > CRE:深度测试应该需要开启? > CRE:摄像机处于一个阴影体积的话,会出现负的模板缓冲? - 步骤三: 把模板值非零区域加深颜色。 > Ye:用加深颜色方式去使用阴影体积,并不能模仿真实情况,例如会看到阴影中的高光。也不能正确渲染多个光源的阴影。较为正确的做法是,第一次渲染场景只渲染ambient和emissive项。之后再对于每个光源分别渲染阴影体积然后用模板缓冲去渲染diffuse和specular光照项。

阴影贴图:

- 步骤一:Rendering From Light 把光源视为摄像机,并记录深度图。 > Ye:平行光使用正交投影渲染阴影贴图,小于180度的聚光灯使用透视投影渲染阴影贴图,点光源可以使用立方贴图(渲染6次场景)或者双抛物面贴图(渲染2次场景)。 - 步骤二:Project To Light 把摄像机看到的点投影回光源,然后比较深度。当深度一致时则被光源照射,深度大则表示不被照射即在阴影中。 - 误差的消除和阴影质量提升: 1. 引入偏差值(bias)来处理精度问题。 2. 使用高分辨率的阴影纹理来提升阴影质量。

Ye:并没有标准方法可以把深度缓冲当作阴影贴图,必须使用个别硬件厂商提供的特殊方法,如果要简单支持所有厂商,须把深度写进色彩缓冲里。

Ye:阴影贴图目前较适合现在的硬件,所以成为主流技术。

2.环境光遮蔽(AO)

环境遮挡(ambient occlusion, AO)是一种用于渲染接触阴影(contact shadow)的技术,所谓接触阴影就是仅以环境光照明时所产生的软阴影。

基于几何方法的AO计算:

AO的度量方法:以某点为球心设一个非常大半径的半球形,然后计算从该点可见的半球表面积占比。

AO通常离线计算并存储为纹理。

屏幕空间环境光遮蔽SSAO:

屏幕空间环境光遮蔽(SSAO)最早出现于《孤岛危机》,是在屏幕空间进行AO计算。

3.反射(reflection)

一般光滑物体的镜面反射可以使用环境贴图。而大面积平面的镜面反射则可以把摄像机位置进行反射变换然后渲染一张纹理,再把纹理应用到该平面上。

4.焦散(caustics)

焦散是指不平整表面产生的不均匀反射/折射现象。例如抖动摇曳的水光。

焦散的渲染通常是通过投影一张动画纹理至受影响的物体表面。

5.次表面散射

次表面散射(sub-surface scattering, SSS)是指光到达表面上一点时,光线会在表面下散射,然后在表面其他位置离开。

SSS可以用BSSRDF表示。

SSS有多种方法可以模拟次表面散射。

基于深度贴图的方法可以通过计算厚度来在背光面加入泛光。

6.预计算辐射传输(PRT)

预计算辐射传输(precomputed radiance transfer, PRT)是一项较新的技术,可以实时模拟基于辐射度算法的渲染方法。

其做法是,预先计算来自所有方向的入射光和表面的互动(反射/折射/散射),并把那些描述存储下来,在运行时,根据某入射光线查表,并把该光线的反射迅速转换为准确的光照结果。

光在某点的反射是一个复杂的函数,需要一个紧凑地表示此函数的方法,才能使PRT技术实用化。常见的方法是使用球谐函数的线性组合逼近此函数

知乎:球谐函数可以看作是将单位球面上的每一点(或者三维空间中的每个方向)映射到一个复数函数值。

(END)