Posted on 2013-04-05 15:07
Husman 阅读(5371)
评论(1) 编辑 收藏 引用
tonemapping可以说是影响HDR最终质量关键因素之一。
这里略去HDR基本流程,这个可以在网上很容易找到,我这里只简单说一下网上没有的东西。
细心观察"HDR Lighting sample" in DirectX 9.0c SDK,会发现sample上的暗区的细节保留不够,而亮区部分又感觉有点过曝。
我在此基础上做了些修改,色调映射用了
Exponential tone mapping算法
公式:color = 1 - exp( -Exposure * color )在tone map之前先对场景的低亮度区域做对比度调整,color = pow(color, k1+Lum*k2);
这里k1,k2是两个可以在shader上调整的参数。
Exposure = MiddleGray / Lavg,归一化后就是1/(1+Lavg/MiddleGray),MiddleGray我们通常设成0.18,1/MiddleGray大概等于6
简化后这个公式就是Exposure = 1/(1 + 6 × Lavg)× K,K是一个可以调节的参数
Vignetting暗角可以通过采样边角饱和度低的灰度纹理实现。
代入tone mapping公式就变成
color = 1 - exp( -Exposure * color * Vignetting )DXsample中的效果:
改进之后的效果:
可以看到改进后暗部细节表现的更加细致,亮部也没有过曝,四周也呈现了一定的晕影
参考文献
http://megapov.inetart.net/manual-1.2/global_settings.html#film_exposure
http://filmicgames.com/archives/75
http://freespace.virgin.net/hugo.elias/graphics/x_posure.htm
"HDR Lighting sample" in DirectX 9.0c SDK