基于物理的渲染(PBR)在移动类GPU中变得越来越盛行。在本文中,我将简要阐述PBR的概念和优缺点,并就如何使用PBR和延迟渲染在PowerVR GPU上运行提供相关建议。我还将展示如何在我们最新发布的OpenGL ES演示产品Dwarf Hall上使用PBR。
基于物理的渲染没有精确的定义,它是一套可以遵循的准则,即在场景中如何以更科学直观的方式完成渲染。镜面光便是很好的例子。在PBR出现之前,许多图形应用程序使用特定输入如亮度值等作为材料参数。这个值的范围可以从0开始到无穷大。我们需要从艺术的视角来审视不同的值,以确定哪个值呈现的效果最佳。
这种方式不太直观,且会产生不同等级的品质。它还可能产生物理上不可能实现的结果,即输出的光比输入的光更多。且有了PBR渲染,艺术家和程序员可以更好地理解材料的输入值。
基于图像的照明
场景中的镜面贡献是一个重要的因素。一个点在空间场景中的镜面贡献(辐照度)是使用立方体贴图来存储的。可以使用离线渲染器来创建这些立方体贴图。当应用程序运行期间需要对表面进行着色时,仅仅需要查看立方体贴图的方位。
在基于物理的渲染中的图像照明示例图
在我们的演示中,使用射线跟踪器从演示空间的多个点中创建立方体贴图。也使用立方体贴图的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
G缓冲区的可视化图
Metallicness VS镜面
如果假设所有的金属都有相同的镜面颜色且所有的电介质使用相同的漫射颜色,那么为缩小G缓冲区的大小而减少输入数量是有可能的。这意味着材料的反射率颜色和高光颜色可以被存储在相同的图像中。这就是我们使用的“Metalicness”工作流,如下所示:
无人机的输入纹理。TL:反照率/高光颜色、TR:metalicness、BL:法线、BR:粗糙度。
这是最后的G缓冲区布局,如下所示:
rgb10a2:光积聚
r32f:深度
rgba8:法线和粗糙度
rgba8:(反射率或反射)& metallicness
这非常符合PowerVR Series6目标设备中每像素可用的128位片上存储。(注意,256位在Series6XT及其后的GPU中可用)。
后期处理
由于具有HDR格式的光积聚信息,因此绘制至后台缓冲之前可以采用许多不同的后期处理效果。在演示中我们使用了:开花、色调映射、眩光和电影颗粒效果。许多基于物理的渲染都使用后期处理对图像进行最后的艺术美化。
有效性
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)