Dwarf Hall:PowerVR GPU上基于物理的渲染

基于物理的渲染(PBR)在移动类GPU中变得越来越盛行。在本文中,我将简要阐述PBR的概念和优缺点,并就如何使用PBR和延迟渲染在PowerVR GPU上运行提供相关建议。我还将展示如何在我们最新发布的OpenGL ES演示产品Dwarf Hall上使用PBR。

基于物理的渲染没有精确的定义,它是一套可以遵循的准则,即在场景中如何以更科学直观的方式完成渲染。镜面光便是很好的例子。在PBR出现之前,许多图形应用程序使用特定输入如亮度值等作为材料参数。这个值的范围可以从0开始到无穷大。我们需要从艺术的视角来审视不同的值,以确定哪个值呈现的效果最佳。

这种方式不太直观,且会产生不同等级的品质。它还可能产生物理上不可能实现的结果,即输出的光比输入的光更多。且有了PBR渲染,艺术家和程序员可以更好地理解材料的输入值。

基于图像的照明

场景中的镜面贡献是一个重要的因素。一个点在空间场景中的镜面贡献(辐照度)是使用立方体贴图来存储的。可以使用离线渲染器来创建这些立方体贴图。当应用程序运行期间需要对表面进行着色时,仅仅需要查看立方体贴图的方位。

1

在基于物理的渲染中的图像照明示例图

在我们的演示中,使用射线跟踪器从演示空间的多个点中创建立方体贴图。也使用立方体贴图的MIP图像来表示粗糙表面模糊及光滑的效果 (预过滤的辐照环境图)。Sébastien Lagarde在他的博客中对这种方法进行过阐述。

空间中某个点的辐照度编码过程被称为基于图像的照明,其通常与PBR相结合。我们还在后期处理效果中使用HDR来编码这些辐照度值,并使用工具以高效的PVRTC格式进行存储。

材料系统

PBR系统的输入通常有几个参数。将以下参数输入演示:

•反照率颜色

•粗糙度(或平滑度)

•高光颜色

•切法线

这些输入足以在PBR着色中生成画质美观的效果,且对于艺术家和程序员而言,生成的效果图都直观易懂。

Gamma

3D渲染的一大难点就是伽马。有两种主要的空间色彩:伽马空间或线性空间。多数监视器或输出设备均预计了伽马空间的输入。这里要注意的是粘合和错误的伽马补偿。

从高精度到低精度进行量子化并随后对结果进行更多的计算时,会发生绑定。在这种情况下,我们要在保持高精度计算的同时进行补偿,并尽可能晚地进行量化,以避免出现粘合。

输入纹理是容易发生错误伽马补偿的主要区域。在对纹理进行取样时,需要了解纹理存储在哪个颜色空间并应用正确的伽马补偿。纹理过滤同样需要考虑伽马。在处理有效的PVRTC编码纹理时,可以使用扩展文件EXT_pvrtc_sRGB。

延迟渲染

若希望在演示中有很多移动光的效果,则可以使用延迟渲染实现这一目标。在PBR渲染中进行同样的输入,并在G缓冲区进行如下布局:

RGB光积聚

F32深度

RGB切线法线

0 - 1粗糙度

RGB反照率

RGB高光颜色

0 - 1 Metallicness

2

G缓冲区的可视化图

Metallicness VS镜面

如果假设所有的金属都有相同的镜面颜色且所有的电介质使用相同的漫射颜色,那么为缩小G缓冲区的大小而减少输入数量是有可能的。这意味着材料的反射率颜色和高光颜色可以被存储在相同的图像中。这就是我们使用的“Metalicness”工作流,如下所示:

3

无人机的输入纹理。TL:反照率/高光颜色、TR:metalicness、BL:法线、BR:粗糙度。

这是最后的G缓冲区布局,如下所示:

rgb10a2:光积聚

r32f:深度

rgba8:法线和粗糙度

rgba8:(反射率或反射)& metallicness

这非常符合PowerVR Series6目标设备中每像素可用的128位片上存储。(注意,256位在Series6XT及其后的GPU中可用)。

后期处理

由于具有HDR格式的光积聚信息,因此绘制至后台缓冲之前可以采用许多不同的后期处理效果。在演示中我们使用了:开花、色调映射、眩光和电影颗粒效果。许多基于物理的渲染都使用后期处理对图像进行最后的艺术美化。

有效性

在传统的延迟渲染系统中,GPU会从主内存中读取G缓冲区信息,并随后将光积聚写入另一个主内存的渲染目标中。这非常适用于有很多可用功率且大型的快速专用又耗能的DDR RAM。

不过对于功率受限的设备,这存在一个问题。问题在于移动设备可能只访问较慢的系统内存。所以我们要尽可能避免使用内存带宽。

由于要在区块贴图中操作,PowerVR GPU有少量的专用快速本地内存。每像素128位或256位都是可行的,这取决于硬件本身。合理利用可以避免在延迟渲染中使用内存带宽。可使用一些相关的扩展,如下所示:

帧缓冲区提取

帧缓冲区提取扩展允许我们重新读取先前着色器中编写的片段值。当在贴图内同时处理着色器和三角形时这种情况较常发生。所以这些对本地内存的写入和读取比使用系统内存要快得多。

像素本地存储(PLS)

像素本地存储扩展与之前的帧缓冲区扩展相似,但其允许以中间变量格式存储在本地内存。这样便可以减少格式转换的工作。演示中使用了以下设计:

layout(rgb10a2) highp vec4 lightAccumulationpadding;
layout(r32f) highp float depth;
layout(rgba8) highp vec4 normalsroughness;
layout(rgba8) highp vec4 albedoOrReflectancemetallicness;

像素本地存储2

PLS2允许我们写入后台缓冲区而不是中间缓冲区。这意味着我们不需要对系统内存中的中间渲染目标进行渲染便可以位块传输至后台缓冲区。我们还可以直接写入后台缓冲区,这可以避免使用更多的内存带宽。

实验结果

使用PVRTune工具的演示分析表明,优化渲染器(帧缓冲区提取和PLS)可以执行更少的渲染任务。

这表明G缓冲区的生成、照明和色调映射阶段可以合并到一个任务中。这也明确显示,芯片和主存之间的带宽使用明显降低:读取降低了53%,编写降低了54%。

所有这些优化都会略微降低帧时间,但却可大大降低功耗,如下所示。这意味着移动设备的电池使用寿命将大为延长。

4

系统总功率

Future work 未来的工作

Vulkan

Vulkan允许显式地指定加载和存储操作。使用Vulkan和OpenGL ES运行 Gnome Horde 演示时,CPU使用效果较佳。这是移动设备的福音——更少的CPU使用率意味着更低的功耗,而功耗降低也意味着电池的使用寿命更长且产品功能更丰富。在后续的文章中,我将结合PLS和Vulkan进行阐述。

射线跟踪

基于图像的照明是一种近似。如果光线需要在场景中移动,则不可以对场景进行离线渲染。再次计算将会极耗成本。如果使用射线跟踪生成这些IBL试样,动态IBL成本则只有使用光栅化进行再次计算成本的几分之一。

可以想象Vulkan的CPU成本之低,使用射线追踪的高效PowerVR GPU可以实现完全动态的光照和阴影效果!

这是目前我们所探索到的相关信息,更多信息敬请期待。

原文链接:
http://blog.imgtec.com/powervr/physically-based-rendering-on-a-powervr-gpu

声明:
本文为原创文章,转载需注明作者、出处及原文链接,否则,本网站将保留追究其法律责任的权利

--电子创新网--
粤ICP备12070055号