工作流实现
工作流中的核心内容便是贴图,不论是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;
- 非金属漫反射区域不应低于50sPRG(容忍),红线是30sRGB,亮值不应超过240 sRGB
- 金属部分反射率值,在70-100%范围内,我们可以将其映射到180-255 sRGB
- 不会带有任何的光照信息(微观自遮挡可以包含,指个位像素级别)
- Metallic金属度:灰度图,代表公式中运算的金属度,计算F0和漫反射Kd需要的插值系数。
- 金属度图完全可以做成一张非零即一的黑白图,允许极少量两头极端范围内的过度值存在
- 金属值应在235-256 sRGB,它们的基色贴图值应该在180-255 sRGB范围内
- 涂层金属与生锈金属应当视作非金属,金属度设置为0;蒙灰金属可以小范围低于235sRGB,对应的basecolor需要降低一定范围,自行把控
- 理论上不应出现大面积的位于中间范围的金属值,那样做是错误的,现实不存在这种材料,但是强行为了特殊效果亦可
- Roughness粗糙度:灰度图,代表高光部分计算中的粗糙度,根据需要自行设置。
优劣分析
- 更容易理解创作,Basecolor就是物体的固有色,符合日常认知
- 纹理占用内存少,因为金属和粗糙度贴图都是灰度图(单通道),可以和其他贴图混用通道
- 非金属F0只能是默认的0.04,无法更改
- 金属和非金属交界处会有白边,注意贴图分辨率和UV分布
高光光泽流
- Albedo-Diffuse:sRGB三色图,包含非金属的反射颜色,即漫反射项中的C。
- 非金属反射颜色暗值不应低于30 sRGB(容差范围) - 50 sRGB(严格范围),亮值不应超过240 sRGB
- 金属区域为纯黑色
- Specular高光度:sRGB三色图,包含金属的反射率值与非金属的反射率值,即金属与非金属的F0。
- 一般非金属部分应为2-5%,sRGB值应介于40-75之间,常见的宝石在0.05-0.17范围内,普通液体在0.02-0.04范围内
- 一般金属在70-100%镜面反射率范围内,映射到180-255 sRGB
- Glossiness光泽度:与Roughness相反。
优劣分析
- 可以自己控制非金属的F0
- RGB贴图变多,占用内存变大
- 不易控制,容易做出自然界不存在的材质
- 边缘效应会产生黑边,注意贴图分辨率和UV分布
工作流转换
Specular到Metalness的转换
- 创建一张Metalic图
- 以Metalic图作为遮罩对Specular处理,得到金属的反射率值
- 覆盖到原本的diffuse
Specular到Metalness的转换
- 依靠金属与非金属在diffuse和specular的差异获得一张Metallic贴图
- 使用Metallic图作为遮罩,对BaseColor处理,将金属部分抠去,得到Diffus贴图
- 翻转Metallic图,作为遮罩对BaseColor处理,剩余的部分覆盖56度灰,得到Specular贴图