
1 从标准化设备坐标NDC到屏幕
2 从图形到光栅显示
3 反走样(抗锯齿)
1 从标准化设备坐标NDC到屏幕
之前我们通过MVP矩阵把物体坐标变换到标准化设备坐标NDC(每个顶点的x,y,z坐标都应该在-1.0到1.0之间)那么接下来我们需要把它映射到屏幕中那么就会产生以下问题
-
何为屏幕?在图形学中,我们认为屏幕是一个二维数组,数组里的每一个元素为一个二维像素。屏幕是一个典型的光栅成像设备光栅化的过程就是把东西画在屏幕上的过程
-
何为像素?在这门课中我们暂时认为它是小的方块,内部的颜色是一个整体的颜色,颜色值用RGB表示。 我们同样需要定义屏幕的空间
-
屏幕空间即在屏幕中建立坐标系,XOY平面屏幕空间坐标为整数,范围从(0,0)到(width-1,height-1)像素(x,y)中心在(x+0.5,y+0.5) 通过视口变换可以将标准化设备坐标映射到屏幕坐标(暂时先不管Z)
视口变换后,我们要把这些多边形显示在光栅显示设备上
关于光栅显示设备的知识在此不作记录了
2 从图形到光栅显示
上文的老虎由不同的四边形组成,也有很多例子是靠三角形组成
三角形是最基本的多边形,拥有很多特性
- 三角形可以分解其他的多边形
- 三角形保证是平面的
- 三角形的内外定义清晰,可以用叉乘判断内外
- 三角形内可以定义明确的插值方法 接下来以三角形为例
在经过视口变换之后,我们知道了三角形变换到屏幕空间的位置,那么像素该如何显示呢?如何判断像素和三角形呢?
**2.1 **采样
采样也就是把一个函数离散化的过程
以下的图片展示了利用像素中心对屏幕空间的三角形进行2D采样的过程
我们定义了一个inside函数,判断了像素中心是否在三角形内部
伪代码的形式就像下图,遍历像素,判断是否inside
这个inside函数如何实现判断点Q呢?
我们要做的是叉乘
判断P_1P_2 \times P_1Q,P_0P_1\times P_0Q,P_2P_0\times P_2Q这三个结果是否相同(右手螺旋定则确定Q点朝向屏幕内还是屏幕外)
对于边界上的点,我们不做处理。实际上我们定义一个标准,随意分配就好。
我们不必采样所有的屏幕,用BoundingBox包围盒的概念可以加速,在最小范围内采样。
也可以有其他各种多样的加速方法
2.2 实际的光栅化
以下展示了现实中的光栅化显示设备的显示方法
2.3 采样的缺点
我们经过采样后的图案是锯齿状的
像素本身有一定的大小,同时我们的采样率对于信号来说不够高(下面会详细描述),造成了锯齿问题。
于是我们就要接触到,走样与反走样。