请教关于修改模型颜色的问题

我在使用 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/

搜了一下代码,自己试试看
math\color.ts
srgbToLinear

谢谢,我试一下

我在3.8.8中没找到。
提供一个转换方法。
public static sRGBtoLinear(c: number) {
c = c / 255; // 0~1
return c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
}

    const color =  new Color().fromHEX("#C25516FF")
    const linearColor = new Vec4(
        Utils.sRGBtoLinear(color.r),
        Utils.sRGBtoLinear(color.g),
        Utils.sRGBtoLinear(color.b),
        color.a / 255
        );

直接除255不行吗

应该不行,这个转换是有公式的。

之前我搞纯色模型的时候试过,使用cocos的面板的color传值,不管在shader中是否使用srgbtoline这些函数,显示出的颜色都和面板颜色不一致;解决方法就是直接传递vec4对象,然后shader中直接使用这个对象。