您的位置:首页 > 移动开发

Tonemapping常用的几种算法

2017-09-19 10:15 375 查看
SimpleReinhard :

float4 fragSimpleReinhard(v2f i) : SV_Target

{
float4 texColor = tex2D(_MainTex, i.uv);
float lum = Luminance(texColor.rgb); 
float lumTm = lum * _ExposureAdjustment;//曝光系数
float scale = lumTm / (1+lumTm);  
return float4(texColor.rgb * scale / lum, texColor.a);
}

------------------------------------------------------------------------------------

Hable:

float4 fragHable(v2f i) : SV_Target
{
const float A = 0.15;
const float B = 0.50;
const float C = 0.10;
const float D = 0.20;
const float E = 0.02;
const float F = 0.30;
const float W = 11.2;
float3 texColor = tex2D(_MainTex, i.uv).rgb;
texColor *= _ExposureAdjustment;
float ExposureBias = 2.0;
float3 x = ExposureBias*texColor;
float3 curr = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;
x = W;
float3 whiteScale = 1.0f/(((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F);
float3 color = curr*whiteScale;
return float4(color, 1.0);
}

-------------------------------------------------------------------------

Photographic:

float4 fragPhotographic(v2f i) : SV_Target
{
float4 texColor = tex2D(_MainTex, i.uv);
return 1-exp2(-_ExposureAdjustment * texColor);
}

-------------------------------------------------------------------------------

OptimizedHejiDawson:ds的算法跟这个接近

float4 fragOptimizedHejiDawson(v2f i) : SV_Target 
{
float4 texColor = tex2D(_MainTex, i.uv );
texColor *= _ExposureAdjustment;
float4 X = max(float4(0.0,0.0,0.0,0.0), texColor-0.004);
float4 retColor = (X*(6.2*X+.5))/(X*(6.2*X+1.7)+0.06);
return retColor*retColor;
}

算法千差万别,但是目的是一样的,就是通过公式,把输入值HDR颜色或正常颜色映射到0-1范围内去显示,并且根据曝光系数调整曲线 使大部分颜色看起来更加接近该亮度。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: