Tonemapping常用的几种算法

来源:互联网 发布:自己设计房屋软件 编辑:程序博客网 时间:2024/05/29 10:30

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范围内去显示,并且根据曝光系数调整曲线 使大部分颜色看起来更加接近该亮度。


原创粉丝点击