光栅化及深度测试
光栅化
光栅化(Rasterization)是图形学中一种常用的渲染技术,用于将三维场景中的图形对象转换为二维像素表示,以便在计算机屏幕上显示,即将图形对象(通常是三角形)映射到屏幕上的像素格子,并确定每个像素的颜色值。
选择三角形作为渲染的基本图元的原因:
- 因为三角形是最简单的几何形状之一,任意三个点可以确定一个平面上的三角形
任意多边形都可以被分解为若干个三角形,这种分解使得处理复杂的多边形图形变得更加容易。
三角形在仿射变换下保持平面性,对三角形的变换相对简单,而不会引入复杂的扭曲。
1.直线光栅化算法
1.1 DDA数值微分算法
通过两点确定一条直线的斜率(k),若|k|<=1,选择x方向作为步长(选择变换快的方向),若|k|>1,选择y方向作为步长。
注:在所选的步长方向上,从起始点 (x0, y0)
开始,计算每个下一个点的坐标 (xi, yi)
。对于x方向的步长,使用 xi+1 = xi + 1
;对于 y 方向的步长,使用 yi+1 = yi + m
。(y的结果要四舍五入)
1.2 Bresenham直线绘制算法
Bresenham直线绘制算法通过在每个步骤中选择最接近理想路径上的点来逐步绘制线段,从而避免了使用浮点数运算,提高了计算效率。
pass
2.三角形光栅化算法
每一个像素进行采样:判断像素中心是否在三角形内部
判断一个点在三角形内部的方法:利用叉乘的性质
分别计算 $P_0P_1×P_0Q、 P_1P_2×P_1Q、P_2P_0×P_2Q$,如果三者同号则代表点P在三条线段的同一边,那么必然处于三角形内部,如果不同号则代表该点一定在三角形外部
利用bouding box减少点的计算:三角形通常只占屏幕很小的一部分,只对该bounding box内的点进行采样测试
锯齿现象:
产生的原因:只用了有限的采样点去逼近连续的三角形
3.解决走样的方法
3.1超采样反走样(Super Sampling AA)
用更多的采样点去逼近连续的三角形
对着四个采样点分别计算颜色值,将这四个点的采样点的颜色值取均值,如下:
注:超采样的缺点是对计算资源的更高要求
3.2多采样反走样(Multi-Sampling AA)
MSAA是对SSAA的改进,不再为每个采样点都计算颜色值,而只计算像素中采样点被覆盖的比例,而后在中心点处计算颜色值。
3.3 先模糊(滤波),再采样
通过在采样前进行滤波,可以去除信号中的高频分量,从而在采样时避免混叠效应,减少走样。
在频域中限制高频成分的影响,有助于避免走样问题
4.深度测试
深度测试是指在渲染图像时确定像素的深度值(或称为Z值)以确定哪些像素应该显示在屏幕上。
注:深度测试是一种解决图形学中遮挡关系的技术,确保在屏幕上只显示最前面的像素,而将被遮挡的像素隐藏起来,从而呈现出正确的三维场景。
Z-Buffer(深度缓冲)算法
算法的基本思想:每个采样点(像素)存储当前的最小深度值,假设深度值(z值)始终为正值。如果一个像素的深度值较小,表示它离观察者更近;反之,如果深度值较大,则表示它离观察者更远。帧缓冲用于存储屏幕上每个像素的颜色信息,深度缓冲专门用于存储每个像素的深度值,如果当前像素的深度值较小(即更接近观察者),则更新深度缓冲和帧缓冲中的值;否则,将其视为被遮挡,不进行更新。
伪代码如下: