在 Unity 的 Shader 编写过程中,HDR(High Dynamic Range,高动态范围)颜色 是一个重要概念,主要用于在图像渲染过程中保留更丰富的光照信息,特别是在涉及到发光(Emission)、Bloom 等后期效果时。以下是关于 HDR 颜色在 Unity Shader 中的详细说明:


🌈 一、HDR颜色的作用

HDR颜色的核心优势是它能表达超出0-1范围的颜色值(例如 (10, 2, 1) 这样的 RGB 值),这些高亮度值不会被立即压缩,而是在后处理阶段(如Bloom)中用来模拟真实世界中光线溢出的视觉效果。

在 Unity 中典型用途:

  • 用于 Emission(自发光) 属性。
  • 用于 体积光、激光、爆炸、魔法特效等高亮区域。
  • 后处理 Bloom 搭配使用,模拟光晕效果。

🧪 二、在 Shader 中如何设置 HDR 颜色

1. 在 Shader Property 中声明支持 HDR 的颜色(HLSL 或 ShaderLab):

[HDR]_EmissionColor("Emission Color", Color) = (1,1,1,1)

这段代码:

  • Color 表示类型为颜色。
  • [HDR] 属性让该字段支持 HDR 范围(在材质 Inspector 面板中可看到更亮的颜色值)。
  • 默认值 (1,1,1,1) 是线性色空间下的白色。

注意:Unity 的 Standard Shader 中,Emission 的颜色属性本身就是 HDR 的。


2. 在代码中处理 HDR 颜色

当你在 Shader 中使用 _EmissionColor 时,比如:

fixed3 emission = _EmissionColor.rgb;

你可以把这个颜色乘以一个强度因子以放大效果(如 10 或更高):

fixed3 emission = _EmissionColor.rgb * 10.0;

这个值最终会被输出到 emissive 通道中:

return fixed4(emission, 1.0);

Unity 在开启后处理的前提下,会用 Bloom 等效果将这种高亮颜色做特效处理。


🔍 三、HDR颜色需要注意的问题

  1. 后处理Bloom必须开启:HDR颜色的溢出效果只有在摄像机开启了 Bloom 才能被看到。
  2. 使用 HDR RenderTexture:在渲染路径中(如 Forward 或 Deferred),相机输出目标应为 HDR 否则会裁切颜色范围。
  3. 线性空间更真实:在项目设置中启用“Color Space: Linear”可以更真实地处理 HDR 光照。

✅ 四、实际例子:实现一个 HDR 自发光材质

Shader "Custom/HDR_Emission"
{
    Properties
    {
        [HDR]_EmissionColor("Emission Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            fixed4 _EmissionColor;

            struct appdata {
                float4 vertex : POSITION;
            };

            struct v2f {
                float4 pos : SV_POSITION;
            };

            v2f vert (appdata v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target {
                return _EmissionColor; // HDR 颜色直接输出
            }
            ENDCG
        }
    }
}

搭配 Bloom 后处理组件,你会看到颜色值越大,发光越明显。


📌 总结

项目 描述
HDR颜色意义 表示大于 1 的亮度值,适合表达强光或发光区域
使用场景 Emission、自发光材质、特效、体积光
Shader中标注 [HDR]_Color(...)
与 Bloom 搭配 实现光晕、发光溢出等真实效果
色彩空间推荐 使用 Linear 色彩空间提升真实感

如果你需要我提供完整的发光 Shader + Bloom 效果展示或完整项目范例,也可以告诉我。