13

【GPU精粹与Shader编程】(八) 《GPU Pro 1》全书核心内容提炼总结

 3 years ago
source link: https://zhuanlan.zhihu.com/p/47959028
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【GPU精粹与Shader编程】(八) 《GPU Pro 1》全书核心内容提炼总结

游戏开发话题下的优秀回答者

本文是【GPU精粹与Shader编程】系列的第八篇文章。文章全文共两万余字,盘点、提炼和总结了《GPU Pro 1》全书总计22章的核心内容。

题图来自《荒野大镖客2》。

PS:这篇文章发布期间知乎服务器出现了故障,计算机图形学和游戏开发等话题的页面直接提示不存在,导致这篇文章的初始版本在TimeLine上不显示。这篇是将之前的文章删除后,重新发布的。

全文内容目录

本文将对《GPU Pro 1》全书中游戏开发与渲染相关,相对更具含金量的5个部分,共22章的内容进行提炼与总结,详细列举如下:

  • Part I. 游戏渲染技术剖析 Game Postmortems
    • 一、《孢子(Spore)》中的风格化渲染 | Stylized Rendering in Spore
    • 二、《狂野西部:生死同盟》中的渲染技术 | Rendering Techniques in Call of Juarez: Bound in Blood
    • 三、《正当防卫2》中的大世界制作经验与教训 | Making it Large, Beautiful, Fast, and Consistent: Lessons Learned
    • 四、《矿工战争》中的可破坏体积地形 | Destructible Volumetric Terrain
  • Part II. 渲染技术 Rendering Techniques
    • 五、基于高度混合的四叉树位移贴图 | Quadtree Displacement Mapping with Height Blending
    • 六、使用几何着色器的NPR效果 | NPR Effects Using the Geometry Shader
    • 七、后处理Alpha混合 | Alpha Blending as a Post-Process
    • 八、虚拟纹理映射简介 | Virtual Texture Mapping 101
  • Part III. 全局光照 Global Illumination
    • 九、基于间接光照快速,基于模板的多分辨率泼溅 Fast, Stencil-Based Multiresolution Splatting for Indirect Illumination
    • 十、屏幕空间定向环境光遮蔽 Screen-Space Directional Occlusion (SSDO)
    • 十一、基于几何替代物技术的实时多级光线追踪 | Real-Time Multi-Bounce Ray-Tracing with Geometry Impostors
  • Part IV. 图像空间 Image Space
    • 十二、GPU上各项异性的Kuwahara滤波 | Anisotropic Kuwahara Filtering on the GPU
    • 十三、基于后处理的边缘抗锯齿 | Edge Anti-aliasing by Post-Processing
    • 十四、基于Floyd-Steinberg 半色调的环境映射 | Environment Mapping with Floyd-Steinberg Halftoning
    • 十五、用于粒状遮挡剔除的分层项缓冲 | Hierarchical Item Buffers for Granular Occlusion Culling
    • 十六、后期制作中的真实景深 | Realistic Depth of Field in Postproduction
    • 十七、实时屏幕空间的云层光照 | Real-Time Screen Space Cloud Lighting
    • 十八、屏幕空间次表面散射 | Screen-Space Subsurface Scattering
  • Part V. 阴影 Shadows
    • 十九、快速传统阴影滤波 | Fast Conventional Shadow Filtering
    • 二十、混合最小/最大基于平面的阴影贴图 | Hybrid Min/Max Plane-Based Shadow Maps
    • 二十一、基于四面体映射实现全向光阴影映射 | Shadow Mapping for Omnidirectional Light Using Tetrahedron Mapping
    • 二十二、屏幕空间软阴影 | Screen Space Soft Shadows

《GPU Pro 1》其书

《GPU Pro 1》全称为《GPU Pro : Advanced Rendering Techniques》,其作为GPU Pro系列的开山之作,出版于2010年,汇聚了当代业界前沿的图形学技术。全书共10个部分,41章。

一个有趣的细节是,《GPU Pro 1》是GPU Pro系列7本书中,页数最多的一本,共712页。

图 《GPU Pro 1》封面

《GPU Pro 1》书本配套源代码

