PBR工作流实现与对比

Posted Kaitiren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PBR工作流实现与对比相关的知识,希望对你有一定的参考价值。

工作流实现

工作流中的核心内容便是贴图,不论是UE4还是Unity都支持将PBR的参数以贴图的形式传入引擎,我们可以根据一个物体同一mesh或不同mesh的不同区域的属性差异来控制贴图上的属性产生不同,而没有贴图的话,一个物体只能使用一种参数属性。

//glsl贴图代码示例

uniform sampler2D albedoMap;

uniform sampler2D normalMap;

uniform sampler2D metallicMap;

uniform sampler2D roughnessMap;

uniform sampler2D aoMap;

...

vec3 albedo = pow(texture(albedoMap, TexCoords).rgb, 2.2);

vec3 normal = getNormalFromNormalMap();

float metallic = texture(metallicMap, TexCoords).r;

float roughness = texture(roughnessMap, TexCoords).r;

float ao = texture(aoMap, TexCoords).r;

...

美术制作的albedo纹理一般都是sRGB空间的,因此我们要先转换到线性空间再进行后面的计算。根据美术资源的不同,AO纹理也许同样需要从sRGB转换到线性空间。


早期工作流

在Disney PBR没有大规模使用之前,材质贴图是没有一套规范通用的流程的,往往将很多东西混杂在一起去实现一个凭空想象的效果,而且每个人每个公司都有自己的方式,就好比绘画一样,没有一个标准的流程和规范。

想要得到预期效果,不仅得调节材质的属性还得相应地控制光照的属性,即材质与光照不解耦,工作流程上下端配和难度大。此处不再过多赘述,这种工作流已经基本消失殆尽。


金属粗糙流

该工作流是基于之前讲到的PBR原理,是PBR工作流中最为通用的。

  • Albedo-Base Color基色:sRGB三色图,代表非金属的漫反射颜色和金属的反射率值,也就是漫反射项中的C与金属部分的F0;

  1. 非金属漫反射区域不应低于50sPRG(容忍),红线是30sRGB,亮值不应超过240 sRGB

  1. 金属部分反射率值,在70-100%范围内,我们可以将其映射到180-255 sRGB

  1. 不会带有任何的光照信息(微观自遮挡可以包含,指个位像素级别)

  • Metallic金属度:灰度图,代表公式中运算的金属度,计算F0和漫反射Kd需要的插值系数。

  • 金属度图完全可以做成一张非零即一的黑白图,允许极少量两头极端范围内的过度值存在

  1. 金属值应在235-256 sRGB,它们的基色贴图值应该在180-255 sRGB范围内

  1. 涂层金属与生锈金属应当视作非金属,金属度设置为0;蒙灰金属可以小范围低于235sRGB,对应的basecolor需要降低一定范围,自行把控

  1. 理论上不应出现大面积的位于中间范围的金属值,那样做是错误的,现实不存在这种材料,但是强行为了特殊效果亦可

  • Roughness粗糙度:灰度图,代表高光部分计算中的粗糙度,根据需要自行设置。

优劣分析

  • 更容易理解创作,Basecolor就是物体的固有色,符合日常认知

  • 纹理占用内存少,因为金属和粗糙度贴图都是灰度图(单通道),可以和其他贴图混用通道

  • 非金属F0只能是默认的0.04,无法更改

  • 金属和非金属交界处会有白边,注意贴图分辨率和UV分布


高光光泽流

  • Albedo-Diffuse:sRGB三色图,包含非金属的反射颜色,即漫反射项中的C。

  1. 非金属反射颜色暗值不应低于30 sRGB(容差范围) - 50 sRGB(严格范围),亮值不应超过240 sRGB

  1. 金属区域为纯黑色

  • Specular高光度:sRGB三色图,包含金属的反射率值与非金属的反射率值,即金属与非金属的F0。

  1. 一般非金属部分应为2-5%,sRGB值应介于40-75之间,常见的宝石在0.05-0.17范围内,普通液体在0.02-0.04范围内

  1. 一般金属在70-100%镜面反射率范围内,映射到180-255 sRGB

  • Glossiness光泽度:与Roughness相反。

优劣分析

  • 可以自己控制非金属的F0

  • RGB贴图变多,占用内存变大

  • 不易控制,容易做出自然界不存在的材质

  • 边缘效应会产生黑边,注意贴图分辨率和UV分布


工作流转换

Specular到Metalness的转换

  1. 创建一张Metalic图

  1. 以Metalic图作为遮罩对Specular处理,得到金属的反射率值

  1. 覆盖到原本的diffuse

Specular到Metalness的转换

  1. 依靠金属与非金属在diffuse和specular的差异获得一张Metallic贴图

  1. 使用Metallic图作为遮罩,对BaseColor处理,将金属部分抠去,得到Diffus贴图

  1. 翻转Metallic图,作为遮罩对BaseColor处理,剩余的部分覆盖56度灰,得到Specular贴图

以上是关于PBR工作流实现与对比的主要内容,如果未能解决你的问题,请参考以下文章

UE4/5 PBR模型(带材质)导出Blender/UE4低版本/Unity方法

unity之PBR材质流程与材质制作实践

PBR着色器的实现相关

PBR

Unity之PBR两种工作流简介

PBR实现