2022-06-243507次浏览
0评论
22收藏
5点赞
分享
Substance官方提供了一个非常好的PBR指南。首先2017的版本网上已经有翻译了,然后这次翻译2018的版本, 重新整理为Markdown。因为官方不知道哪天会出中文版, 所以本文后面部分也可以直接看官方 Vol1 Vol2 ,但本文有大量的总结。
文章篇幅很长, 这里抽取里面规范的部分整理出来:
1.第一部分, 官方指南里的规范整理部分/应用经验——每个只保留一句话, 好记。
2.第二部分, 再展开一点点注意事项, 每个几句话。
3.第三部分, 官方文档的翻译Vol2, Vol1
用Substance Painter/Designer的标准材质来制作PBR贴图, 不要自己画
用Substance Painter/Designer的标准材质来制作PBR贴图, 不要自己画; 让TA做标准材质; 发给外包
用Substance Painter/Designer的标准材质来制作PBR贴图, 不要自己画; 使用标准场景测试(看下面)
天上飘来3个字--"用~标~准~材~质"
PBR是一个物理模型, 不是手绘模型, 给出合理的输入, 才会有合理的输出。不要把颜色搞成灰色的, 调一下就当Metallic, 再调一下当Roughness, 虽然看上去也有那么回事,但是就别想得到最好的效果了。
BaseColor应该是中灰的; 数值应该是50 ~ 240的sRGB
BaseColor在金属和非金属的时候意义不一样; 金属是反射率; 非金属是漫反射颜色;
BaseColor的亮度, 非金属部分基本上应该在127(sRGB 187附近)附近为峰值服从正态分布, 然后金属部分集中到240左右的附近的分布; 看下面详细论述
Metallic控制是否为金属,氧化, 生锈, 油漆之后, 都应该认为是非金属,直接Metallic非黑即白不失为好的指导思想。
BaseColor/Metallic不同情况的数值
BaseColor一般存储为sRGB贴图, 即就是PS里面画出来的; 而Normal,Metallic, Roughness, AO等其它都经常使用线性贴图, 所以最好用Substance制作, 不然这个变换就要解释半天.
Roughness: 对比Metallic和BaseColor在现实世界中都有一一对应关系, 粗糙度是很主观可以自己调节的
一个石头, 一个金属, 拿个砂纸磨一磨看上去可能完全不一样了
Normal , 请正确用高模烘焙; 手绘NormalMap这种事情, 最好没事不要做
AO, 应该用Substance的工具生成AO, 用Bake工具也行, 用Designer里面的节点也行, 用sbsbaker自动化命令行工具也行. 这个时候又会遇到直接把颜色调一下当AO的情况, 别.
Diffuse/Specular/Glossiness的模型一般不采用, 所以原则看下面展开叙述的部分
推荐看Vol2最下面的图表部分, 可以看到直观的图表; 发现Unity的图表更直观, 这里也一并附上。
注意Unity的规范和Substance的在值的范围上略有不同, 但是原则上是一致的。
Roughness-Metallic矩阵:
Metallic/Roughness流的校正表:
Specular/Glossiness的较正表:
我们项目在使用PBR的时候, 曾经有一段时间经常出现物体亮度无法匹配的问题.BaseColor的亮度, 非金属基本上应该服从正态分布, 然后金属部分集中到240左右的附近的分布。下面是官方的材质还有我们自己PBR做的比较好的贴图, 发现基本是在中灰附近正态分布的。
检查BaseColor是否合法的方法除了使用官方的PBR Utilities之外, 可以手工做:PS打开贴图, 改成图像>模式, LAB模式; 窗口打开直方图,然后在通道里面点明度(L)通道, 就可以看到明度分布了;
这个和官方指南里面的BaseColor的指导是一致的: BaseColor图可以认为是色调有点平坦. 也就是说, 它的对比度应该低于传统的漫反射贴图. 具有太亮或太暗的值是不可取的。另外, 推荐使用Paragon的那种测试场景来验证. 这个在我们公司的复数项目得到非常好的实践; 看下面:
可以看视频:
Paragon Character Texturing Pipeline | Unreal Dev Day Montreal 2017 | Unreal Engine
核心就是做一个标准场景, 做标准灯光, 标准BRDF(PBR), 标准ToneMapping(ACES), 把东西放进去比较得到你想要的效果。
在Painter自定义Shader以对齐ACES。
Paragon分享说注意标准场景是一切的基础, 出了问题先整标准场景里面的材质, 然后如果再出问题, 就是场景的问题. 我们问题是一步一步解决的, 基础正确, 然后逐步上升, 而不是削足适履。
最严重的问题: PBR是一个物理模型, 不是手绘模型, 给出合理的输入, 才会有合理的输出。没有按照PBR规范制作各个通道的贴图, 导致各种Tweak/Trick参数的出现, 导致整个画面总有一些不和谐的亮度和暗部, 什么后处理都救不回来。再次重申: 不要把颜色搞成灰色的, 调一下就当Metallic, 再调一下当Roughness, 还有手绘Normal.真是让人要(╯ ̄Д ̄)╯╘═╛ 的
BaseColor应该是中灰的
1.对于黑暗值, 你不应该**低于30-50 sRGB. **
2.暗数值的范围可以放宽到30 sRGB, 严格一些则应该在50 sRGB以上.
3.对于明亮的颜色, 您不应该有高于240 sRGB的任何值(图23).
4.使用微遮挡(micro-occlusion)的Shader模型情况下(如表现海边多孔石头的边沿), 可以使用更高的180-255的数值
5.金属原料的反射率会很高, 所以可以使用180-255
PS: 所谓的sRGB你可以认为就是PS上看上去的贴图的颜色; 而不是线性空间的颜色
煤炭可能是很黑的, 但是并不是完全没有光的, 如果你把BaseColor设得太低, 则即使阳光直射到它表面都不会获得实际世界里面得亮度
同理新雪可能很白, 但是并不是不会吸收光能的, 如果你把BaseColor设太高, 则会抢场景其它地方的亮度导致后处理都无法正常调和光照
PBR的物理模型会帮你处理好最终的光照, 你按照实际标准材质的规范输入数值即可
最稳妥的做法是使用Substance里面的现成节点来绘制/连线得到贴图
BaseColor在金属和非金属的时候意义不一样
在PBR模型里面, 可以认为Metallic是0的时候, BaseColor的颜色是绝缘体, 认为有F0为0.04的反射率 (菲尼尔系数)。绝缘体颜色的物理意义就是漫反射Diffuse的颜色;
而Metallic是1的时候, BaseColor是导体的F0系数,这个不是高光颜色也不是任何别的东西, 所以如果要金属反射正确, 最好使用Substance的固有金属节点来制作。
Metallic图以类似于蒙版的方式操作, 因为它告诉着色器如何解释在BaseColor中找到的数据。金属部分就是金属部分; 一旦蒙尘就应该理解为非金属(绝缘体)或者半导体, 使用非金属的准则。一旦叠加蒙尘和划痕, BaseColor和Metallic和Roughness可能都是要改的; BaseColor就需要从表示金属反射率的240以上, 调节到表示非金属的中灰。
Diffuse贴图的原则
颜色代表非金属材料的反照率和纯金属的黑色(0.0).
除了微遮挡外, 应该没有照明信息.
黑色值不应低于30 sRGB(容许范围)或50 sRGB(严格范围), 除非纯金属为黑色.
亮度值不应高于240 sRGB
Diffuse贴图和BaseColor的比较
在Metallic/Roughness模型下面, BaseColor同时存了金属和非金属2者的东西, 通过Metallic分开处理
而Specular/Glossiness模型下面, 非金属都在Diffuse里面, 金属都在Specular里面
Specular贴图包含金属和非金属的F0值; 所以可以精确控制
绝缘体反射比Metallic少量的光. 普通绝缘体的价值将在2-5%左右. 就sRGB而言, 数值应介于sRGB 40-75之间, 它与0.02-0.05(线性)范围重叠.
常见的宝石在0.05-0.17(线性)范围内.
普通液体落在0.02-0.04(线性)范围内.
纯金属的反射率值将在70-100%Specular范围内高, 我们可以将其映射到180-255 sRGB.
如果找不到特定材料的IOR值, 则可以使用4%(0.04 - 塑料)
Substance允许对绝缘体的F0进行数值细致定义, 贴图输出到specularLevel的Output通道
贴图的0-1会被映射到实际数值0-0.08
实际测试对效果影响几乎看不到, 手游可以不处理这个通道
Diffuse/Specular不同情况下的数值
Glossiness = 1 - Roughness. 制作规范和Roughness相同; 这个可以用SD的BaseColor/Metallic/Roughness Convertor 来验证
能量守恒
从表面反射的光永远不会比它撞击表面之前更强烈
这个由PBR保证
PBR是能量守恒的, 也就是出射光能 <= 入射光能
金属非金属的区别
F0反射率值对于大多数常见绝缘体而言具有最小的变化, 并且在2-5%的范围内. 金属的F0值很高, 从70-100%不等.
蒙尘/划痕/污垢/油漆/风化/生锈, 这些在金属上发生的现象, 导致金属会变成半导体甚至绝缘体, 要按照非金属或者 金属/非金属 之间那样来处理
计算要在线性空间处理
BaseColor/Diffuse/Specular一般用sRGB空间来输入输出
Metallic/Roughness/Glossiness 一般用线性空间输出
这个Topic虽然并不算很复杂, 但是并不容易一下子理解
PS: 在PBR模型里面, 可以认为Metallic是0的时候, BaseColor的颜色是绝缘体, 则颜色的物理意义就是漫反射Diffuse的颜色; 而Metallic是1的时候, BaseColor是导体的F0系数, 这个不是高光颜色也不是任何别的东西, 所以如果要金属反射正确, 最好使用Substance的固有金属节点来制作。
👇推荐阅读👇
【Substance2018版】The PBR Guide Vol.1理论篇完整翻译
【Substance2018版】The PBR Guide Vol.2实践篇完整翻译
评论 0