0%

【Real-Time Rendering】基于图像的渲染技术总结

本篇对《Real-Time Rendering》一书中基于图像的渲染技术进行概括总结和扩展。以综述形式为主,许多内容已经实现过或学习过,其他概念只需了解即可,主要内容包括:

  • 谱渲染 The Rendering Spectrum
  • 固定视角的渲染 Fixed-View Rendering
  • 天空盒 Skyboxes
  • 光场渲染 Light Field Rendering
  • 精灵与层 Sprites and Layers
  • 公告板 Billboarding
  • 粒子系统 Particle System
  • 颜色校正 Color Correction
  • 色调映射 Tone Mapping
  • 镜头眩光和泛光 Lens Flare and Bloom
  • 景深 Depth of Field
  • 运动模糊 Motion Blur
  • 体渲染 Volume Rendering

1 谱渲染

众所周知,渲染的目的就是在屏幕上渲染出物体,至于如何达到结果,主要依赖于用户的选择,白猫黑猫,抓到老鼠的就是好猫。而用多边形将三维物体显示在屏幕上,并非是进行三维渲染的唯一方法,也并非是最合适的方法。多边形具有从任何视角以合理的方式表示对象的优点,当移动相机的时候,物体的表示可以保持不变。但是,当观察者靠近物体的时候,为了提高显示质量,往往希望用比较高的细节层次来表示模型。与之相反,当物体位于比较远的地方时,就可以用简化形式来表示模型。这就是细节层次技术 (Level Of Detail,LOD)。使用 LOD 技术主要目的是为了加快场景的渲染速度。还有很多技术可以用来表示物体逐渐远离观察者的情形,比如,可以用图像而不是多边形来表示物体,从而减少开销,加快渲染速度。另外,单张图片可以很快地被渲染到屏幕上,用来表示物体往往开销很小。

Lengyel 于 1998 在《The Convergence of Graphics and Vision》一文中提出了一种表示渲染技术连续性的方法,名为 The Rendering Spectrum 渲染谱,如下图所示。

image-20220518135741473

下面是论文中更具体的图示:

image-20220518135757327

可以将渲染谱理解为渲染的金字塔。从左到右,由简单到复杂,由二维图像到几何模型,从外观特征到物理渲染。

2 固定视角的渲染

固定视角的渲染(Fixed-View Rendering)技术,通过将复杂几何模型转换为可以在多帧中重复使用的一组简单的 buffer 来节省大量渲染时间与性能。
对于复杂的几何和着色模型,每帧去重新渲染整个场景很可能是昂贵的。可以通过限制观看者的移动能力来对渲染进行加速。 最严格的情况是相机固定在位置和方位,即根本不移动。而在这种情况下,很多渲染可以只需做一次。
例如,想象一个有栅栏的牧场作为静态场景,一匹马穿过它。牧场和栅栏渲染仅一次,存储其颜色和 Z 缓冲区。每帧将这些 buffer 复制到可显示的颜色和 Z 缓冲中。为了获得最终的渲染效果,马本身是需要渲染的。如果马在栅栏后面,存储和复制的 z 深度值将把马遮挡住。请注意,在这种情况下,马不能投下阴影,因为场景无法改变。可以进行进一步的处理,例如,可以确定出马影子的区域,根据需求进行处理。关键是对于要显示的图像的颜色何时或如何设置这点上,是没有限制的。固定视角的特效(Fixed-View Effects)可以通过将复杂几何模型转换为可以在多帧中重复使用的一组简单的 buffer 来节省大量时间。

3 天空盒

对于一些远离观众的物体,观众移动时几乎没有任何视差效果。换言之,如果你移动一米,甚至一千米,一座遥远的山本身看起来通常不会有明显的不同。当你移动时,它可能被附近的物体挡住视线,但是把那些物体移开,山本身看起来也依旧一样。天空盒就属于这种类型的物体。

环境贴图(environment map)可以代表本地空间入射光亮度。虽然环境贴图通常用于模拟反射,但它们也可以直接用来表示环绕环境的远处物体。任何独立于视图的环境地图表示都可以用于此目的;立方体贴图(cubic maps)是最为常见的一种环境贴图。环境贴图放置在围绕着观察者的网格上,并且足够大以包含场景中所有的对象。且网格的形状并不重要,但通常是立方体贴图。

image-20220518140529046

4 光场渲染

