Unity3d HDR和Bloom效果(高动态范围图像和泛光)

文章开始先放两组效果,文章结尾再放两组效果本文测试场景资源来自浅墨大神,shader效果为本文效果

HDR人们有限的视觉系统,只支持16.7百万的颜色,超出这个范围的颜色就不能显示了bmp或jprg每个像素就是16,24或32位每个像素都由红绿蓝构成,如果储存为24位,每个值的范围就在0,255之间,只能表现出256:1的差别,unity的shader中是0到1然而在自然中太阳光下的对比度是50000:1HDR(High Dynamic Range)使图像能表现出更大范围的对比,普通的范围就叫LDR(Low Dynamic Range)你在照相的时候能控制曝光时间从而控制亮度。HDR效果就是可控的曝光,色调映射 tone-mapping传统的显示设备不能完全的显示出HDR,所以我们用tone-mapping技术。tone-mapping让图像从HDR映射为LDR显示中的解释很好Tone Mapping原是摄影学中的一个术语,因为打印相片所能表现的亮度范围不足以表现现实世界中的亮度域,而如果简单的将真实世界的整个亮度域线性压缩到照片所能表现的亮度域内,则会在明暗两端同时丢失很多细节,这显然不是所希望的效果,Tone Mapping就是为了克服这一情况而存在的,既然相片所能呈现的亮度域有限则我们可以根据所拍摄场景内的整体亮度通过光圈与曝光时间的长短来控制一个合适的亮度域,这样既保证细节不丢失,也可以不使照片失真。人的眼睛也是相同的原理,这就是为什么当我们从一个明亮的环境突然到一个黑暗的环境时,可以从什么都看不见到慢慢可以适应周围的亮度,所不同的是人眼是通过瞳孔来调节亮度域的。一个tone-mapping的公式

Middlegrey为全屏幕或部分屏幕的中间灰度,可以控值屏幕的亮度AvgLogLuminance就是全屏幕或部分屏幕的亮度的对数的平均值

AvgLogLuminance的公式Lw是亮度,n是所取亮度数这个操作能让L值限制位[0,1)一些tone-mapping操作用exposure或gamma作为参数控制最终的图像。tone-mapping是非线性的,他对暗色保有一定范围并且对亮色逐步接近动态这个技术产生吸引人的视觉效果,有着强烈的对比和细节。

HDR Rendering In OpenGL一文中给出简要且效果不错的公式关键代码如下float4 frag(v2f i) :COLOR{float4 c = tex2D(_MainTex, i.uv_MainTex);float y = dot(float4(0.3,0.59,0.11,1),c);float yd = _Exp * (_Exp / _BM + 1) / (_Exp + 1);return c*yd;}_Exp,_BM为外部可控变量HDR流程如下

如果分不清HDR与加亮light,可以看看skybox,加亮light是不会加亮skybox的,,HDR使颜色更鲜明,像素更清晰。Bloom泛光辉光的原因是由于人眼晶状体的散射我们制造bloom的原理是把图像的亮的部分通过卷积模糊再叠加到原图像上,就产生了bloom效果。高斯模糊的滤波器是一种低通滤波器就是去当前像素和周围的像素按一定权重混合,产生一定模糊效果

权重分布如下,离当前像素越远,权重越低

高斯正态分布曲线一直觉得人应该去旅行,在年轻的时候,

Unity3d HDR和Bloom效果(高动态范围图像和泛光)

相关文章:

你感兴趣的文章:

标签云: