作者:Tom Lewis
ImageBasedLighting 是PowerVR SDK中包含的最激动人心的视觉示例之一,它使用了基于物理渲染技术和基于图像光照技术生成令人非常惊喜的效果,而且能够非常流畅稳定的运行,尤其非常适合移动端PowerVR GPU。
我们认为ImageBasedLighting 是一个非常有意思的示例,值得进行深入讨论,因此我们集思广益完成了一个用户指南“PowerVR平台上基于物理光照和图像渲染技术”,目前可以在我们新推出的文档网站上下载。
这个用户指南概述了此示例是如何工作的,包括以下几点:
- 对该示例各个模块进行分解介绍
- 讨论使用了哪些assets
- 这些assets是如何处理和应用的
- 为什么需要选择特定的图像格式
- 如何管理高动态范围图像的取值问题
- 该示例中各种着色器是如何工作的
- 如何优化使得实时的物理渲染成为可能
- PVRTexTool工具功能非常强大
当然还有很多其他内容,我们做了很多工作来实现这个示例。
这篇文章会让你对整个文档的内容有一定的了解,重点介绍了该Demo中使用了哪些assets以及处理过程,在后续的文章中我们将仔细介绍这些assets以及如何优化着色器使得应用变得更加流畅和稳定。
但是在我们进一步讨论之前有一点很重要,即ImageBasedLighting 功能的实现主要是基于Epic Games公司的出版物《虚幻引擎4中的真实阴影》,这本书的作者是布莱恩·卡里先生(Brian Karis),其中介绍的内容可以说是这个示例的理论基础,我们对Epic Games公司表示了感谢。
那么事不宜迟,让我们开始吧!
等等…基于物理渲染(PBR)?
是的,当然可以,我相信你们很多人都听说过基于物理渲染(PBR)和基于图像光照(IBL),但是为了确保每个人都能够有一定的认识下面还是介绍一下:
基于物理渲染是一系列技术,它试图基于这些对象的真实材料属性来模拟光与对象的交互。这些材料的属性包括反射率、发射率、粗糙度和金属性等,所有这些都可以改变光从物理表面反射的方式。这些属性通常在纹理映射中设置,纹理映射在处理时会由着色器进行采样,这对于艺术家和设计师来说是非常棒的,他们可以通过调整这些材料的属性从而更直观的方式来呈现对象。
这是好消息,因为它可以生成非常逼真的物理光照效果,这意味着我们可以看到如下的渲染效果:
这取材于PowerVR团队创建的Dwarf Hall示例,更多的信息可以在我们的网站查看。
基于图像光照(IBL)
基于图像光照(IBL)主要用于模拟全局光照,全局光照是基于这样一种概念,即三维场景(以及现实世界)中的所有物体都至少会有一点反射效果,落在物体上的光不仅来自于太阳等直接光源,还有来自于场景中其他物体反射的光。对于基于图像光照技术全局光照是使用一组图像来近似地捕捉来自各个方向的光。在我们的示例中采用了环境映射的方式,对现实场景中的所有光线信息进行编码,当光线从遥远的地方照射过来时这种方法的处理效果很好,但是代价太大了,而且效果只能是静态的。使用基于静态图像光照的最大优点是使得基于物理渲染功能在各种GPU平台上都能够运行,即使是低端GPU器件。
基于物理渲染和基于图像光照在游戏行业中被广泛采用,Unity和虚幻引擎都默认支持基于物理渲染功能。
现在大家有了基本的认识和了解,下面我们要介绍一下使用了哪些assets资产使得基于物理光照的示例成为可能。
资产(The Assets)
Assets-资产指的是那些在运行前就要创建好的内容片段,比如纹理、模型、音频等,如果大家仔细阅读了上文内容,你就会发现我们其实已经介绍了一些重要的assets资产。
这个示例中使用到的assetws资产可以分为四类:
1. 模型和相关纹理
2. 存储在查找表(LUT)中的双向反射分布功能(BRDF)
3. 环境地图
4. 全局光照地图
今天我们重点讨论第一类!
模型和纹理
模型文件描述的是示例中需要渲染的对象网格,对于Image-Based Lighting 我们使用的是一个破损的头盔模型,取材于glTF样例模型,在GitHub repository库中保存,这个库由Khronos组织来管理维护。
这个模型非常适合展示基于物理渲染技术,奇妙之处在于它是混合了不同材质和表面的模型,包括轻微弯曲的玻璃表面,不同的金属表面(有一些抛光和损伤的部分),将所有这些不同类型的表面组合在一个紧凑的模型对象中显示了基于物理渲染技术是如何精确的建模来呈现漫反射和镜面反射的效果。
如果你想尝试一下这个三维模型,可以看下它的素描形态,或者下载PowerVR SDK并运行基于图像光照Demo来查看。
关于模型不同区域的反射性、金属性以及粗糙度的信息存储在纹理映射中,这些纹理映射由模型资源来提供,这个模型附带了所有你可能需要的纹理从而产生更加逼真的效果。
如下所示:
反射率映射
反射率反映的是物体正常基色或漫反射的颜色,这意味着这个纹理不包含任何阴影或方向光信息,你可以把它想象成物体在正常白光下的颜色。
金属性和粗糙度映射
粗糙度是不可避免的,它表示的是物体表面光滑或粗糙的程度,对于基于物理渲染(PBR)方式,粗糙度决定了镜面反射如何在表面上产生,在像镜子一样光滑的表面上光线反射的角度与入射的角度相同,这意味着外部世界将在表面上得到完美的反射。对于非常粗糙的表面入射光以不同的角度散射,几乎接近漫反射,导致非常模糊的反射效果,粗糙度的取值范围是0.0到1.0.
在不深入研究材料物理的前提下,金属的属性决定了材料应该被识别是绝缘体还是导体,像木头或陶瓷这样的绝缘体倾向于吸收和散射光,产生漫反射,而像金属这样的导体产生镜面反射,因此金属的属性决定了漫反射光和镜面光的计算应该如何结合。
金属度为0.0可以认定为绝缘体,因此我们将只使用漫反射对颜色产生一定的影响,对于金属度为1.0的材料可以认为是导体,所以我们只使用镜面反射。现在虽然一种材料不能单单的认为是半导体或半绝缘体,但物体可以用不同的材料进行分层处理,所以对于金属度在0.0和1.0之间的材料散射和反射效果是结合在一起的。
金属度和粗糙度的取值范围都在0.0到1.0之间,这意味着它们只需要一个纹理的单一通道来存储所有的信息,然后将这两个映射参数封装到一起,每个颜色通道代表不同的属性,大家可以参看下图,蓝色通道反映的是金属度,绿色通道反应的是粗糙度。
放射性映射
纹理表面包含所有自发射光源信息,这些特性与LED或LCD显示器类似,在着色器完成所有PBR的计算之后,放射性映射效果会被添加到最终的像素颜色中,从下图你可以看到只有一小部分区域会有亮光,这是头盔面板上设计了一个HUD装置。
法线映射
法线映射表示的是物体表面的中等尺度结构,关于物体上任何凸起或凹痕的信息都会反应在法线映射图中。
法线映射图可以用于帮助计算漫反射光对物体表面产生的效果。
环境遮挡映射
环境遮挡映射图反应的是渲染器对于物体不同区域在环境光下的亮度效果。
环境遮挡效果可以根据模型的几何形状预先计算,如果同等强度的光从四面八方照射到物体上,物体暴露的部分则越亮,而封闭或遮挡的部分则越暗。阴影的数量通常是通过从物体表面的点向四面八方投射的光线来计算的,这些光线照射物体某一部分的比例越大,那么这一部分在环境遮挡映射图中的颜色就越深。
纹理的处理
在将这些材质用于演示之前我们还需要作一些准备,大部分工作只是简单的将原始jpeg文件压缩为Imagination专有的纹理压缩格式PVRTC,这只需要使用PVRTexTool工具点击几下鼠标就可以完成了,这意味着纹理在保持较高图像质量的同时占用更少的磁盘空间。
我们也做了一些纹理封装,如前文所述金属度和粗糙度映射贴图已经被打包成一个单独的纹理,分别存储在纹理的蓝色和绿色通道中。这种方式很好但仍然有改进空间,因为纹理可以通过使用空的红色通道进一步填充,我们选择将环境遮挡映射贴图也封装到纹理中,因为和金属度和粗糙度一样,它的值也是只在0.0到1.0之间,所以可以将所有的数据放在一个通道中,实现这个功能的是PVRTexTool工具,可以使用PVRTexTool CLI(命令行工具)的一个命令来完成,这样的封装减少了运行时必须从内存中检索纹理数量的操作,这样有助于提升系统整体的性能。
总结
这就是目前基于物理渲染的全部内容, 如果您想了解有关如何使用这些纹理创建ImageBasedLighting演示的更多信息,请查看完整指南“基于物理渲染和基于图像光照的PowerVR平台应用”,网站请访问 http://docs.imgtec.com/ 。
下次我们将和大家介绍BRDF技术、环境和全局光照映射相关知识,了解它们在演示Demo中起到了哪些作用。
最后…
我们新推的文档网站不仅仅有基于物理光照相关的文档,我们还提供了很多其他方面的文章,无论你的开发水平如何都可以访问查看,包括的内容有:
- PowerVR硬件平台性能建议
- 梯度线性混叠技术(GRLAA)技术介绍
- OpenGL ES和Vulkan图形库入门介绍
- 还有很多
所以如果你感兴趣请访问我们的新网站,我们会定期进行更新
大家可以在我们的论坛或网站上留下建议,还以在推特上关注@rajones devtech获取开发者技术相信新闻,或关注@powervrinsider获取关于PowerVR的最新信息。
原文链接:https://www.imgtec.com/blog/physically-based-rendering-powervr/
声明:本文为原创文章,转载需注明作者、出处及原文链接,否则,本网站将保留追究其法律责任的权利。