一,定义:
中景:物体聚焦的范围(即清晰成像的范围)。
景深:在中景之外,都会成像模糊,即景深。景深通常用来指示对场景的注意范围,并提供场景深度的感觉。
背景:比中景远的区域。
近景:比近景近的区域。
焦平面:光穿过摄像机透镜(或人眼睛的晶体),会聚焦到胶片(或人的视网膜)上的一个点。此时,光源与透镜的距离,即为焦平面。
模糊圈Coc:如果光源没在焦平面上,则投影到胶片上的区域不再是一个点,而是一个模糊圈。即,模糊圈。CoC的直径与透镜尺寸和偏离焦平面的距离成正比。
由于Coc的直径与透视尺寸成正比,那么,如果透镜尺寸为0的时候,Coc的直径也是0,即针孔照相机没有景深。
二,模糊圈的计算
在世界空间中,摄像机到物体的距离产生的模糊圈可以用摄像机参数来计算。
CoC = abs(aperture * (focallength*(objectdistance - planeinfocus)) / (objectdistance * (planeinfocus - focallength)))
物距能通过z缓冲区的z值计算:
objectdistance = -zfar * znear / (z * (zfar - znear)- zfar)
模糊圈也能通过z缓冲值,以及综合摄像机参数的缩放项和偏置项来计算
CoC = abs(z * CocScale + CocBias)
用摄像机参数计算缩放和偏置项
CocScale = (aperture * focallength * planeinfocus * (zfar - znear)) / (planeinfocus - focallength 0 * znear * zfar)
CocBias = (aperture * focallength * (znear - planeinfocus) ) / ((planeinfocus * focallength ) * znear)
三、主要技术
Z缓冲区技术上更适用于在目前的图形硬件上实时渲染。
1,穿过(非针孔)透明表面的分布式光线跟踪(Cook等,1984年)
对穿过透镜的光线进行恰当的统计分布,能够得到最正确的景深。因为这样真实地模拟了光线在摄像机和场景中的传输(正确着色而无须实时处理时)
2,累积缓冲区技术
累计缓冲区是高精度彩色缓冲区,在实时渲染中通常用它来累加多个图像。
摄像机从不同的位置到穿过透镜来多次渲染场景,然后使用累计缓冲区混合结果。所混合的渲染遍越多,看起来就越好,与“真实”景深越接近。但是如果遍数太多的遍数,丧失实时操作的可能。所需要的遍数与模糊圈的面积成正比。
3,多层次的渲染
理想情况下,把场景中各个物体分层排序,而层的深度互不重叠,那么就能够基于各层所代表的深度对每层进行模糊。然后把这些层组成最终的图像,给出景深的印象。
缺点是:
1,同层中的所有像素都均匀地进行模糊。当物体的深度跨度太大时,它的景深就显示不出来
2,物体跨越的深度范围大时,不能很好分割场景。
所以一般不用。
4,向前映射的Z缓冲景深。
适用于任意场景,可以给渲染好的图像和影片加上景深。
1,把像素的彩色值和深度值存储到缓冲区,
2,深度缓冲值为那个像素确定Coc。
3,把一个圆圈混合到帧缓冲区内,圆圈的颜色就是像素的颜色,圆圈的直径等于Coc,而圆圈的面积与alpha值成反比。
4,为了避免模糊像素影响它前面的清晰像素,只允许那个像素与离摄像机更远的相邻像素混合。
5,最后对该像素的alpha值重规范化。
6,渲染数以百万计的精灵(固定的彩色圆),不能很好的对应于硬件实时渲染。
5,反向映射的z缓冲区技术
1,存储一个颜色和深度的图像
2,逐个改变像素的深度值,去模糊被渲染的场景。取z值和焦平面z值较大的值作为模糊级别。
3,对于有mipmaps的场景纹理,以模糊圈作为导数执行纹理查询,决定从哪个mipmap级别读取。
4,可能会有几种失真: 。
(1)由于深度的不连续性产生失真(最严重,焦平面不能在场景的远处)
(2)双线内插的失真
(3)由于像素扩散产生的失真