高动态范围颜色(HDR)
在 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颜色需要注意的问题
- 后处理Bloom必须开启:HDR颜色的溢出效果只有在摄像机开启了 Bloom 才能被看到。
- 使用 HDR RenderTexture:在渲染路径中(如 Forward 或 Deferred),相机输出目标应为 HDR 否则会裁切颜色范围。
- 线性空间更真实:在项目设置中启用“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 效果展示或完整项目范例,也可以告诉我。