HDR&ToneMapping

高动态光照渲染(High-Dynamic Range,简称HDR)图像,相比普通的图像,可以提供更多的动态范围和图像细节,根据不同的曝光时间的LDR(Low-Dynamic Range)图像,利用每个曝光时间相对应最佳细节的LDR图像来合成最终HDR图像,能够更好地反映出真实环境中的视觉效果。

如上文所说HDR,为高动态范围的简称,何为高动态范围,举例说明:
现实真正存在的亮度差,即最亮的物体亮度,和最暗的物体亮度之比为10的8次方
, 而人类的眼睛所能看到的范围是10的5次方左右,但是一般的显示器,照相机能表示的只有256种不同的亮度。
但是我们可以多拍几张照片,2张,3张,...., 甚至几十张,这些照片的曝光依次增大,很多朋友应该可以想到,随着照片曝光的增大,照片会依次变亮,换一种角度,照片所表示的细节会由暗处向亮处改变。
根据上面的原理,如果我们将照相机拍摄的很多张图片合成,结果图片的数量级一般为10的16次方甚至更多。这样问题就出现了,或者更高数量级的亮度只能存在电脑里,而一般的显示器只能表示10的8次方个亮度数量级,用256个数字来模拟
所能表示的信息,这种模拟的方法就是HDR技术核心内容之一,学名叫Tone-Mapping(色调映射) 。用Tone-mapping压缩以后,我们所合成的HDR影像就能很好地在显示器上显示了,能给人以震撼人心的效果。

参考Opengl官方文档之HDR的描述:

HDR&ToneMapping_第1张图片
Hdr.png

但是事实上,对人物的渲染效果不怎么好;用了gamma效果就是一层雾霾;

所以,只能继续找方案
参考知乎的文档
终极版是用的美国电影艺术与科学学会的算法(ACES ToneMapping), 我都试了一遍,这些家伙都是处理物体, 人物处理也不好。

加到我的美颜算法:

//acesToneMapping
vec3 x = centralColor.rgb * 0.8; //0.6
centralColor.rgb = clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);
gl_FragColor = vec4(centralColor, 1.0);

效果一般,不过用这个基本可以不用其它美颜算法了,皮肤也比较白;

你可能感兴趣的:(HDR&ToneMapping)