Games101: Computer Graphics-Week 5

在依次进行了前面的步骤:

  • Model transformation,将物体和摄像机放到标准位置; (M)

  • View/Camera transformation,将摄像机角度到标准位置;(V)

  • Projection Transformation,将被观测场景投影到标准的$[-1, 1]^{3}$范围后;(P)

After MVP transformation,下一步就是将Projection画在屏幕上,这一步就是Rasterization(光栅化)

Rasterization

Preview

image-20201211135914905

回顾上节课的定义,定义一个立方体需要知道:$x$轴上$[l,r]$,$y$轴上$[b, t]$,$-z$轴上$[f, n]$,这里假设我们已经知道$f$和$n$平面,对于Perspetive Projection而言,需要定义视角锥。如下图所示,定义近平面需要两要素

  1. Field-of-view(fovY,默认是垂直视角):定义为两条横边中点的连线夹角,如图中两条红色虚线所示;
  2. Aspect ratio(宽高比): $Aspect ratio = width/height$;
  • 类似垂直视角,可以定义水平视角,此时为两条竖边的中点,并且当固定了宽高比和Fov后,即可求出水平视角。
  • 用相机类比,Fov可以对应镜头的焦距所对应的视角;

Canonical Cube to Screen

image-20201211135914905
  • 暂时不管$z$轴;
  • 将MVP变换后的$[-1,1]^{2}$映射到$[0,width]\times[0,height]$尺寸上;
  • 如何实现?先scale再translate;

注意在上述操作中,这些操作都是对空间中的各种立方体操作的,如何将这些立方体打散到每个像素点,求解到每个像素点像素值,这个过程称为光栅化。

Different raster displays(光栅显示设备)

  • Oscilloscope(示波器),显示原理和早期显示器一致,阴极射线管发生电子打到荧光屏上,CRT(Cathode Ray Tube),以扫描的形式进行画图呈像;
  • Frame Buffer,现在显示认为就是内存或显存中的一部分空间,屏幕就是讲内存中的内容映射显示到物理设备上,包括:
    • LCD(Liquid Crystal Display,液晶显示器),利用液晶材料的极化作用,进行光线的扭转;
    • LED(Light Emitting Diode,发光二极管);
    • Electronic Ink Display,电子墨水屏,刷新率很低;

Triangles - Fundamental Shape Primitives

image-20201211135914905

重心坐标插值-barycentric interpolation

Rasterizing a triangle

光栅化最核心的步骤:

image-20201211135914905

左图三角形代表经过MVP,Projection变换后的图形,图中每一个方格代表一个像素,光栅化就是判断每一个点和三角形的关系并进行取值。

下面介绍一个最简单和最广泛使用的方法-**采样(Sample)**:

image-20201211135914905

前提:

  • 认为每个像素内部是不可分割,颜色一致的小块;
  • 认为每个像素块的中心是$(x+0.5, y+0.5)$,由质心确定对应像素块的颜色;

这里用代码更容易说清楚:

1
2
3
4
for (int x=0; x<xmax; ++x)
for(int y=0; y<ymax; ++y)
// 这里的inside函数用以判断点是否在图形内侧,算法可参考前面的固定方向叉乘
image[x][y] = inside(tri, x+0.5, y+0.5);
You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.