猜一猜对方需要还原什么效果
逼得一个美术岗位, 分离出普通3d美术和cocos3d美术
其实只是个很简单的上车游戏
首先原画先把最终效果画好(下图)
然后3d美术尽可能的还原(上图)
但是就是还原不出来
情愿花钱也想解决的问题, 估计也死了不少脑细胞
最初我以为是灯光被乱调, 导致颜色对不上
后来项目发我看了一下, 全是unlit的材质, 灯光删了也没区别
不过小游戏, 这样也合理啊, 挺专业的
但是这样就只能调整贴图颜色了吧
这些粗活我就嫌弃了, 不过可以先试一个
我秉承’过程对等就是结果对等’的原则, 拿着截图放进ps调整了一下
嗯嗯, 亮度55, 对比度100, 差不多了
然后挑了几张贴图, 反手就是一个复制粘贴合并保存
预期着贴图刷新之后, 渲染结果就是和我调整的截图一样
毕竟unlit嘛, 既然灯光啥的干扰因素都没有, 那只能输出贴图颜色了对吧
“这个美术真菜, 贴图颜色都调不好”
然而, 替换贴图之后没有达到预期的效果
我觉得事情并没有如此简单
虽然我一直都觉得cocos输出的颜色有点怪怪的
但是从来没怀疑过是unlit会有问题
毕竟unlit嘛, 只能输出贴图颜色对吧?
于是我创建了一张纯红色的贴图
发现渲染结果居然不是纯红色(255,0,0)的 !!
我关注点转移到shader上
拷贝了一下unlit.effect, 直接 return o;
发现还是不能还原, 出来的整个图都变暗了
这什么鬼啊, 气死我了
这时候再次秉承’过程对等就是结果对等’的原则
将输出的结果截图放到ps上对比
发现色阶可以有效的抵消变暗的效果
再问问gpt, ps的色阶是怎么实现的啊?
再经过优化之后, 就是一句, 没错就是一句
最终效果对比一下, 留意右下角的灰度渐变
整个效果就还原了
而且还是截图取色器都能100%还原那种
这时候我发现, 水面的贴图是蓝色的啊
再回头对比一下, 原画的水面是天蓝色的
这中间都经历了什么? 我们可以想象一下
3d美术做了一个天蓝色的贴图
但是放进cocos之后, 显示了另一种蓝色(估计是更浅的蓝色)
为了修正这个问题, 美术把一张天蓝色的贴图改成蓝色
最后将这张蓝色放回cocos中, 最终显示天蓝色的样子(但是还是有点灰蒙蒙的感觉)
这是什么乱七八糟的逻辑
最后是装逼时间
可以看到
可见即可得的工作流, 对于美术人员来说是多么重要
反过来说
中间多了一层不可预知的变化, 能把美术吓得分裂
也许下次听到cocos的3d项目, 就让对方另找高人了吧
至于引擎组是出于何种原因, 最终让unlit输出的颜色发生了变化, 我不得而知
甚至版本都发行到3.8了, 还保留着这个效果
而我粗暴的抛弃了CCFragOutput(o)的方案, 会不会导致其他的问题, 也没有测试
只测了web, pc和安卓浏览器都是正常的
(CCFragOutput的调用链, 基本上全是兼容不同的颜色格式)
但是我觉得, 一个产品, 应该尽量减少这种变化, 才会更好用, 才会更多人愿意用
而业余的人员也能够参与使用, 输出成果, 更是这个产品的生命力的一种象征
- 这里是二次编辑
经过排查, 造成色偏的原因, 是因为场景勾选了HDR, 而不是LDR
我也不知道是开项目默认HDR还是美术自己勾选的
由于我没怎么使用过这个模块, 所以完全没有注意
勾选LDR的情况下, 内置unlit即可还原贴图的颜色
而勾选HDR的情况下, 颜色最终会发生偏差
而刚好pow(0.5)是逆向运算, 算是误打误撞的解决了问题
至于unlit这个概念, 就是无光照而已
也没有表达不包含其他渲染效果, 比如全局雾也是有计算的
但是一直都觉得unlit只是一个搬运贴图的shader
就没觉得HDR和LDR会干预到它