目錄
前言:
一、UnityHDR面板的規律
二、HDR與基礎顏色轉換,HDR強度獲取,輸入設置強度獲取
1.基礎色->HDR顏色
2.HDR顏色->基礎色
3.獲取HDR顏色在面板中的強度
?4.獲取HDR顏色在面板設置輸入時的強度
前言:
HDR(高動態范圍成像),相比LDR(低動態范圍成像)能夠帶來更好的畫面效果,隨著移動設備性能的提升,越來越多的設備都支持HDR模式。而在Unity中,如何在基礎顏色以及HDR顏色之間相互轉換,是這篇文章的主題。
一、UnityHDR面板的規律
上面有三張圖,第一張是一張簡單的紅色HDR配置面板,第二張是我改變Intensity,HDR面板的數值,而第三張則是在我確認輸入Intensity后關閉面板再打開的HDR面板。
為什么最后確認輸入打開的面板數值,和我設置看到的面板數值有不同了?
實際上,Unity在用戶輸入Intensity時和最終得到的intensity意義是有所不同的。它們之間做了一個轉換與解壓。
以下算法將會解答你的疑問。
二、HDR與基礎顏色轉換,HDR強度獲取,輸入設置強度獲取
這個算法能幫助需要制作調色板功能的用戶,對HDR顏色和基礎色顏色之間進行自由操作。
1.基礎色->HDR顏色
//baseColor指代基礎色,比如圖1的紅色(1,0,0,1)//intensity指代輸入強度,比如圖2輸入的強度數值2internal static Color HDRColor(Color baseColor, float intensity){return baseColor * Mathf.Pow(2f, intensity);}
很簡單吧,基礎色到HDR顏色,就是進行了一個Pow操作。
2.HDR顏色->基礎色
//其中hdrColor指代需要進行轉換的HDR顏色,這個函數返回一個沒有HDR的基礎色//比如圖3的hdr顏色數值(4,0,0,1),轉換后就會得到圖1的顏色數值(1,0,0,1)internal static Color32 DecomposeHdrColor(Color hdrColor){Color32 baseColor = hdrColor;float maxColorComponent = hdrColor.maxColorComponent;if (maxColorComponent == 0f || (maxColorComponent <= 1f && maxColorComponent >= 0.003921569f)){baseColor.r = (byte)Mathf.RoundToInt(hdrColor.r * 255f);baseColor.g = (byte)Mathf.RoundToInt(hdrColor.g * 255f);baseColor.b = (byte)Mathf.RoundToInt(hdrColor.b * 255f);}else{float num = 255f / maxColorComponent;baseColor.r = Math.Min((byte)255, (byte)Mathf.CeilToInt(num * hdrColor.r));baseColor.g = Math.Min((byte)255, (byte)Mathf.CeilToInt(num * hdrColor.g));baseColor.b = Math.Min((byte)255, (byte)Mathf.CeilToInt(num * hdrColor.b));}return baseColor;}
3.獲取HDR顏色在面板中的強度
//hdrColor就是需要進行獲取的HDR顏色,此函數返回HDR顏色在編輯器中最終顯示的強度
//比如圖3的HDR顏色,它的強度在面板顯示是2.416924,這個函數就會返回這個數值
internal static float GetHdrIntensity(Color hdrColor){float maxColorComponent = hdrColor.maxColorComponent;if (maxColorComponent == 0f || (maxColorComponent <= 1f && maxColorComponent >= 0.003921569f)){return 0f;}else{float num = 191f / maxColorComponent;return Mathf.Log(255f / num) / Mathf.Log(2f);}}
?4.獲取HDR顏色在面板設置輸入時的強度
//hdrColor指代需要解壓的HDR顏色,此函數返回在HDR顏色設置面板輸入的強度
//比如圖3,它的HDR顏色為(4,0,0,1),它返回的輸入強度就是圖2的輸入強度2internal static float DecomposeHdrIntensity(Color hdrColor){float maxColorComponent = hdrColor.maxColorComponent;if (maxColorComponent == 0f || (maxColorComponent <= 1f && maxColorComponent >= 0.003921569f)){return 0f;}else{float num = 255f / maxColorComponent;return Mathf.Log(255f / num) / Mathf.Log(2f);}}
以上便是HDR顏色與基礎色之間的操作。