深度缓冲
发展
即使深度缓冲区有足够大的分辨率,但是如果z缓冲区中距离精度不随距离均匀分布的话图像质量也可能会出现问题。距离较近的部分通常精度较高,这样近距离的物体显示质量也较高。通常这是所期望得到的结果,但是当物体距离变得较远时可能会出现人为误差。一种能够得到更加均匀分布精度的深度缓冲变体是w缓冲。
在场景开始的时候,必须将深度缓冲区初始化为一个特定的值,通常初始化为1.0,这是因为1.0是深度范围0到1的上限,它意味着在整个视体(viewing frustum)之内没有任何物体。
通常认为深度缓冲概念的发明主要归功于艾德文·卡特姆,虽然Wolfgang Straßer也在1974年所写的博士论文中提到了同样的思想。
在最近几年的PC图形卡上,深度缓冲管理需要使用大量的内存带宽。人们采用了各种各样的方法减少深度缓冲的影响,其中的方法有无损数据压缩(因为压缩/解压所消耗的计算机资源要比带宽的占用更加合算)。另外还使用了极快的硬件工具清除深度信息,这种方法完全取代了“一帧正、一帧负”这种利用有符号数巧妙地绕过帧间深度信息清除的技巧。
z消隐
在渲染过程中,z消隐是根据深度信息对像素的早期剔除。当渲染隐藏表面所需要的计算量很大的时候,这种方法可以提升处理性能。z消隐是深度缓冲的一个直接结果,在这种方法中每个待定像素的深度都要与相同位置的现存像素的深度进行比较。
使用深度缓冲区,一旦像素的深度已经确定,那么就可以对这个像素进行裁剪,这样如果该像素不可见的话就可以完全跳过照明与纹理处理的过程,并且需要消耗许多时间的像素浓淡工具通常也会跳过对于裁剪掉的像素的处理。这样z消隐就成为了在填充速度、光照、纹理或者像素浓淡处理是主要瓶颈的场合的一种很好的优化工具。
尽管深度缓冲可以处理未经排序的几何体,但是按照深度不断增加的方式(与画家算法排序方式相反)对多边形进行排序,每个像素就可以只渲染一次。对于填充速度有限但是有大量重复绘制场合,这种方法就可以提高处理性能。
数学基础
待渲染的照相机空间中的深度经常定义为近距near到远距far之间的z值,在透视变换之后,得到新的z"值:
z′=far+nearfar− − -->near+1z(− − -->2⋅ ⋅ -->far⋅ ⋅ -->nearfar− − -->near){\displaystyle z"={\frac {{\mathit {far}}+{\mathit {near}}}{{\mathit {far}}-{\mathit {near}}}}+{\frac {1}{z}}({\frac {-2\cdot {\mathit {far}}\cdot {\mathit {near}}}{{\mathit {far}}-{\mathit {near}}}})}
其中z{\displaystyle z}是照相机空间的值,它有时候也表示为w或者w"。
结果z"是在 -1到1之间归一化之后的值,其中近距near平面位于 -1处,远距far平面位于1处。在这个范围之外的相应点在视图体之外,不需要进行渲染。
为了实现深度缓冲,在整个屏幕空间上的对当前多边形顶点之间进行插值来计算z"的值,通常这些中间数值在深度缓冲区中用定点数格式保存。距离近距near平面越近,z"值越密;距离越远,z"值越稀。这样距离照相机越近精度越高。near平面距离照相机越近,则远距离位置的精度越低。near平面距离照相机太近是在远距离物体产生人为误差的一个常见因素。
w缓冲
为了实现w缓冲,通常照相机空间中的z值或者w值都保存成浮点数格式,但是这些数值无法根据顶点在整个屏幕上进行线性插值——通常对它的倒数进行插值,然后再取倒数。这样得到的结果w值与z"不同,它们在near平面与far平面之间均匀分布。
根据应用的不同z缓冲与w缓冲生成的图像质量也有所不同。
Javascript
当在JavaScript中使用标签的时候,可以将下面的程序作为深度缓冲的公式。
参见
艾德文·卡特姆-- 深度缓冲概念的发明人
三维计算机图形
不规则深度缓冲
Z-order
Notes
Note 1: see W.K. Giloi, J.L. Encarnação, W. Straßer. "The Giloi’s School of Computer Graphics". Computer Graphics 35 4:12–16.
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
- 有价值
- 一般般
- 没价值