所谓光场(Light Field),可以理解为空间中任意点发出的任意方向的光的集合。而光场渲染(Light Field Rendering),可以理解为在不需要图像的深度信息或相关性的条件下,通过相机阵列或由一个相机按设计的路径移动,把场景拍摄下来作为输出图像集。对于任意给定的新视点,找出该视点邻近的几个采样点进行简单的重新采样和插值,就能得到该视点处的视图。

5 精灵与层

最基本的基于图像的渲染的图元之一便是精灵(sprite)。精灵(sprite)是在屏幕上移动的图像,例如鼠标光标。精灵不必具有矩形形状,而且一些像素可以以透明形式呈现。对于简单的精灵,屏幕上会显示一个一对一的像素映射。存储在精灵中的每个像素将被放在屏幕上的像素中。可以通过显示一系列不同的精灵来生成动画。

更一般的精灵类型是将其渲染为应用于总是面向观看者的多边形的图像纹理。图像的 Alpha 通道可以为 sprite 的各种像素提供全部或部分透明度。这种类型的精灵可以有一个深度,所以在场景本身,可以顺利地改变大小和形状。一组精灵也可以用来表示来自不同视图的对象。对于大型物体,这种用精灵来替换的表现效果会相当弱,因为从一个精灵切换到另一个时,会很容易穿帮。也就是说,如果对象的方向和视图没有显着变化,则给定视图中的对象的图像表示可以对多个帧有效。而如果对象在屏幕上足够小,存储大量视图,即使是动画对象也是可行的策略。

考虑场景的一种方法是将其看作一系列的层(layers),而这种思想也通常用于二维单元动画。每个精灵层具有与之相关联的深度。通过这种从前到后的渲染顺序,我们可以渲染出整个场景而无需 Z 缓冲区,从而节省时间和资源。

6 公告板

我们将根据观察方向来确定多边形面朝方向的技术叫做公告板(Billboarding)。而随着观察角度的变化,公告板多边形的方向也会根据需求随之改变。与 alpha 纹理和动画技术相结合,可以用公告板技术表示许多不具有平滑实体表面的现象,比如烟,火,雾,爆炸效果,能量盾(Energy Shields),水蒸气痕迹,以及云朵等。比如下图的树:

image-20220518141422780

给定表面的法线向量 n 和近似向上方向的向量 u,通过创建一组由三个相互垂直的向量,就可以确定公告板的方向。如下图:

image-20220518141522323

其中,左图是互相垂直的 u 和 n。中图是 r 向量通过 u 和 n 的叉乘得到,因此同时垂直于 u 和 n,而在右图中,对固定向量 n 和 r 进行叉乘就可以得到与他们都垂直的的向上向量 u’。

有三种不同类型的 Billboard,分别是:

  • Screen-Aligned Billboard 对齐于屏幕的公告板:这里的 n 是镜头视平面法线的逆方向,u 是镜头的 up 方向
  • World-Oriented Billboard 面向世界的公告板:不能直接使用镜头的 up 做 up,因为镜头旋转了,并且所画的 billboard 原本是应该相对世界站立的,按 Screen-Aligned 的做法就会随镜头旋转,所以此时应该 r = u * n(u 是其在世界上的 up,n 是镜头视线方向的逆方向),最后再计算一次 u‘ = r * n,即 u’ 才是最后的 up,即非物体本身相对世界的 up,亦非镜头的 up。
  • Axial Billboard 轴向公告板

所以公告板技术是一种看似简单其实较为复杂的技术,它的实现变种较多。归其根本在于:

  • View Oriented / View plane oriented 的不同
  • Sphere/ Axial 的不同
  • Camera up / World up 的不同

如 View Oriented 和 View plane oriented 的不同,得到的公告板效果就完全不同:

image-20220518142041015

下图是使用公告板技术渲染的云层:

image-20220518142105766

另外还有一种特殊的公告板技术:替代物(Impostors),替代物是通过从当前视点将一个复杂物绘制到一幅图像纹理上来创建的,其中的图像纹理用于映射到公告板上,渲染过程与替代物在屏幕上覆盖的像素点数成正比,而不是与顶点数或者物体的复杂程度成正比。替代物可以用于物体的一些实例上或者渲染过程的多帧上,从而使整体性能获得提升。

使用 Imposters 的一个问题是渲染的图像必须持续地面向观察者。如果远处的物体正在改变方向,则必须重新计算 Imposters 的朝向。而为了模拟更像他们所代表的三角形网格的远处物体,D´ecoret 等人提出了公告板云(Billboard Clouds)的想法,即一个复杂的模型通常可以通过一系列的公告板集合相互交叉重叠进行表示。我们知道,一个真实物体可以用一个纸模型进行模拟,而公告板云可以比纸模型更令人信服,比如公告板云可以添加一些额外的信息,如法线贴图、位移贴图和不同的表面材质。另外,裂纹沿裂纹面上的投影也可以由公告板进行处理。而 D´ecoret 等人也提出了一种在给定误差容限内对给定模型进行自动查找和拟合平面的方法。

7 粒子系统

粒子系统(Particle System)是一组分散的微小物体集合,其中这些微小物体按照某种算法运动。粒子系统的实际运用包括模拟火焰,烟,爆炸,流水,树木,瀑布,泡沫,旋转星系和其他的一些自然现象。粒子系统并不是一种渲染形式,而是一种动画方法,这种方法的思想是在粒子的生命周期内控制他们的产生,运动,变化和消失。

除了爆炸,瀑布,泡沫以及其他现象以外,还可以使用粒子系统进行渲染。例如,可以使用粒子系统来创建树木模型,也就是表示树木的几何形状,当视点距离模型较近时,就会产生更多的粒子来生成逼真的视觉效果。下图是用粒子系统渲染的树木:

image-20220518142415857

8 图像处理

图像处理的过程,一般在像素着色器中进行,因为在像素着色器中,可以很好地将渲染过程和纹理结合起来,而且在 GPU 上跑像素着色器,速度和性能都可以满足一般所需。
一般而言,首先需要将场景渲染成 2D 纹理或者其他图像的形式,再进行图像处理,这里的图像处理,往往指的是后处理(post effects)。而下文将介绍到的颜色校正(Color Correction)、色调映射(Tone Mapping)、镜头眩光和泛光(Lens Flare and Bloom)、景深(Depth of Field)、运动模糊(Motion Blur),一般而言都是后处理效果。

9 颜色校正

色彩校正(Color correction)是使用一些规则来转化给定的现有图像的每像素颜色到其他颜色的一个过程。颜色校正有很多目的,例如模仿特定类型的电影胶片的色调,在元素之间提供一致的外观,或描绘一种特定的情绪或风格。一般而言,通过颜色校正,游戏画面会获得更好的表现效果。

颜色校正通常包括将单个像素的 RGB 值作为输入,并向其应用算法来生成一个新的 RGB。颜色校正的另一个用途是加速视频解码,如 YUV 色彩空间到 RGB 色彩空间的转换。基于屏幕位置或相邻像素的更复杂的功能也可行,但是大多数操作都是使用每像素的颜色作为唯一的输入。

对于一个计算量很少的简单转换,如亮度的调整,可以直接在像素着色器程序中基于一些公式进行计算,应用于填充屏幕的矩形。而对于复杂的计算函数,一个通常使用的方法是使用查找表(Look-Up Table,LUT)。由于从内存中提取数值经常要比复杂的计算速度快很多,所以使用查找表进行颜色校正操作,速度提升是很显著的。

10 色调映射

计算机屏幕具有特定的亮度范围,而真实图像具有更巨大的亮度范围。色调映射(Tonemapping),也称为色调复制(tone reproduction),便是将宽范围的照明级别拟合到屏幕有限色域内的过程。色调映射与表示高动态范围的 HDR 和 HDRI 密切相关:

  • HDR,是 High-Dynamic Range(高动态范围)的缩写
  • HDRI 是 High-Dynamic Range Image 的缩写,即 HDR 图像,高动态范围图像
  • 实际过程中,HDR 和 HDRI 两者经常会被混用,都当做高动态范围成像的概念使用,这也是被大众广泛接受的

本质上来讲,色调映射要解决的问题是进行大幅度的对比度衰减以将场景亮度变换到可以显示的范围,同时要保持图像细节与颜色等表现原始场景的重要信息。

根据应用的不同,色调映射的目标可以有不同的表述。在有些场合,生成“好看”的图像是主要目的,而在其它一些场合可能会强调生成尽可能多的细节或者最大的图像对比度。在实际的渲染应用中可能是要在真实场景与显示图像中达到匹配,尽管显示设备可能并不能够显示整个的亮度范围。

简单来说,整个 Tone Mapping 的过程就是首先要根据当前的场景推算出场景的平均亮度,再根据这个平均亮度选取一个合适的亮度域,再将整个场景映射到这个亮度域得到正确的结果。

