1
2
3
4
5
6
float factor = Mathf.Pow(2,intensity);

Color color = new Color(baseColor.r * factor,baseColor.g * factor,baseColor.b * factor);

Color hdrColor = baseColor * factor;

intensity 强度
baseColor 基础颜色

以下暂未验证

HDRcolor面板的intensity 获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private void Start()
{
Color32 color32;
float exp;
DecomposeHdrColor(color, out color32, out exp);
Debug.Log(exp);
}

private const byte k_MaxByteForOverexposedColor = 191;
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 * 255f);
}
else
{
// calibrate exposure to the max float color component
var scaleFactor = k_MaxByteForOverexposedColor / maxColorComponent;
exposure = Mathf.Log(255f / scaleFactor) / Mathf.Log(2f);
// maintain maximal integrity of byte values to prevent off-by-one errors when scaling up a color one component at a time
baseLinearColor.r = Math.Min(k_MaxByteForOverexposedColor, (byte)Mathf.CeilToInt(scaleFactor * linearColorHdr.r));
baseLinearColor.g = Math.Min(k_MaxByteForOverexposedColor, (byte)Mathf.CeilToInt(scaleFactor * linearColorHdr.g));
baseLinearColor.b = Math.Min(k_MaxByteForOverexposedColor, (byte)Mathf.CeilToInt(scaleFactor * linearColorHdr.b));
}
}