一些概念

aspect ratio (假设对称)

两条红线之间的角度就是 垂直可视角度 vertival field-of-view(fovY)
如果这个角度小,就越像正交投影,越大就能拍得越广
水平可视角度是可以通过长宽比和垂直可视角度求出的。

屏幕

屏幕screen就是一堆像素的数组,屏幕的size也就是resolution分辨率

Raster在德语里就是屏幕的意思~Rasterize就是画到屏幕上啦。

Pixel像素其实就是”picture element”的简写~(无用的知识又增加了)
我们把像素认为是一个有统一颜色的小方块儿,颜色为(red,green,blue)

这门课里对于屏幕的定义是这样的:

把原点放在左下,每一个像素是一个小方块。蓝色像素的索引就是(2,1)。

像素索引是从(0,0)到(width-1,height-1)的。屏幕覆盖了(0,0)到(width,height)

像素(x,y)的中心为(x+0.5,y+0.5)。

映射

怎么映射呢?

我们需要把[-1,1]^3的内容映射到这么一小块屏幕上。

首先暂时忽略z,也就是把原来的xy平面[-1,1]^2的一块映射到[0,width]×[0,height]。


也就是先缩放,再平移整个图,把左下角对齐到原点上,写出来就是上面这个视口变换的矩阵了。

简单の光栅化

三角形网格优势在于

  • 是最基本的多边形,所有其他多边形都是可以拆分成三角形的组合
  • 保证是一个平面
  • 明确定义了内外
  • 对于三角形内部的点容易插值(barycentric interpolation)

判断中心点和三角形的位置关系

一个最简单的光栅化方法:采样

利用像素中心对屏幕空间进行采样。

给一个三角形,判断像素中心是否在三角形内:

/*inside(t,x,y)=if Point(x,y) in triangle t*/
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) 

那么具体怎么实现inside(tri,x,y)呢,只要根据叉积就可以求了~
只要Q同时在三条边的同侧,则为在三角形内部。

在边上的可以自己定义。可以都算也可以都不算,也可以左算右不算,自己定义。API一般会有规定。

加速方法

使用轴向包围盒AABB可以加速一点儿。

还可以算出每行的左右边界。

奇奇怪怪

康康实际的LCD屏幕像素


ps:绿色更多,是因为人对绿色敏感些