unity hdr与普通颜色转换

    private const byte k_MaxByteForOverexposedColor = 191;
    /// <summary>
    /// hdrcolor转普通color
    /// </summary>
    /// <param name="linearColorHdr"></param>
    /// <param name="baseLinearColor"></param>
    /// <param name="exposure"></param>
    public static void DecomposeHdrColor(Color linearColorHdr, out Color32 baseLinearColor, out float exposure)
    {
        baseLinearColor = linearColorHdr;
        var maxColorComponent = linearColorHdr.maxColorComponent;
        // replicate Photoshops's decomposition behaviour
        if (maxColorComponent == 0f || maxColorComponent <= 1f && maxColorComponent >= 1 / 255f)
        {
            exposure = 0f;
            baseLinearColor.r = (byte)Mathf.RoundToInt(linearColorHdr.r * 255f);
            baseLinearColor.g = (byte)Mathf.RoundToInt(linearColorHdr.g * 255f);
            baseLinearColor.b = (byte)Mathf.RoundToInt(linearColorHdr.b *
Unity中设置HDR颜色,主要涉及到材质的处理以及Shader的编写或配置。由于HDR(High Dynamic Range)颜色允许RGB值超过1,因此需要特定的方式进行配置以避免被限制于标准动态范围(SDR)的颜色空间。 ### 设置HDR颜色 #### 1. 使用 `Material.SetVector` 方法 当需要通过代码对材质设置HDR颜色时,应使用 `Material.SetVector` 方法而非 `Material.SetColor`。这是因为 `SetColor` 的RGB值会被限制在0到1之间,而 `SetVector` 允许传递超出此范围的值,从而实现HDR效果[^1]。 ```csharp // 示例:使用 Material.SetVector 设置 HDR 颜色 material.SetVector("_EmissionColor", new Vector4(2.0f, 1.5f, 1.0f, 1.0f)); ``` #### 2. Shader 中定义 HDR 属性 确保Shader支持HDR颜色输入。可以在Shader中定义一个属性,并将其标记为HDR格式,这样Unity会允许该属性接受大于1的值。例如: ```glsl Properties { _EmissionColor ("Emission Color (HDR)", Vector) = (1,1,1,1) } ``` 同时,在CG/HLSL代码块中声明相应的变量来接收该值: ```glsl fixed4 _EmissionColor; ``` #### 3. 启用HDR渲染功能 如果项目需要完整的HDR支持(如HDRP管线),则需要在Unity编辑器中启用相关设置。导航至 **Edit > Project Settings > Graphics**,并检查当前使用的渲染管线是否支持HDR。对于HDRP(High Definition Render Pipeline),HDR是默认支持的。 #### 4. 动态调整HDR颜色强度 如果需要在运行时动态调整HDR颜色的亮度,可以参考以下脚本示例: ```csharp public class TestEmission : MonoBehaviour { public string propertyName; // 材质属性名称 public MeshRenderer meshRenderer; private Material material; [Range(0f, 10f)] public float intensity = 1.0f; private Color baseColor; void Start() { material = meshRenderer.material; baseColor = material.GetColor(propertyName); } void Update() { float factor = Mathf.Pow(2, intensity); Color finalColor = new Color(baseColor.r * factor, baseColor.g * factor, baseColor.b * factor); material.SetColor(propertyName, finalColor); } } ``` 此脚本通过指数级放大基础颜色分量,实现动态增强HDR效果[^3]。 #### 5. 处理光照贴图中的HDR数据 需要注意的是,普通的PNG图像无法直接用于光照贴图以表现HDR效果,因为它们的颜色值受限于0-1范围内。HDR图像虽然在视觉上可能普通图片相似,但其内部存储的像素值可能大于1,这些高精度数值只能在Shader中正确解析和使用[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值