UEToUnity CLUT

首先对于整个颜色计算的流程,请先看学姐的文章,游戏相关的贴图相关我之前也有写篇文章

[总结] 漫谈HDR和色彩管理(一)光、颜色和色度图 - 知乎

这里只关注普遍的SDR的输出设备的流程,我们知道UE的流程是:

1、sRGB linear space下的光照计算

2、生成CLUT:

white balance(sRGB linear->ACES AP1)

HDR color Grading(AP1下计算)

LMT->RRT+ODT(UE的Tonemapping指RRT和ODT合并之后统一进行的曲线映射部分)

ACES LMT中的blue light ArtifactFix来修正高亮度的蓝色导致的过饱和问题

AP1_2_sRGB转回sRGB linear

SDR OETF

所以我们要做的就是把UE CLUT这部分的计算挪到Unity中

UE相关的计算主要是这几个文件

 我们可以在UE中PC和安卓分别截帧debug pixel看他们的计算流程,可以看到主要的计算流程没啥区别,只是PC端compute生成的是3DLUT,安卓是2DLUT

UEToUnity CLUT_第1张图片

 在Unity中这三直接拿过来用,还有几个别的文件里用到的函数记得也写进去。然后在Unity中也用computeShader来调CombineLUTsCommon就行,计算都是一样的。如果就用一套默认参数的LUT,那UE生成的LUT也可以直接拿来用..

 然后计算相关的参数记得要声明全,很多后处理组件上设的参。少传了或者值没对效果都不对的,这时候建议每个步骤一边改源码一遍俩引擎截帧对应看,容易定位哪里出问题了。

结果

UEToUnity CLUT_第2张图片

然后关于LookDev,像UE Unity SP这些效果要完全一样那也是不阔能的,像Unity IBL漫反射部分的三阶球谐,SP的二阶球谐。Unity、UE的IBL镜面反射部分的MipMap+预积分LUT和SP的重要性采样的区别。以及引擎本身IBL的结果效果就有区别,如Unity的realTimeGI和UE的动态SkyLight的结果就不一致,烘焙变数就更大了。

顺便一提,测了一下Unity中强度1的白平行光,对应UE中PI lux的白平行光,用白色,金属度0,粗糙度1的收光平面测试,无GI影响的情况下结果对应。

UEToUnity CLUT_第3张图片

还有LookDev的搭建通过俩张色卡截图生成颜色LUT的方式是不正确的,一是不准确,二是UE4的后处理都是在HDR的线性空间下计算的,LDR的LUT颜色校正方式本来就是比较老的方式对应PS这种LDR的校正的,更合理的方式应该是都放在ColorGrading中处理。

以上

记录下遇到的小问题,直接使用compute生成好的结果的图时遇到了效果问题。一开始以为是生成的贴图精度不够,或者贴图压缩之类的导致的。一开始是将compute的结果存到A2R10G10B10的RT中,但是这个格式RGBAFloat的Texture不支持,所以后面就都用RGBAFloat了。但是仍然有这个问题,截帧看发现是Unity强制了9倍各项异性采了LUT。所以改下设置就好了。

 

 

其实也可以看出来,用什么引擎其实问题真的不大。标准环境的搭建固然重要,但一味地扣像素级的对其标准在我看来是真没必要。像我们学习美术的最终目的是在于表达我们的内心的想法,做游戏也应如此,这也是我前进的动力。长路漫漫

你可能感兴趣的:(甜品屋,unity,游戏引擎)