3D图形学(8):屏幕后处理

屏幕后处理

 

一、Bloom 全屏泛光

Bloom可以模拟出HDR的效果,但是原理上和HDR相差甚远。HDR实际上是通过映射技术,来达到整体调整全局亮度属性的,这种调整是颜色,强度等都可以进行调整,而Bloom仅仅是能够将光照范围调高达到过饱和,也就是让亮的地方更亮。不过Bloom效果实现起来简单,性能消耗也小,却也可以达到不错的效果。

Bloom实现思路:根据一个阈值提取出图像中的较亮区域,把它们存储在一张渲染纹理中,再利用高斯模糊对这张渲染纹理进行模糊处理,模拟光线扩散的效果,最后再将其和原图像进行混合,得到最终结果。

 

二、高斯模糊

        每个像素的颜色值都是由其本身和相邻像素的颜色值进行加权平均得到的, 越靠近像素本身,权值越高,越偏离像素的,权值越低。而这种权值符合我们比较熟悉的一种数学分布-正态分布,又叫高斯分布。高斯滤波时水平和垂直方向呈现高斯分布,更突出了中心点在像素平滑后的权重。

高斯模糊是一种更高级的模糊方法,使用的卷积核为高斯核,高斯核是一个正方形大小的滤波核。其中每个元素的计算都是基于高斯方程,高斯方程很好的模拟了邻域每个像素对当前处理像素的影响程度,距离越近,影响越大。

卷积操作:使用一个卷积核对一张图像中的每个像素进行卷积运算。首先把卷积核的中心放置在像素位置,翻转核之后再依次计算核中每个元素与其覆盖的像素值的乘积并求和,得到新的像素值。

 

三、Tonemapper 色调映射

正常屏幕上一个像素是由RGB三原色组成的,每个通道用八位二进制表示,也就是0-255。而真实世界的亮度的最大值远远比屏幕能够显示的亮度大,比如太阳的亮度会是我们屏幕亮度的几万倍,但是屏幕上的亮度范围是远远不能表达真实世界的亮度分布的。如果不使用HDR,就会出现场景中大块的亮或者暗,造成场景对比度不明显,影响画面效果。

色调映射功能的目的是将各种高动态范围(HDR)颜色映射到显示器可输出的低动态范围(LDR)(0-255)。

 

四、景深 Depth of Field

物体在距离镜头的一个范围之内能够清晰成像(经过聚焦),在那个范围之外(或近或远)则成像模糊,这种效果就是景深。 其中焦点上的清晰度是最高的,其余的影像清晰度随着它与焦点的距离成正比例下降。

景深分为三层(或三个区域):近景、远景、对焦区域。每一层都单独处理,然后组合在一起来获得最终的图像效果。近景层和远景层的物体总是完全模糊的。它们与非模糊的场景相融合,以获得最终的效果。 

 

将景深技术划分为以下五个类:

  • 射线追踪技术,从镜头的整个区域发射光线
  • 累积缓冲技术,混合来自多个针孔相机的图像
  • 合成技术,将不同焦点级别的多个图层合并
  • 前向映射的z缓冲技术,将像素的颜色分散到其邻居
  • 反向映射的z缓冲技术,从相邻像素收集颜色样本

光线跟踪,累积缓冲和合成可以被认为是“组合”技术。z缓冲作为基于图像的算法,它们特别适用于图形硬件。此外,z缓冲区信息在其他渲染效果(例如软粒子)中很有用,因为它可以分摊生成深度图像的成本。另一方面,组合技术是有限的,因为它们不能容易地添加到现有的图形引擎。

当需要正确的着色但不进行实时处理时,光线跟踪或累积缓冲深度场算法是合适的选择。当速度至关重要时,合成或z缓冲区景深算法是更好的选择。对于后期处理渲染场景,通过溅射景深技术可获得最佳质量。

具体Shader实现:https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch28.html

 

五、运动模糊 Motion Blur