具体关于色调映射算法可以查看:

11 镜头眩光和泛光

镜头眩光(Lens flare)是由于眼睛的晶状体或者相机的透镜直接面对强光所产生的一种现象,由一圈光晕(halo)和纤毛状的光环(ciliary corona)组成。光晕的出现是因为透镜物质(如三棱镜)对不同波长光线折射数量的不过而造成的,看上去很像是光周围的一个圆环,外圈是红色,内圈是紫红色。纤毛状的光环源于透镜的密度波动,看起来像是从一个点发射出来的光线。Lens flare 是近来较为流行的一种图像效果,自从我们认识到它是一种实现真实感效果的技术后,计算机便开始模拟此效果。

image-20220518143849029

泛光(Bloom)效果,是由于眼睛晶状体和其他部分的散光而产生,在光源附近出现的一种辉光。在现实世界中,透镜无法完美聚焦是泛光效果的物理成因;理想透镜也会在成像时由于衍射而产生一种名为艾里斑的光斑。在【Unity Shader】(七)基础屏幕特效中实现过 Bloom 效果。
常见的一个误解便是将 HDR 和 Bloom 效果混为一谈。Bloom 可以模拟出 HDR 的效果,但是原理上和 HDR 相差甚远。HDR 实际上是通过映射技术,来达到整体调整全局亮度属性的,这种调整是颜色,强度等都可以进行调整,而 Bloom 仅仅是能够将光照范围调高达到过饱和,也就是让亮的地方更亮。不过 Bloom 效果实现起来简单,性能消耗也小,却也可以达到不错的效果。

image-20220518143939832

12 景深

在光学领域,特别是摄影摄像领域,景深(Depth of field,DOF),也叫焦点范围(focus range)或有效焦距范围(effective focus),是指场景中最近和最远的物体之间出现的可接受的清晰图像的距离。换言之,景深是指相机对焦点前后相对清晰的成像范围。在相机聚焦完成后,在焦点前后的范围内都能形成清晰的像,这一前一后的距离范围,便叫做景深。

景深通常由物距、镜头焦距,以及镜头的光圈值所决定(相对于焦距的光圈大小)。除了在近距离时,一般来说景深是由物体的放大率以及透镜的光圈值决定。固定光圈值时,增加放大率,不论是更靠近拍摄物或是使用长焦距的镜头,都会减少景深的距离;减少放大率时,则会增加景深。如果固定放大率时,增加光圈值(缩小光圈)则会增加景深;减小光圈值(增大光圈)则会减少景深。

【RayTracer】(七)景深效果中有代码实现。

13 运动模糊

实现运动模糊的方法大致分 3 种:

  • 直接渲染模糊本身。通过在对象移动之前和之后添加几何体来完成,并通过次序无关的透明,避免 Alpha 混合,在【RayTracer】(九)运动模糊中的实现就是使用的这种方法。
  • 基于累积缓冲区(accumulationbuffer),通过平均一系列图像来创建模糊。
  • 基于速度缓冲器(velocity buffer)。目前这个方法最为主流。创建此缓冲区,需插入模型三角形中每个顶点的屏幕空间速度。通过将两个建模矩阵应用于模型来计算速度,一个用于最后一帧,一个用于当前模型。顶点着色器程序计算位置的差异,并将该向量转换为相对的屏幕空间坐标。

运动模糊对于由摄像机运动而变得模糊的静态物体来说比较简单,因为往往这种情况下不需要速度缓冲区。如果需要的是摄像机移动时的运动感,可以使用诸如径向模糊(radial blur)之类的固定效果:

image-20220518144557566

14 体渲染

体渲染(Volume Rendering),又称立体渲染,体绘制,是一种用于显示离散三维采样数据集的二维投影的技术。体渲染技术中的渲染数据一般用体素(Volumeric Pixel,或 Voxel)来表示,每个体素表示一个规则空间体。例如,要生成人头部的医学诊断图像(如 CT 或 MRI),同时生成 256 x256 个体素的数据集合,每个位置拥有一个或者多个值,则可以将其看做三维图像。因此,体渲染也是基于图像的渲染技术中的一种。

---- 本文结束 知识又增加了亿点点!----

文章版权声明 1、博客名称:LycTechStack
2、博客网址:https://lz328.github.io/LycTechStack.github.io/
3、本博客的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系博主进行删除处理。
4、本博客所有文章版权归博主所有,如需转载请标明出处。