图形学-光栅化

1.什么是光栅化

将几何图形绘制到屏幕上的过程叫做光栅化,我们对屏幕的定义如下

  1. 屏幕是像素的数组
  2. 分辨率是屏幕像素数组的尺寸
  3. 屏幕是光栅成像设备。

**光栅化(Rasterization)**指的是将物体绘制到屏幕上。**像素(Pixel)**是具有统一颜色的小方块,是由不同颜色组合而成的(例如 RGB)。

1.1屏幕空间(像素坐标)

图形学-光栅化_第1张图片
我们认为屏幕左下角为原点,向右为 x 轴,向上为 y 轴。建立平面直角坐标系。屏幕空间满足以下几点

  1. 我们认为像素坐标 (, ) 为整数坐标;
  2. 像素坐标覆盖范围为 (0, 0) 到 (width − 1, height − 1);
  3. 像素的中心点在 ( + 0.5, + 0.5);
  4. 整个屏幕的覆盖范围在 (0, 0) − (width, height).

1.2 三角形光栅化

对于一个 3 维图形我们可以用三角形去表示一个一个小面。使用三角形的主要原因是:

  • 三角形是最基本的多边形;
  • 任何多边形都可以拆分成三角形;
  • 空间内任何三个点的连线一定是平面;
  • 三角形有清晰的内部和外部定义;
  • 三角形只要定义顶点的属性就可以计算三角形内部点的渐变关系(三角形的内部插值)。

对于一个三角形,如何映射在像素空间上问题,可以转换成判断一个像素和三角形的位置关系。最简
单的方法就是进行离散化(Sampling)。采样就是连续函数的离散化过程。代码表示如下

for ( int x = 0; x < max ; ++ x)
output [x ]= f(x);

我们对于给定三角形,判断像素中心是否在三角形内部。如果在,那么这个点为 1,否则为 0
图形学-光栅化_第2张图片
判断代码就可以写为:

for ( int x = 0; x < xmax ; ++ x)
for ( int y = 0; y < ymax ; ++ y)
image [x ][ y] = inside (tri , x +0.5 , y +0.5) ;

对于像素是否在三角形内部的判断,可以使用叉积。具体可以在叉积的讲解部分查看。
对于在边界上的三角形点,可要可不要自己定。为了能够更快速的遍历
像素点,我们可以用以下方法:

  • 使用包围盒(Bounding box),只对三角形最大的包围正方形区进行遍历。但是不适用于窄长的三角形
  • 找到每一行三角形包围住最左和最右边的点进行遍历。我们的结果可能会生成大量的锯齿,此时我们需要一些方式来消除锯齿。

你可能感兴趣的:(计算机图形学,算法)