现实世界中,运动模糊(Motion Blur,或译为或动态模糊),是因为相机或者摄影机的快门时间内物体的相对运动产生的。在快门打开到关上的过程中,感光材料因为受到的是物体反射光持续的照射成像。即在曝光的这个微小时间段内,对象依然在画面中移动,感光材料便会记录下这段时间内物体运动的轨迹,产生运动模糊。

我们经常在电影中看到这种模糊,并认为它是正常的,所以我们期望也可以在电子游戏中看到它,以带给游戏更多的真实感。

若无运动模糊,一般情况下,快速移动的物体会出现抖动,在帧之间的多个像素跳跃。这可以被认为是一种锯齿,但可以理解为基于时间的锯齿,而不是基于空间的锯齿。在这个意义上,运动模糊可以理解为是一种时间意义上的抗锯齿。

正如更高的显示分辨率可以减少但不能消除锯齿,提高帧速率并不能消除运动模糊的需要。而视频游戏的特点是摄像机和物体的快速运动,所以运动模糊可以大大改善画面的视觉效果。而事实表明,带运动模糊的30 FPS画面,通常看起来比没有带运动模糊的60 FPS画面更出色。

实现运动模糊的方法大致分3种:

  1. 基于累积缓冲区(accumulationbuffer),快读移动产生多张图像后,取他们的平均值,作为最后的运动模糊图像。
  2. 基于速度缓冲器(velocity buffer)。目前这个方法最为主流。创建和使用速度缓冲,这个缓存中存储了各个像素当前的运动速度,然后利用该值来决定模糊的方向和大小。

运动模糊对于由摄像机运动而变得模糊的静态物体来说比较简单,因为往往这种情况下不需要速度缓冲区。如果需要的是摄像机移动时的运动感,可以使用诸如径向模糊(radial blur)之类的固定效果。
 

六、环境遮罩 Ambient Occlusion,也简称为AO

环境遮挡用来帮助模拟在表面缝隙中发生的自我遮蔽。

AO所描述的就是一点对于周围环境暴露的比例。AO的实现原理,将AO贴图采样出来的值乘以环境光的输出上,这样AO贴图中的黑色部分就会抑制环境光的强度,从而达到环境光遮蔽的效果。

 

 

左侧为带有AO贴图的效果,右侧为无AO贴图的效果:

 

几种主流的环境光遮蔽效果:

AO贴图(使用预烘焙的贴图,实现离线的基于GPU的烘焙AO贴图的工具)

SSAO(Screen Space Ambient Occlusion 屏幕空间环境光遮蔽)

UE4的 (Distance Field Ambient Occlusion 距离场环境光遮蔽)

 

AO贴图

这也是性能最好的方式,在运行时使用了预计算的结果。

 

SSAO(Screen Space Ambient Occlusion 屏幕空间环境光遮蔽)

只在法线对应方向的半球上进行遮蔽概率计算

 

环境光是基于当前点法线半球上的积分计算,想真正求积分计算量太大了。于是,采用近似求积分的蒙特卡洛积分的方式,通俗一点就是概率,当样本达到一定程度之后,不求计算精确的值,直接使用一些样本进行采样。

P点为当前像素点,n为对应法线方向,所在半球上分布着随机采样点,其中绿色的采样点为未被遮蔽的,红色的为被遮蔽的。

实现原理:在法线的半球上设置一系列随机的采样点,然后遍历每一个采样点,判断采样点的深度值是否小于该点对应的深度,如果小于说明这个采样点没有被平面挡住,遍历完成后除以总采样点数,就可以得到当前半球上环境光显示的百分比,1-环境光百分比得到最终的环境光遮蔽值。

 

七、边缘检测

通过在深度和法线纹理上进行边缘检测,这些图像不会受纹理和光照的影响,而仅仅保存了当前渲染物体的模型信息,通过这样的方式检测出来的边缘更加可靠。

实现思路:使用Roberts算子进行边缘检测,Roberts算子的本质是计算左上角和右下角的差值,乘以右上角和左下角的差值,作为评估边缘的依据。具体实现中,取对角方向的深度或法线值,比较它们之间的差值,如果超过某个阈值,就认为它们之间存在一条边。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值