【图形学基础】采用深度缓冲的三角形光栅化

标题关键词有两个,“深度缓冲”、“三角形光栅化

首先解释三角形光栅化

1.三角形是怎么来的(即为什么要用三角形):在做三维物体渲染时,一般将物体表面分为多个连续的面片,1.低于三角形的几何图形无法构成面,2.而高于三角形的空间几何图形不一定平坦(比如把一张纸折叠,这就形成了一个不平坦的四边形),且三角形具有稳定性,这里的稳定性指的是转换的稳定性,3.三角形在多种转换【透视投影等】后仍然是三角形(可以理解为空间三角形在任何方向看都是三角形,仅极端情况退化为线段)。另外,由于早期三角形在图形渲染业界的地位,4.商用图形加速硬件几乎都是为了三角形光栅化而设计的。

    使用三角形逼近一个几何图形,就好像当年求圆周率用线段逼近圆一样。这个过程称为镶嵌。形成三角形网格,三角形数量称为层次细节(LOD)。LOD与内存,算法时间,图形精细度正相关,为了兼顾性能和图形品质,可以使用多层次网格或者渐进网格进行动态镶嵌,前者会根据本物体远近选择合适层次细节的镶嵌,后者会使用高LOD网格,并在物体远离时自动将某些棱收缩为点。

    由上述可知计算机内三维物体表现为三维的网格,而最终显示在屏幕上的却是二维的像素矩阵。这个转换是如何完成的呢,简述:

1.物体的三角形网格表现为顶点表,顶点有坐标,

2.顶点使用相同的坐标系,称之为模型空间,他是三维坐标系,

3.场景使用另一个坐标系,称为世界空间,场景内的物体的模型空间可以转化到世界空间,

4.摄像机使用称为观察空间的坐标系,世界空间可以转化到观察空间,

5.有个称为齐次裁剪空间的坐标系,他是观察空间的变形版本。摄像机所能观察到的空间被围成一个立方体,齐次空间就是把该立方体标准化。(openGL的齐次空间三个轴都是从-1到1的取值范围),该坐标系使用左手坐标系,观察空间转化到齐次空间的好处在于,无需区分摄像机使用正交投影还是透视投影,也无需处理不同的屏幕分辨率,

6.从齐次裁剪空间到屏幕空间,取顶点的x,y坐标进行对应屏幕大小的缩放和平移即可。(z坐标和w坐标用于判断遮盖,即深度缓冲)

    以上过程即把空间中的三维物体顶点转换成了屏幕上的二维顶点。

但需要完整的渲染物体,只有顶点是不够的,需要通过顶点来进行三角形范围内的像素数据计算,并最终存储为RGBA颜色用于渲染。该过程就是光栅化。屏幕上的每个像素对应到三角形内部的一个区域,该区域称为片段,通过多级测试的片段将被着色(决定其颜色)然后填入帧缓冲的像素内。

该做法对原本连续的二维信号进行采样,并使用离散的像素集进行表现,此时三角形边缘可能显得像锯齿一样存在梯级效果。抗锯齿即为了降低这种现象。全屏抗锯齿通过性能换取显示,他渲染比实际屏幕等比放大的帧缓冲,然后缩减采样形成屏幕显示。多重采样把像素拆分为多个片段并在管道最后阶段结合为单个像素,他是全屏抗锯齿的一种优化,其深度和模板采用相同方法,而像素着色仅仅是正常采样,随后同样进行缩减到目标分辨率。其优化在于显著减少着色计算(例如宽高扩一倍的超采样着色消耗降低为1/4)

然后解释深度缓冲

当两个平面相互穿插,需要正确显示,这里就使用到深度缓冲。他在每个像素中加入了16或24位的深度数据,量度该像素深入屏幕的深度。每个三角形片段渲染到像素时,保存其深度数据,当另一个片段渲染到同一像素,则比较深度数据,渲染更接近屏幕的那个。

需要注意的是,由于最终进行渲染时,是从齐次坐标到屏幕坐标,而非观察坐标到屏幕坐标,简单来说,齐次坐标的深度z,是观察坐标的深度z的倒数,即1/z。他是一个反比例函数,因此越接近屏幕时,深度具有越大精度。这样会导致远景穿刺严重。为了处理这种情况,自然会想到直接使用观察坐标的深度z。此时的z是一个正比例函数,精度均匀。而观察空间的z坐标恰好出现在齐次坐标的w分量内。

这就是深度缓冲,使用齐次空间z坐标的称为z缓冲,使用齐次空间w坐标(观察空间z坐标)的称为w缓冲。

w缓冲会比z缓冲耗时,因为w缓冲不能直接对深度进行插值。需要先由顶点深度的倒数(转到齐次坐标)插值得到片段的深度数据,然后再对片段求导获取w深度并存至缓冲。

猜你喜欢

转载自blog.csdn.net/m0_37951757/article/details/80006200
今日推荐