找回密码
 立即注册
查看: 533|回复: 0

Unreal | PBR检测工具

[复制链接]
发表于 2020-11-25 20:41 | 显示全部楼层 |阅读模式


我们在使用pbr流程的时候都根据项目要求有一些颜色值范围,比如说substance的30/50-240。我们在painter或者designer里面画贴图的时候如果颜色值不在正确的范围内,导入到引擎里面效果就会有问题,所以就需要一些在引擎里面检查颜色值或者粗糙度值是否规范的工具。下面就介绍一些这款朋友提供的检查basecolor的工具。
1非金属

首先这个tool的功能是检查整个场景的basecolor在不在我们规定的范围内,所以最好的方式是直接添加一个后处理材质,这样就能作用到整个场景。所以首先新建一个材质球命名为mat_PbrValidate,然后设置Material Domain为Post Process,现在整个材质就只有一个Emissive Color属性暴露出来了,我们只需要把我们的检查连接到这个属性上面。





然后,需要获取场景中的basecolor,右键添加节点SceneTexture,然后选择节点的Scene Texture Id属性为BaseColor(for lighting)才能得到整个场景的base color。




我们给输出的base color添加一个desturation节点来降低base color饱和度,将0-255的颜色值范围转化到0-1的范围,方便检测。




获取到场景中颜色值以后,我们就可以直接用if来进行判断。如果我们项目规定颜色值范围需要在50-240范围内的话,我们就要用两个if分别判断是不是大于50和小于240。
由于unreal里面默认的颜色使用的是linearsrgb,所以判断之前我们需要将50和240从srgb转化成linear srgb。转化公式如下:Linear = Pow((srgb/255+0.55)/1.055, 2.4)
我们可以直接在引擎里面算,也可以在外面算好了最后的值再放进来。这里我们直接在引擎里面写,因为需要计算幂函数不用一些特殊手段不太好整。下面是最高值和最低值的线性转换,可以把范围暴露出来,方便不同的项目需求。




然后开始连接到if语句上面,对于最低范围bc_low(50),如果输入的值A>=50,则输出1;否则就是在范围之外的错误值,输出0。
同样,对于最高值bc_high(240),如果输入的值A>=240,则是超出范围的错误颜色值,输出1;否则是<240的正确值输出0。




这里最高值的判断和最低值的判断相反(最低值正确为1,最高值正确为0),是因为我们可以利用两者之间的减法来lerp不同的颜色区分错误和正确的颜色区域。
所以接着我们把两个if相减,然后和表示错误的红色以及表示正确的绿色进行lerp。





所以假设一下,如果输入的颜色值是40,则上面的if输出0,下面的if输出0,相减得0,则输出色;

如果输入的颜色值是100,上面if输出1,下面输出0.相减得1,输出绿色;

如果输入颜色值250,则上面if输出1,下面if也输出1,相减得0,输出红色。

2金属
但是,上面讨论的都是非金属的basecolor,如果检测的模型中有金属,那basecolor可能超过240,所以我们需要在最后的输出中排除这种金属的情况。即如果得到的红色部分中的金属度有大于0的,则这块区域的颜色值是正确的。
同样先用SceneTexture获取场景中的金属,然后去饱和度,再用if判断




如果得到的值>0,则是金属,输出0,将输出值与楼上红绿颜色相乘,如果楼上的金属那部分的颜色值是大于240的则相乘以后等于0黑色,符合pbr规定范围。

我们将最后的输出放到Emissive Color中。然后保存整个材质。




然后将这个材质加入到我们要检测的场景中。
首先给我们需要检测的场景拉一个post process volume,放大到你想要检查的区域。




在postprocess的属性中找到renderingfeatures属性,并在Array中点加号新加一个AssetReference,把我们的mat_PbrValidate材质的instance放进去。








然后在场景中移动摄像机到post process的范围内,就可以看到不在范围内的红色和符合范围的绿色啦。






- End -

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 08:32 , Processed in 0.097974 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表