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范围内去显示,并且根据曝光系数调整曲线 使大部分颜色看起来更加接近该亮度。
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范围内去显示,并且根据曝光系数调整曲线 使大部分颜色看起来更加接近该亮度。
相关文章推荐
- 算法系列之九:计算几何与图形学有关的几种常用算法(二)
- 几种简单常用的镜头边缘检测算法(matlab实现)
- 总结几种常用的安全算法
- 算法系列之九:计算几何与图形学有关的几种常用算法(一)
- 几种常用的算法
- C#常用的几种算法
- 几种常用加解密算法简单介绍
- 算法系列之九:计算几何与图形学有关的几种常用算法(二)
- 分享几种常用算法的思想
- 计算几何与图形学有关的几种常用算法(一)
- 计算几何与图形学有关的几种常用算法(一)
- 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版
- 几种常用的算法简介
- 计算几何与图形学有关的几种常用算法(二)
- 几种常用的排序算法:插入排序、冒泡排序、选择排序的算法及C++实现
- 计算几何与图形学有关的几种常用算法(二)
- 几种常用的算法简介
- 几种编程题高难度常用算法总结
- 常用的几种算法总结
- 算法系列之九:计算几何与图形学有关的几种常用算法(一)