我在使用 Blender 创建模型后,需要在 Cocos 中动态修改模型颜色。初始的实现方式是这样的:
const modelComp = modelNode.getComponent(MeshRenderer);
const material: Material = modelComp.getMaterialInstance(0);
const color = new Color().fromHEX("#C25516FF");
material.setProperty(‘diffuseColor’, color);
问题是,通过代码修改后的颜色和材质球在编辑器中显示的颜色明显不一致,代码修改的颜色偏亮。
查阅资料后发现,new Color().fromHEX("#C25516FF") 创建的颜色其实是 sRGB 空间的,而 Shader 使用的是 线性空间 颜色,因此直接赋值会出现亮度偏差。经过将颜色转换为线性空间后,显示效果才正常。
我想请教一下:
1. Cocos 官方是否提供将颜色从 sRGB 转换为线性空间的 API?
2. 或者说,我这种通过 setProperty 修改颜色的方式本身就有问题?
希望有经验的朋友可以解答,非常感谢!
了解LinearRGB和sRGB
https://www.zhangxinxu.com/wordpress/2017/12/linear-rgb-srgb-js-convert/