本文转自Unity Connect博主 北京琳云信息科技有限责任公司
浅析常常嘴边的理论知识 - PBR 技术
首先我们需要了解定义:( Physically Based Rendering )后来才发现这是一种新的渲染方式,万物皆以美为主,PBR 并不是“一项”技术,它是由一系列技术的集合,基于物理的渲染过程。PBR 它也是一种着色和渲染技术,用于更精确的描述光如何与物体表面互动。
PBR的优势:
(1)方法论和算法基于精确的计算公式,免除创作表面的猜想过程。
(2)在任何光照环境都能表现出正确的结果。
(3)为不同的艺术家,提供统一的工作流程。
我们来讲一下 PBR 流程和传统区别:其实 PBR 就是不再使用 Specular Map ,在 PBR 里是 Glossness (光泽可以理解成高光粗糙度)和 Metallicity (金属),后面两张基本都是灰度图,需要在游戏引擎中调节效果,据其他网上说法,一般公司会根据项目发一张材质球的表,所有的 Albedo , Glossness , Metallicity 的值的范围都在上面,根据物品的物理属性来调整就行。
从 Unity3D 5.x 开始有两个标准着色器,一个名为Standard,我们称它为标准着色器的标准版,另一个名为Standard(Specular Setup),我们称它为标准着色器的高光版,它们共同组成了一个完整的PBS光照明模型,且非常易于使用。其实这两个 Shader 基本差不多,只是有细微的属性参数上的区别。标准版这边的 _Metallic(金属性)、_MetallicGlossMap(金属光泽贴图),被高光版的 _SpecColor(高光颜色)、_SpecGlossMap(高光颜色法线贴图)所代替。标准着色器主要是针对硬质表面(也就是建筑材质)而设计的,可以处理大多数现实世界的材质,例如石头、陶瓷、铜器、银器或橡胶等。同时,它也可以非常出色地处理一些非硬质表面的材质,例如皮肤、头发或布料等。
(附注:PBS细析:基于物理的着色(Physically Based Shading,简称PBS)就是以某种方式模拟现实中材质和光照的相互作用的一种着色方法。这种方法在需要光照和材质更加直观和逼真地协同工作的场合下优势非常明显。基于物理的着色模拟了光线在现实中的行为,实现了在不同的光照条件下的逼真效果。为实现这种效果需要遵循各种物理原理,包括能量守恒(也就是物体反射出去的光量不可能超过所接收的光量),Fresnel反射(所有表面反射在掠射角(grazing angles)处更加强烈),以及物体表面是如何自我遮挡等原理。)
官方标准材质文档链接:https://docs.unity3d.com/Manual/StandardShaderMaterialParameters.html
接着,我们具体学习一下 Unity3D 引擎标准着色器的一些关键的属性与流程。
1、金属工作流:(不易出错,省内存,但是白边现象更明显),
1.1 Base Color :( RGB-sRGB ) 包含信息:绝缘体,反射颜色。金属,反射率。最亮色不应超越 240RGB ;最暗色应在 30-50RBG 之间;Base Color 不要包含其他光照信息,比如 Amblient Occlusion ;金属反射率应该在 70%-100% 之间。也就是RGB 范围在 180-255 。
1.2 Matallic Map :( Grayscale-Linear ):描述哪些区域是金属,那些是绝缘体。1 表示纯金属,0 表示绝缘体。如果Matalic Map 的灰度值低于 235 ,那么对应的 BaseColor 的反射率也应该降低一些。
1.3 Roughness Map :( Grayscale-Linear ):描述表面引起光纤漫反射的不规则程度。这将改变光纤的方向,但是不会改变光线的强度。光滑表面会有小而亮的高光,而粗糙表面将会出现大而暗淡的高光。在这个灰度图里面, 0 代表光滑表面,而 1 代表粗糙表面。Roughness Map 是一个“有故事”的贴图,它会告诉你这个表面经历过那些严酷(或者平和)的环境。而公用的贴图为环境光吸收,法线和高度贴图。
2、Specular工作流:
下面会讲述一下镜面反射工作流,其实Specular包含了全部的绝缘体 F0 信息,1.0 的 Diffuse 和 1.0 的 Specular 将会使得反射折射能量大于输入能量,这违背了能量守恒定律。也就是说在绘制贴图时,你无法预览结果。
2.1 Diffuse :( RGB-sRGB ):包含 Albedo Color ,但是不包含任何反射率信息。纯金属为黑色,因为纯金属没有颜色,油漆和锈迹是需要带有颜色的。基础颜色应不包含光照信息,除了 Micro-Occlusion。黑色不应低于 30-50sRGB ,亮色不应高于 240sRGB。
2.2 Specular:( RGB-sRGB ):灰度值,表示非金属 F0 。RGB 值,表示金属吸收的不同波长的光线这种贴图允许使用不同的 F0 值来表现非金属。
2.3 Glossiness:与 Roughness 相反, 0 代表粗糙表面,而 1 代表光滑表面。
3、Ambient Occlusion :表示有多少环境光,可以被表面上的一个点吸收。AO 应该只影响 Diffuse 部分,而不应该阻塞Specular部分。
4、Height Map:用于视差映射,通过增加可见的深度感来提高渲染的真实性。
5、Normal Map:不论PBR还是非PBR,NormalMap都是用来模拟表面细节,同时还会影响Roughness和Glossiness映射。 标准着色器源代码的剖析:1) 两个Shader源文件
Stardard.shader 着色器源文件 - 标准着色器的标准版
StardardSpecular.shader 着色器源文件 - 标准着色器的高光版
2) 七个CG头文件
UnityStandardBRDF.cginc头文件 - 用于存放标准着色器处理BRDF材质属性相关的函数与宏
UnityStandardConfig.cginc头文件 - 用于存放标准着色器配置相关的代码(其实里面就几个宏)
UnityStandardCore.cginc头文件 - 用于存放标准着色器的主要代码(如顶点着色函数、片段着色函数等相关函数)
UnityStandardInput.cginc头文件 - 用于存放标准着色器输入结构相关的工具函数与宏
UnityStandardMeta.cginc头文件 - 用于存放标准着色器meta通道中会用到的工具函数与宏
UnityStandardShadow.cginc头文件 - 用于存放标准着色器阴影贴图采样相关的工具函数与宏
UnityStandardUtils.cginc头文件 - 用于存放标准着色器共用的一些工具函数
StandardShaderGUI.cs脚本文件 - 定义了特定的自定义编辑器UI界面
其实在学习成长路上,也不乏有各路大神精彩分享与学习。如果想深入学习的了解,下面的文章也可以很好的学习阅读!
1、【基于物理的渲染(PBR)白皮书】(三)迪士尼原则的BRDF与BSDF相关总结:https://zhuanlan.zhihu.com/p/60977923
2、理解PBR:从原理到实现(上)https://blog.csdn.net/Neil3D/article/details/83783638
3、理解PBR:从原理到实现(下)https://blog.csdn.net/Neil3D/article/details/84112481
原文链接:https://connect.unity.com/p/unity3d-qian-tan-mei-zhu-na-xie-shi-pbrji-zhu?app=true
欢迎戳上方原文链接,下载Unity官方技术社区app,在线技术答疑,发现更多资源干货!