类似之前的GPU Gems系列的源码收藏GitHub Repo(https://github.com/QianMo/GPU-Gems-Book-Source-Code),我也维护了的一个名为“GPU-Pro-Books-Source-Code”的GitHub仓库,以备份GPU Pro系列珍贵的资源,也方便直接在GitHub Web端查看业界大牛们写的代码,链接如下:

说明本文中的Shader代码和部分章节因字数限制被省略

本文完整全文为2万余字,包含大量核心算法的Shader源码。因为知乎专栏字数限制的缘故,全部的实现代码和部分章节,在本文需要省略,不然文章编辑时就会有红字提示超出多少字,且无法点发布。PS.一开始本文导入时候,居然提示超出3万字......

如果对这部分内容感兴趣,请移步至QianMo/Game-Programmer-Study-Notes阅读无删减的GitHub版,不便之处,敬请谅解。

Part I. 游戏渲染技术剖析 Game Postmortems

一、《孢子(Spore)》中的风格化渲染 | Stylized Rendering in Spore

《孢子(Spore)》是一款非常有创意的游戏。在游戏《孢子(Spore)》中,使用了可编程过滤链系统(scriptable filter chain system)在运行时对帧进行处理,以实现游戏整体独特的风格化渲染。(注,在本文中,filter按语境,译为滤波或者过滤)。

图 《孢子》封面图

图 《孢子》中的风格化渲染

过滤器链(filter chain)可以看作一系列按顺序应用的参数化的图像处理(image processing)着色器,即后处理链。《孢子》中的每一帧都使用此系统进行处理和合成。 除了《孢子》标准的艺术导向的视觉风格外,开发人员还创建了一组特有的滤波器,为游戏产生截然不同的视觉风格。而在这章中,作者讲到了一些在开发《孢子》时生成的视觉样式,并分享了关于《孢子》过滤器链系统的设计和实现的细节。

诸如模糊(blur),边缘检测(edge detection)等图像处理技术的GPU实现在图像处理领域较为常见。《孢子》的开发目标是构建一个具有此类过滤器的调色系统,美术师可以利用这些过滤器来创作不同的视觉样式。 下图显示了该系统在渲染管线中如何进行放置。

图 过滤器链系统总览

图 《孢子》中以油画方式进行渲染的飞机

下图显示了《孢子》中细胞阶段的过滤器链如何使用由渲染管线的其他阶段生成的多个输入纹理,并形成最终的合成帧。

图 《孢子》中细胞阶段游戏流体环境的复杂过滤器链

1.1 后处理过滤链系统的实现要点

过滤链系统实现的方面,分为两个要点:

  • 动态参数(Dynamic parameters)
  • 自定义过滤器(Custom filters)

1.1.1 动态参数(Dynamic parameters)

《孢子》中的动态环境需要调用按帧变化参数。所以,游戏中添加了可以通过任何过滤器访问的每帧更新的全局参数。例如,使用相机高度和当日时间作为行星大气过滤器的变化参数,如下图。

而在其他情况下,游戏需要在给定过滤器的两组不同参数值之间平滑插值。例如,每当天气系统开始下雨时,全局着色过滤器的颜色就会转换为阴天的灰色。在系统中也添加了支持游戏控制插值的参数,也添加了可以平滑改变滤波器强度的衰减器(fader)。

图 按当日时间驱动的颜色过滤器。这种经过彩色压缩的输出会进行模糊并以bloom的方式添加到场景中

1.1.2 自定义过滤器(Custom filters)

过滤链系统的一个重要补充是自定义过滤器,可以将其着色器指定为参数。这意味着程序员可以通过向现有构建添加新着色器来轻松添加新的图像技术。此外,程序员可以通过将多个过滤器折叠到一个实现相同视觉效果的自定义过滤器中来优化艺术家生成的过滤器链。

1.2 五种屏幕后处理Shader的实现思路

接着,介绍五种《孢子》中比较有意思的后处理效果。PS.这五种效果都可以在本文的GitHub版上找到实现源码:QianMo/Game-Programmer-Study-Notes

1.2.1 油画后处理效果 Oil Paint Filter

对于油画过滤器(Oil Paint Filter),首先渲染画笔描边的法线贴图,用于对传入的场景进行扭曲。 然后使用相同的法线贴图结合三个光源照亮图像空间中的笔触(Brush stroke)。 而笔触可以通过带状的粒子特效驱动,使过滤效果变得动态,并且在时间上更加连贯。

图 《孢子》中的油画后处理效果

1.2.2 水彩画后处理效果 Watercolor Filter

对于水彩画过滤器(watercolor filter)。首先,使用传入场景的简易Sobel边缘检测版本与原始场景相乘。 然后使用平滑滤波器(smoothing filter)的四个pass对结果进行平滑,且该平滑滤波器从四周的taps中找到每个pass的最亮值。 接着,基于边缘检测的轮廓添加一些在平滑过程中丢失的精确度。 具体核心代码如下,而offset和scales是可调的参数,允许我们改变绘制涂抹笔触的大小。

图 《孢子》中的水彩后处理效果

1.2.3 8位后处理效果 8-Bit Filter

图 8-Bit Filter

要创建一个8位滤波器(8-Bit Filter),可以使用像素着色器中的round函数,并通过点采样绘制到游戏分辨率大小1/4的低分辨率缓冲区中。 这是一个非常简单的效果,使游戏看起来像一个旧式8位游戏。

1.2.4 黑色电影后处理效果 Film Noir Filter

在创建黑色电影后处理效果时,首先将传入的场景转换为黑白。 然后进行缩放和偏移。添加一些噪声,雨水颗粒效果是很好的画龙点睛。

图 《孢子》中黑色电影后处理效果

1.2.5 旧电影后处理效果 Old Film Filter

对于旧电影后处理效果,可以采用简单的棕褐色着色与锐化滤波器(sharpen filter)相结合。 且可以使用粒子效果进行划痕和渐晕的处理。

图 旧电影后处理效果

关于《孢子》更多的风格化渲染的教程,可以在这里找到:

http://www.spore.com/comm/tutorials

二、《狂野西部:生死同盟》中的渲染技术 | Rendering Techniques in Call of Juarez: Bound in Blood

《狂野西部:生死同盟》(Call of Juarez: Bound in Blood)是由Techland公司开发,育碧发行,并于2009年夏季在PS3,Xbox360和PC上发布的游戏。

图《狂野西部:生死同盟》封面

图《GPU Pro 1》的封面,即是采用的《狂野西部:生死同盟》的图片

图 《狂野西部:生死同盟》游戏截图

《狂野西部:生死同盟》基于ChromeEngine 4,游戏中大量用到了延迟着色(deferred shading)技术。

众所周知,延迟着色 [Hargreaves 04]是一种在屏幕空间使用存储了诸如漫反射颜色,法向量或深度值等像素信息的中间缓冲区(G-buffer)的技术。

G-buffer是一组屏幕大小的渲染目标(MRT),可以使用现代图形硬件在单个pass中生成,可以显着降低渲染负载。然后使用G-buffer作为着色算法的输入(例如光照方程),而无需浏览原始几何体(此阶段计算所需的所有信息,如三维世界空间中的像素的位置,可以从G-buffer中提取)。以这种方式,算法仅对可见像素进行操作,这极大地降低了照明计算的复杂性。

图 《狂野西部:生死同盟》中的MRT配置

延迟着色方法的主要优点是对渲染管线的简化,节省复杂着色器资源和计算的开销,以及能对复杂光照(如动态光源)进行简约而健壮的管理。

延迟着色技术在与后处理渲染效果的结合方面可以获得不错的化学反应。在《狂野西部:生死同盟》中,延迟渲染与诸如屏幕空间环境光遮蔽(SSAO),运动模糊(motion-blur),色调映射(tone mapping)以及用于改善最终图像质量的边缘抗锯齿(edge anti-aliasing)等后处理效果都可以很好的结合使用。

图 拥有动态光源和环境光遮蔽的室内场景

这章中还展示了不少《狂野西部:生死同盟》中自然现象效果的渲染方法,如雨滴,体积地面雾,light shafts,真实感天空和云彩,水面渲染,降雨效果,以及体积光的渲染技巧。以及色调映射相关的技术。

图 场景色调映射,在阴影区域和光照区域之间转换

三、《正当防卫2》中的大世界制作经验与教训 | Making it Large, Beautiful, Fast,and Consistent: Lessons Learned

《正当防卫2(Just Cause 2)》是Avalanche Studios为PC,Xbox 360和PLAYSTATION 3开发的沙盒游戏。游戏的主要风格是大世界,主要视觉特征是具有巨大渲染范围的巨型景观,森林、城市、沙漠、丛林各种环境不同的气候,以及昼夜循环技术。

图 《正当防卫2》封面

对于多动态光源的渲染,《正当防卫2》没有使用延迟渲染,而是提出了一种称作光源索引(Light indexing)的方案,该方案可以使用前向渲染渲染大量动态光源,而无需多个pass,或增加draw calls。

3.1 光照索引 Light indexing

光照索引(Light indexing)技术的核心思路是:通过RGBA8格式128 x 128的索引纹理将光照信息提供给着色器。

将该纹理映射到摄像机位置周围的XZ平面中,并进行点采样。 每个纹素都映射在一个4m x 4m的区域,并持有四个该正方形相关的光源索引。这意味着我们覆盖了512m × 512m的区域,且动态光源处于活动状态。

活动光源存储在单独的列表中,可以是着色器常量,也可以是一维纹理,具体取决于平台。虽然使用8位通道可以索引多达256个光源,但我们将其限制为64个,以便将光源信息拟合到着色器常量中。每个光源都有两个恒定的寄存器,保存位置(position),倒数平方半径(reciprocal squared radius)和颜色(color)这三个参数。

表 光源常量

此外,还有一个额外的“禁用(disabled)”光源槽位,其所有这些都设置为零。那么总寄存器计数会达到130。当使用一维纹理时,禁用的光源用边框颜色(border color)编码替代。 位置和倒数平方半径以RGBA16F格式存储,颜色以RGBA8格式存储。为了保持精度,位置存储在相对于纹理中心的局部空间中。

光源索引纹理在CPU上由全局光源列表生成。一开始,其位置被放置在使得纹理区域被充分利用的位置,最终以尽可能小的空间,放置在摄像机之后。

在启用并落入索引纹理区域内的光源中,根据优先级,屏幕上的近似大小以及其他因素来选择最相关的光源。每个光源都插入其所覆盖的纹素的可用通道中。如果纹理像素被四个以上的光源覆盖,则需要丢弃此光源。

如果在插入时纹理像素已满,程序将根据图块中的最大衰减系数检查入射光源是否应替换任何现有的光源,以减少掉光源的视觉误差。这些误差可能导致图块边框周围的光照不连续性。通常这些误差很小,但当四处移动时可能非常明显。而为了避免这个问题,可以将索引纹理对齐到纹素大小的坐标中。在实践中,光源的丢弃非常少见,通常很难发现。

图 轴对齐世界空间中的光照索引。 放置纹理使得尽可能多的区域在视锥体内。 图示的4m x 4m区域由两个由R和G通道索引的光源相交。 未使用的插槽表示禁用的光源。

3.2 阴影系统 Shadowing System

阴影方面,《正当防卫2》中采用级联阴影映射(cascaded shadow mapping)。并对高性能PC提供软阴影(Soft shadows)选项。虽然在任何情况下都不是物理上的准确,但算法确实会产生真正的软阴影,而不仅仅是在许多游戏中使用的恒定半径模糊阴影。

图 《正当防卫2》中的软阴影。注意树底部的锐利阴影逐渐变得柔和,以及注意,树叶投下了非常柔和的阴影。

此软阴影算法的步骤如下:

1、在阴影贴图中搜索遮挡物的邻域。

2、投射阴影的样本计为遮挡物。

3、将遮挡物中的中心样本的平均深度差用作第二个pass中的采样半径,并且在该半径内取多个标准PCF样本并取平均值。

4、为了隐藏有限数量的样本失真,采样图案以从屏幕位置产生的伪随机角度进行旋转。

3.3 环境光遮蔽 Ambient Occlusion

对于环境遮挡(AO),使用了三种不同的技术:

  • 美术师生成的AO(artist-generated AO)
  • 遮挡体(Occlusion Volumes)
  • SSAO [Kajalin 09]

其中,美术师生成的环境光遮蔽用于静态模型,由材质属性纹理中的AO通道组成。此外,美术师有时会在关键点放置环境遮挡几何。对于动态对象,使用遮挡体(OcclusionVolumes)在底层几何体上投射遮挡阴影,主要是角色和车辆下的地面。而SSAO是PC版本的可选设置,里面使用了一种从深度缓冲导出切线空间的方案。

四、《矿工战争》中的可破坏体积地形 | Destructible Volumetric Terrain

知乎专栏字数限制的缘故,加入这章的内容后文章字数已超上限,所以请移步至https://github.com/QianMo/Game-Programmer-Study-Notes阅读。不便之处,敬请谅解。

Part II. 渲染技术 Rendering Techniques

五、基于高度混合的四叉树位移贴图 | Quadtree Displacement Mapping with Height Blending

这章中,介绍了当前表面渲染(surface rendering)技术的概述和相关比较,主要涉及在如下几种方法:

  • Relief Mapping | 浮雕贴图
  • Cone step mapping (CSM) | 锥步映射
  • Relaxed cone step mapping (RCSM) | 宽松锥步映射
  • Parallax Occlusion Mapping(POM) | 视差遮蔽贴图
  • Quadtree Displacement Mapping(QDM)| 四叉树位移贴图

内容方面,文章围绕表面渲染技术,分别介绍了光线追踪与表面渲染、四叉树位移映射(Quadtree Displacement Mapping)、自阴影(Self-Shadowing)、环境光遮蔽(Ambient Occlusion)、表面混合(Surface Blending)几个部分。为了获得最高的质量/性能/内存使用率,文章建议在特定情况下使用视差映射,软阴影,环境遮挡和表面混合方法的组合。

此外,文中还提出了具有高度混合的四叉树位移贴图。对于使用复杂,高分辨率高度场的超高质量表面,该方法明显会更高效。此外,使用引入的四叉树结构提出了高效的表面混合,软阴影,环境遮挡和自动LOD方案的解决方案。在实践中,此技术倾向于以较少的迭代和纹理样本产生更高质量的结果。

图 Parallax Occlusion Mapping(POM) 视差遮蔽贴图和Quadtree Displacement Mapping(QDM)四叉树位移贴图和的渲染质量比较。其中,左图为POM;右图为QDM。深度尺寸分别为:1.0,1.5,5.0。可以发现,在深度尺寸1.5以上时,使用POM(左图)会看到失真。

图 表面混合质量比较。上图:浮雕贴图(Relief Mapping),下图:带高度混合的视差遮蔽贴图(POM with height blending)

六、使用几何着色器的NPR效果 | NPR Effects Using the Geometry Shader

本章的内容关于非真实感渲染(Non-photorrealistic rendering ,NPR)。在这章中,介绍了一组利用GPU几何着色器流水线阶段实现的技术。

具体来说,文章展示了如何利用几何着色器来在单通道中渲染对象及其轮廓,并对铅笔素描效果进行了模拟。

单通道方法通常使用某种预计算来将邻接信息存储到顶点中[Card and Mitchell 02],或者使用几何着色器 [Doss 08],因为可能涉及到查询邻接信息。这些算法在单个渲染过程中生成轮廓,但对象本身仍需要第一个几何通道。

6.1 轮廓渲染(Silhouette Rendering)

轮廓渲染是大多数NPR效果的基本元素,因为它在物体形状的理解中起着重要作用。在本节中,提出了一种在单个渲染过程中检测,生成和纹理化模型的新方法。

轮廓渲染(Silhouette rendering)技术中, 两大类算法需要实时提取轮廓:

  • 基于阴影体积的方法(shadow volume-based approaches)
  • 非真实感渲染(non-photorealistic rendering)

而从文献中,可以提取两种不同的方法:

  • 对象空间算法(object-space algorithms)
  • 图像空间算法(image-space algorithms)

但是,大多数现代算法都在图像空间(image space)或混合空间(hybrid space)中工作。本章中主要介绍基于GPU的算法。GPU辅助算法可以使用多个渲染通道或单个渲染通道来计算轮廓。

为了一步完成整个轮廓渲染的过程,将会使用到几何着色器(geometry shader)。因为几何着色阶段允许三角形操作,能获取相邻三角形的信息,以及为几何体生成新的三角形。

轮廓渲染过程在流水线的不同阶段执行以下步骤:

  • 顶点着色器(Vertex shader)。 顶点以通常的方式转换到相机空间。
  • 几何着色器(Geometry shader)。 在该阶段中,通过使用当前三角形及其邻接的信息来检测属于轮廓的边缘,并生成相应的几何体。
  • 像素着色器(Pixel shader)。 对于每个栅格化片段,生成其纹理坐标,并根据从纹理获得的颜色对像素进行着色。

图 管线概述:顶点着色器(左)变换传入几何体的顶点坐标;第二步(几何着色器)为对象的轮廓生成新几何体。最后,像素着色器生成正确的纹理坐标。

图 轮廓渲染算法的运行效果图,轮廓剪影的实时生成和纹理化

实现Shader源码可见:

6.2 铅笔素描渲染(Pencil Rendering)

基于Lee等人[Lee et al. 06]铅笔渲染思路可以概括如下。

首先,计算每个顶点处的最小曲率(curvature)。然后,三角形和其曲率值作为每个顶点的纹理坐标传入管线。为了对三角形的内部进行着色,顶点处的曲率用于在屏幕空间中旋转铅笔纹理。该铅笔纹理会在屏幕空间中进行三次旋转,每个曲率一次,旋转后的结果进行混合结合。不同色调的多个纹理,存储在纹理阵列中,同时进行使用。最终,根据光照情况在其中选择出正确的一个。

图 管线概述:顶点着色器将顶点转换为屏幕空间;几何着色器将三角形的顶点曲率分配给三个顶点。最后,像素着色器生成三个曲率的纹理坐标并计算最终颜色。

可以通过以下方式使用GPU管线实现此算法:

  • 顶点着色器(Vertex shader)。 顶点转换为屏幕坐标。顶点曲率也被变换,只有x和y分量作为二维向量传递。
  • 几何着色器(Geometry shader)。 将曲率值作为纹理坐标分配给每个顶点。
  • 像素着色器(Pixel shader)。 计算最终颜色。

最终的渲染效果:

图 铅笔渲染效果图

实现Shader源码可见:

七、后处理Alpha混合 | Alpha Blending as a Post-Process

在这篇文章中提出了一种新的Alpha混合技术,屏幕空间Alpha遮罩( Screen-Space Alpha Mask ,简称SSAM)。该技术首次运用于赛车游戏《Pure》中。《Pure》发行于2008年夏天,登陆平台为Xbox360,PS3和PC。

图 《Pure》中的场景(tone mapping & bloom效果)

在《Pure》的开发过程中,明显地需要大量的alpha混合(alpha blending)操作。但是众所周知,传统的计算机图形学的难题之一,就是正确地进行alpha混合操作,并且往往在性能和视觉质量之间,经常很难权衡。

实际上,由于不愿意承担性能上的风险,一些游戏会完全去避免使用alpha混合。有关alpha混合渲染所带来的问题的全面介绍,可以参考[Thibieroz 08],以及[Porter and Duff 84]。

在这篇文章中,提出了一种新颖的(跨平台)解决方案,用于树叶的alpha混合,这种解决方案可以提高各种alpha测试级渲染的质量,为它们提供真正的alpha混合效果。

文中设计的解决方案——屏幕空间Alpha遮罩(Screen-Space Alpha Mask ,简称SSAM),是一种采用渲染技术实现的多通道方法,如下图。无需任何深度排序或几何分割。

在《Pure》中使用的SSAM技术对环境的整体视觉质量有着深远的影响。效果呈现出柔和自然的外观,无需牺牲画面中的任何细节。

图 SSAM的技术思路图示

此解决方案可以产生与alpha混合相同的结果,同时使用alpha测试技术正确解决每个像素的内部重叠(和深度交集)。

文中使用全屏幕后处理高效地执行延迟alpha混合(deferred alpha blending),类似于将帧混合操作设置为ADD的帧缓冲混合;源和目标参数分别设置为SRCALPHA和INVSRCALPHA。

混合输入被渲染成三个单独的渲染目标(render targets),然后绑定到纹理采样器(texture samplers),由最终的组合后处理像素着色器引用。

在内存资源方面,至少需要三个屏幕分辨率的渲染目标,其中的两个至少具有三个颜色的通道(rtOpaque & rtFoliage),而另一个至少有两个通道(rtMask)和一个深度缓冲区(rtDepth) 。

下面列举一些SSAM的优点和缺点。

SSAM的优点:

  • 树叶边缘与周围环境平滑融合。
  • 使用alpha测试技术,在每像素的基础上对内部重叠和相互穿透的图元进行排序。
  • 该效果使用简单,低成本的渲染技术实现,不需要任何几何排序或拆分(只需要原始调度顺序的一致性)。
  • 无论场景复杂度和overdraw如何,最终的混合操作都是以线性成本(每像素一次)来执行运算。
  • 该效果与能渲染管线中的其他alpha混合阶段(如粒子等)完美集成。
  • 与其他优化(如将光照移到顶点着色器)以及优化每个通道的着色器等方法结合使用时,总体性能可能会高于基于MSAA(MultiSampling Anti-Aliasing,多重采样抗锯齿)的技术。

SSAM的缺点:

  • 需要额外的渲染Pass的开销。
  • 内存要求更高,因为需要存储三张图像。
  • 该技术不能用于对大量半透明,玻璃状的表面进行排序(或横跨大部分屏幕的模糊alpha梯度),可能会产生失真。

八、虚拟纹理映射简介 | Virtual Texture Mapping 101

在这篇文章主要探讨了如何实现一个功能完备的虚拟纹理映射(Virtual Texture Mapping,VTM)系统。

首先,虚拟纹理映射(VTM)是一种将纹理所需的图形内存量减少到仅取决于屏幕分辨率的技术:对于给定的视点,我们只将纹理的可见部分保留在图形存储器中适当的MIP映射级别上,如下图。

图 使用单个的虚拟纹理渲染出独特的纹理地形

早期的纹理管理方案是针对单个大纹理设计的[Tanner et al. 98],文章发表期间的VTM系统则更加灵活,模仿了操作系统的虚拟内存管理的思路:将纹理分成小的图块(tiles),或者页(pages)[Kraus and Ertl 02, Lefebvre et al.04]。这些会根据渲染当前视点的需要自动缓存并加载到GPU上。但是,有必要将对缺失数据的访问重定向(redirect)到后备纹理。这可以防止渲染中出现“空洞”(加载请求完成前的阻塞和等待的情况)。

文中的实现的灵感来源于GDC上Sean Barrett[Barret 08]的演讲。如下图所示,在每帧开始,先确定哪些图块(tiles)可见,接着识别出其中没有缓存且没有磁盘请求的图块。在图块上传到GPU上的图块缓存之后,更新一个间接纹理(indrection texture,)或者页表(page table)。最终,渲染场景,对间接纹理执行初始查找,以确定在图块缓存中采样的位置。

图 渲染图块ID,然后识别并更新最近可见的图块到图块缓存中(图中的红色),并可能会覆盖不再可见的图块(图中的蓝色)。更新间接纹理并渲染纹理化表面(texturized surfaces)

间接纹理(indirection texture)是完整虚拟纹理的缩小版本,其中每个纹素都指向图块缓存(tile cache)中的图块。在文中的示例中,图块缓存只是GPU上的一个大纹理,包含小的,相同分辨率的正方形图块。

这意味着来自不同mip map级别的图块(tiles)会覆盖虚拟纹理的不同大小区域,但会大大简化图块缓存的管理。

Part III、全局光照 Global Illumination

九、基于间接光照的快速,基于模板的多分辨率泼溅 Fast, Stencil-Based Multiresolution Splatting for Indirect Illumination

本章介绍了交互式即时辐射度(radiosity)解决方案的改进,该解决方案通过使用多分辨率泼溅(multiresolution splats)技术,显着降低了填充率(fill rate),并展示了其使用模板缓冲(stencil buffer)的一种高效实现。与最原始的多分辨率泼溅[Nichols and Wyman 09]不同的是,此实现不通过几何着色器执行放大,因此能保持在GPU快速路径(GPU fast path)上。相反,这章利用了GPU的分层模板剔除(hierarchical stencil culling)和Z剔除(z culling)功能,以在合适的分辨率下高效地进行光照的渲染。

图 多分辨率光照泼溅开始于直接光照的渲染(左图)。每个VPL产生一个全屏幕的图示,允许每个VPL为每个像素提供光线。每个VPL产生一个全屏的泼溅,允许每个VPL为每个像素提供光线。但根据本地照明变化的速度,这些图层会以多种分辨率呈现。伪彩色全屏泼溅(中图)显示了不同分辨率的区域,这些区域被渲染为不同的buffer(右图)

图 多分辨率片的迭代求精从统一的粗图像采样开始(例如,162个采样)。处理粗粒度片元,识别需要进一步求精的片元并创建四个更精细的分辨率片元。进一步的操作会进一步细化片元直到达到某个阈值,例如最大精度级别或超过指定的片元数量。

图 前一幅图中的,多分辨率泼溅可以进行并行计算而不是迭代计算(左图)。右图中的多分辨率buffer中的片元,都为并行处理。

十、屏幕空间定向环境光遮蔽 Screen-Space Directional Occlusion (SSDO)

环境光遮蔽(AO)是全局光照的一种近似,由于其良好的视觉质量和简单的实现[Landis 02],其常常用于电影和游戏中。环境光遮蔽的基本思想是预先计算网格表面几个位置的平均可见性值。然后这些值在运行时与图形硬件提供的未遮挡光照相乘。

环境光遮蔽的一个缺点是它仅适用于静态场景。如果为每个顶点或纹理元素预先计算了可见性值,则在网格变形时这些值将无效。

动态场景的一些初步想法有[Bunnell 06]和[Hoberock and Jia07]通过用层次圆盘(hierarchy of discs)近似几何体的思路。处理动态场景的最简单方法是根据帧缓冲区中的信息计算环境光遮蔽,即所谓的屏幕空间环境光遮蔽(SSAO)。这里深度缓冲区用于在运行时计算平均可见度值而不是预先计算。这章内容发表期间的GPU算力已足以实时计算SSAO。此外,该方法不需要场景的任何特殊几何的表现,因为仅使用到帧缓冲器中的信息来计算遮蔽值。甚至不需要使用由多边形组成的三维模型,因为我们可以从产生深度缓冲区的任何渲染计算遮挡。

图 屏幕空间环境光遮蔽(SSAO):对于帧缓冲器中的每个像素,检查一组相邻像素,并将一个极小的球状物体放置在相应的三维位置。为每个球体计算遮蔽值,并将所有这些值累积到一个环境遮蔽值中。最后,该值乘以来自所有方向的未被遮蔽的光照。

环境光遮蔽通常显示空腔暗化(darkening of cavities)和接触阴影(contact shadows),但忽略入射光的所有方向信息。发生这种情况是因为只有几何体用于计算环境光遮蔽,而忽略了实际光照。典型的问题情况如下图所示:在方向变化的入射光的情况下,环境光遮蔽将显示错误的颜色。因此,该章将SSAO扩展到称之为屏幕空间定向遮挡(SSDO)的更真实光照技术。

由于循环遍历片段程序中的许多相邻像素,因此可以为每个像素计算单独的可见性值,而不是将所有信息折叠为单个AO值。因此,基本思想是使用来自每个方向的入射光的可见性信息,并仅从可见方向照射,从而产生定向的光照。

为对SSDO的数据做进一步描述,假设有一个深度帧缓冲区,其中包含每像素的位置,法线和反射率值。

图 环境光遮蔽的典型问题示例。由于红色光源被遮挡而绿色光源照亮了点P,我们希望在这里看到一个绿色的阴影。但环境遮挡首先计算来自所有方向的光照,因此点P最初为黄色,然后通过某个平均遮挡值进行缩放,从而产生了不正确的棕色。

本章提出的SSDO算法具体可以总结如下:

  • 首先,在像素的三维点周围放置一个半球,该半球沿着表面法线定向。该半球的半径r_max是用户参数,其用于决定搜索阻挡物的本地邻域的大小。
  • 然后,将一些三维采样点均匀分布在半球内部。同样,采样点数N是用于时间质量平衡的用户参数。
  • 接着,测试每个采样方向的光照是否被阻挡或可见。因此,我们将每个采样点反投影到深度帧缓冲区。在像素位置,可以读取表面上的三维位置,并将每个点移动到表面上。如果采样点朝向观察者移动,则它最初位于表面下方并且被分类为被遮挡。如果它远离观察者,它最初在表面上方并且被分类为可见。

在下图的示例中,点A,B和D在表面下方并被分类为遮挡物。只有样本C可见,因为它在表面上方。因此,仅从方向C计算光照。

图 SSDO屏幕空间定向环境光遮蔽。左图:为了计算点P处的方向遮挡,在半球中创建一些均匀分布的采样点,并将它们反投影到深度帧缓冲区中。(最初)在表面下方的每个点被视为遮挡物。 右图:仅从可见点计算光照。在这里,假设每个采样方向的立体角,并使用模糊环境贴图传入光亮度。

图 屏幕空间定向环境光遮蔽(Screen-Space Directional Occlusion,SSDO)效果图

十一、基于几何替代物技术的实时多级光线追踪 | Real-Time Multi-Bounce Ray-Tracing with Geometry Impostors

在实时应用中渲染反射和折射物体或它们的焦散(caustics)是一个具有挑战性的问题。其需要非局部着色,这对于光栅化渲染管线来说比较复杂,其中片段着色器只能使用局部插值顶点数据和纹理来查找曲面点的颜色。

物体的反射、折射和其焦散效果通常需要光线跟踪进行渲染,但光线跟踪通常不具备与光栅化渲染相同的性能。

而通常,使用基于纹理的特殊tricks可以将光线跟踪效果加入到实时场景中。这些技术通常假设场景中只有一个反射或折射物体,并且仅考虑一次或两次反射光就足够了。在这章中,遵循了类似的实践原理,但是除去这些限制,以便能够渲染布满玻璃碎片的完整棋盘,甚至折射物体浸没在动画液体中等场景。

这章中扩展了先前基于环境距离替代物技术(environment distance impostors)的近似光线追踪技术,以便在当时硬件条件的限制下,实时渲染具有多个反射和折射物体的场景。

有两个关键的思路。

首先,文章改为使用距离替代物(distance impostor)方法,不将内部光线(internal rays)与封闭的环境几何体相交,而是将外部光线(external rays)与物体相交。另外,这章展示了如何高效地追踪二次反射和折射光线,还研究了可以适应相同的任务的其他类型的几何替代物技术 – 如几何图像(geometry images)[Carr et al. 06]和高度场(height fields)[Oliveira et al. 00, Policarpo et al. 05]。

第二个思路是静态和动态对象的分离。经典的距离替代物(distance impostors)技术可以用于静态环境,只需要在每一帧中更新移动对象的环境替代物(environment impostors)。通过搜索几何替代物(geometry impostors)可以找到穿过移动物体的光路。

图(a)环境距离替代物技术(environment distance impostor)(b)具有搜索投影前两步策略的物体距离替代物(Object distance impostor)

图 左:整个测试场景。 右:使用高度图替代物进行双折射。

这章中扩展了先前基于环境距离替代物技术(environment distance impostors)的近似光线追踪技术,以便在当时硬件条件的限制下,实时渲染具有多个反射和折射物体的场景。

当然,随着技术的发展,2018年已经有了RTX技术,实时光线追踪已经不在话下。以下便是一个能展现实时光线追踪魅力的NVIDIA RTX Demo:

Part IV. 图像空间 Image Space

十二、 GPU上的各项异性的Kuwahara滤波 | Anisotropic Kuwahara Filtering on the GPU

这章中介绍一种各向异性的Kuwahara滤波器[Kyprianidis et al. 09]。各向异性的Kuwahara滤波器是Kuwahara滤波器的一种广义上的变体,通过调整滤波器的形状,比例和方向以适应输入的局部结构,从而避免了失真。由于这种适应性,定向图像特征被更好地保存和强调,得到了整体更清晰的边缘和更具特色的绘画效果。

图 原始图像(左),对各向异性的Kuwahara滤波输出(右)。沿着局部特征方向产生绘画般的增强效果,同时保留形状边界。

12.1 Kuwahara滤波器(Kuwahara Filtering)

Kuwahara滤波器背后的一般思想是将滤波器内核分成四个重叠一个像素的矩形子区域。滤波器的响应由具有最小方差的子区域的平均值来定义。

图 Kuwahara滤波器将滤波器内核分成四个矩形子区域。然后过滤器响应由具有最小方差的子区域的平均值来定义

图 Kuwahara滤波器的输出效果图

12.2 广义Kuwahara滤波器(Generalized Kuwahara Filtering)

而广义Kuwahara滤波器,为了克服不稳定次区域选择过程的局限性,定义了一个新的标准。结果被定义为次区域平均值的加权总和,而不是选择一个单独的次区域。权重是根据子区域的差异来定义的。 这导致区域边界更平滑并且失真更少。为了进一步改善这一点,矩形子区域被扇区上的平滑权重函数所取代:

图 广义的Kuwahara滤波器使用定义在光盘扇区上的加权函数。滤波过滤器响应被定义为局部平均值的加权总和,其中对具有低标准偏差的那些平均值赋予更多的权重。

图 广义Kuwahara滤波器的输出效果图

12.3 各向异性Kuwahara滤波器(Anisotropic Kuwahara Filtering)

广义的Kuwahara滤波器未能捕获定向特征并会导致集群的失真。而各向异性的Kuwahara滤波器通过使滤波器适应输入的局部结构来解决这些问题。在均匀区域中,滤波器的形状应该是一个圆形,而在各向异性区域中,滤波器应该变成一个椭圆形,其长轴与图像特征的主方向一致。

图 各向异性Kuwahara滤波器图示

十三、基于后处理的边缘抗锯齿 | Edge Anti-aliasing by Post-Processing

知乎专栏字数限制的缘故,加入这章的内容后文章字数已超上限,请移步至https://github.com/QianMo/Game-Programmer-Study-Notes阅读。不便之处,敬请谅解。

十四、基于Floyd-Steinberg半色调的环境映射 | Environment Mapping with Floyd-Steinberg Halftoning

这章中提出了一种使用GPU计算重要性采样的算法。该算法巧妙地应用了经典的半色调技术,可用于加速高质量环境映射照明中的重要性采样步骤。

这章想传达的最重要的信息是半色调(halftoning)算法和重要性采样(importance sampling)是等价的,因此我们可以在重要性采样中使用半色调算法。文中研究了Floyd-Steinberg半色调方法在环境映射中的应用,并得出结论认为,该方法可以比随机抽样更好地对样本进行分配,所以,对的样本计算的积分也会更准确。

图 左图为随机采样加权环境贴图(Sampling weighted environment maps);右图为弗洛伊德 - 斯坦伯格采样半色调环境映射(Floyd-Steinberg halftoning)

图 光源采样结果。随机采样基于Floyd-Steinberg半色调映射通过方向光源对兔子模型的漫反射和镜面光照。

十五、用于粒状遮挡剔除的分层项缓冲 | Hierarchical Item Buffers for Granular Occlusion Culling

知乎专栏字数限制的缘故,加入这章的内容后文章字数已超上限,请移步至https://github.com/QianMo/Game-Programmer-Study-Notes阅读。不便之处,敬请谅解。

十六、后期制作中的真实景深 | Realistic Depth of Field in Postproduction

景深(Depth of field,DOF)是一种典型的摄影效果,其结果是根据摄像机与摄像机的距离而产生不同的聚焦区域。

这章中,提出了一种交互式GPU加速的景深实现方案,其扩展了现有方法的能力,具有自动边缘改进和基于物理的参数。散焦效应通常由模糊半径控制,但也可以由物理特性驱动。此技术支持在图像和序列上使用灰度深度图图像和参数,如焦距,f-stop,subject magnitude,相机距离,以及图像的实际深度。

另外,景深实现中额外的边缘质量改进会产生更逼真和可信的图像。而局部邻域混合算法的缺点是二次计算能力,但这其实可以通过GPU进行补偿。

图 景深效果图

图 模拟曝光的光圈孔径形状示例

十七、实时屏幕空间的云层光照 | Real-Time Screen Space Cloud Lighting

在创造逼真的虚拟环境时,云是一个重要的视觉元素。实时渲染美丽的云可能非常具有挑战性,因为云在保持交互式帧率的同时会呈现出难以计算的多重散射(multiple scattering)。

目前的问题是,大多数游戏都无法承担精确计算物理上正确的云层光照的计算成本。

本章介绍了一种可以实时渲染真实感的云层的非常简单的屏幕空间技术。这种技术已经在PS3上实现,并用于游戏《大航海时代Online》(Uncharted Waters Online)中。这项技术并不关注严格的物理准确性,而是依靠重新创建云层的经验外观。另外需要注意的是,此技术适用于地面场景,玩家可以在地面上观看,并且只能从远处观看云层。

光照是创造美丽和真实感云彩最重要的方面之一。当太阳光穿过云层时,被云层中的粒子吸收,散射和反射。下图展示了一个典型的户外场景。

图 一个典型的户外场景。 最靠近太阳的云显示出最大的散射并且看起来最亮

如图所示,从图中所示的视图看云层时,最靠近太阳的云显得最亮。这种现象是由于太阳的光线到达云层的后方,然后通过多次散射,在云的前部(最靠近观察者)重新出现。这一观察结果是这章所介绍技术的关键部分。为了再现这种视觉提示,屏幕空间中的简单点模糊或方向模糊足以模仿通过云层的光散射。

17.1 实现方案

这章的云层渲染技术可以分为三个pass执行:

  • 首先,渲染云密度(cloud density)为离屏渲染目标(RT),且云密度是可以由艺术家绘制的标量值。
  • 其次,对密度贴图(density map)进行模糊处理。
  • 最终,使用模糊的密度贴图来渲染具有散射外观的云层。

图 基于这章技术实现的demo截图

在demo中,云层被渲染为一个统一的网格。 云层纹理在每个通道中包含四个密度纹理。每个通道代表不同的云层,根据第一个通道中的天气在像素着色器中混合。并且也通过滚动纹理坐标UV来实现动画。

总之,这章提出了一种实时渲染的真实感天空的技术。由于云的形状与光源分离,程序化云的生成和程序化动画都可以支持。

需要注意的是,此方法忽略了大气的某些物理特性,以创建更高效的技术。例如,不考虑大气的密度,但这个属性对于创造逼真的日落和日出是必要的。也忽略了进入云层的光的颜色。在日落或日出的场景中,只有靠近太阳的区域应该明亮而鲜艳地点亮。有必要采取更基于物理的方法来模拟太阳和云之间的散射,以获得更自然的结果。

十八、屏幕空间次表面散射 | Screen-Space Subsurface Scattering

同样是知乎专栏字数限制的缘故,加入这章的内容后文章字数已超上限,请移步至https://github.com/QianMo/Game-Programmer-Study-Notes阅读。不便之处,敬请谅解。

Part V. 阴影 Shadows

同样,“第五部分 阴影 Shadows”的四章内容,也因为字数超上限的缘故,无法在这里放进来。这边是一个快捷的传送门:

QianMo/Game-Programmer-Study-Notes

本文的GitHub版

假如你仔细阅读这篇文章到这里,你会发现不止一处的原文因为知乎专栏字数限制的原因被省略,而且这还没有算上很多核心算法的Shader实现代码。

如果对这些内容感兴趣,建议阅读没有因为字数限制原因被删减的完全版。

【本文的GitHub版本传送门】:

The End.

下次更新,《GPU Pro 2》全书核心内容提炼总结,再见。

With best wishes.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK