GAMES101-05- Rasterization光栅化
Rasterization光栅化 1(triangle)
补充上一节课Perspective Projection
上一节课提到Frustum,那么我们怎么定义这样一个Frustum呢?
答:其实很简单定义好两个。假设从相机出发,我们摆好相机,使得相机看到的就是这样一个我们给定定义宽度和高度,也就是定义好一个宽高比(Aspect ratio=width/height)的近平面。除外,再定义相机可以看到的角度范围(Field of View)即可。

那么这样定义后,我们可以列出关系式,从而可以自动地转化到定义的正交投影的远近、左右、上下的概念上去:

为什么是|n|?
答:因为n是沿着-z轴方向的。
补充完毕,那么在介绍结束观测变换后,所有物体都在经典立方体中后,这节课就说明接下来应该怎么办?
很显然,接下来就是将立方体呈现在屏幕上。将立方体映\([-1,1]^2\)射到对应的屏幕空间\([0,weight]\times [0,height]\)。(注意此时与z无关)

那么怎么投影到屏幕上呢?
答:首先我们要清楚什么是屏幕。

Rasterization
首先弄清楚一些基本概念:
什么是光栅?
答:可以简单地把光栅等同于屏幕。
什么是光栅化?
答:可以简单地定义为把东西画到屏幕上。
什么是像素?
答:虽然像素是个复杂的概念,但是在这节课中,我们认为像素已经是最小的单位,是一个个内部颜色不会发生变化的小方块。而像素和像素之间的颜色可能不一样,一般颜色都是RGB的组合。
光栅化的过程
答:正如上方所说,我们需要将立方体映\([-1,1]^2\)射到对应的屏幕空间\([0,weight]\times [0,height]\),具体分为两步。第一步,就是把立方体的宽度和高度放大成对应的weight和height,而z不发生改变。第二步,要将屏幕空间的左下角定义在原点处,即立方体放大后的中心移到原点处,所以就可以写成一个简单的变换,即视口变换。

而做到这一步还不够,接下来就是把得到的结果,也就是把空间中得到的三角形或者多边形转变成图,也就是打散成像素的过程,就是光栅化。
在具体介绍光栅实现过程之前,先介绍一些可以在屏幕上画的设备。
Different raster display
Cathode Ray Tube示波器

Frame Buffer:Memory for a Raster Display

这里简单理解,就是将内存中的一块区域显示在屏幕上。
Flat Panel Displays
这里可以特别关注一下LCD,也就是液晶显示。

LED Array Display

Electrophoretic Display

Rasterizing a triangle
为什么三角形可以看作是基础的形状?
答:一是因为三角形是基础的多边形(复杂的多边形都可以用三角形表示),二是三角形独特的特性(三角形必在一平面内;三角形内外定义清晰;根据三角形内任一点与三角形三顶点的位置关系可以得到一个逐渐的变化)
而对于下图左侧三角形,想要用像素表示,我们需要考虑像素中心点与三角形的位置关系才能确定某个像素应该是什么颜色?

那么怎么考虑像素中心点与三角形的位置关系?
答:这里介绍一个最简单的方法——采样法。采样可以看作确定某值作为输入,将该输入的函数值作为采样结果的输出(即,output[x]=f(x))。
Sampling采样
给一个三角形,判断像素的中心是否在三角形内。也就是定义一个函数inside()如下:

如果像素的中心在三角形内,那么函数输出为1,反之为0。
三角形像素位置呈现如下:

进行处理的过程可以表示成下图代码:
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);//加上0.5表示像素中心位置
怎么判断像素中心在不在三角形内部呢?
答:这就用到前面叉乘判断内外的知识了。

那像代码中将所有像素(x到weight,y到height)走一遍有必要吗?
答:没必要,所以x和y的循环范围可以是三角形三个顶点x和y的max和min。将范围虽小成一个包围三角形的方形。之后再判断像素中心在不在三角形内部,若不在三角形内部就没必要光栅化,如果在三角形内部就光栅化。
最后,我们根据三角形光栅化得到下图:

我们会发现这张图是不太对的,很大一部分原因是出于锯齿的存在。
为什么会有锯齿呢?
答:一部分原因在于像素本身是有一定大小的。另一部分原因是我们的采样率对于信号来说是不够高的,也就是信号走样问题(这部分下节课会详细解释)。

浙公网安备 33010602011771号