内容先导
1. Canonical Cube to Screen
2. 光栅化一个三角形
3. Antialiasing(反走样,抗锯齿)
4. Z-Buffering
正文
1. Canonical Cube to Screen
前一节中,通过投影变换,已经将空间中xy坐标系投影到[-1,1]×[-1,1]的区域中,接下来需要将xy平面投射到[0, width] × [0, height]的屏幕上。需要先做一步视口变换
2.光栅化一个三角形
- 三角形的性质
- 最基础的多边形,任何多边形都可以拆成三角形表示。
- 三角形三个点一定在一个平面上。
- 三角形内外部清晰,并且方便判断内外。
- 方便利用三角形重心坐标系进行插值。
- 通过采样画出三角形
1. 定义一个二值函数,输入屏幕的位置坐标以及一个三角形对象。
2. 遍历屏幕上的每个点,通过inside函数给像素点上色。
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);
}
}
判断点在三角形内部的方法
(1)利用向量叉积
补充:向量叉乘示例
3. 加速方法
(1)利用包围盒(AABB)
遍历时不便利屏幕上所有像素点,只遍历三角形[xMin, xMax] × [yMin, yMax]的区域。
(2)每一行都记录三角形的最左与最右(特定情况更有效率)
3. 3. Antialiasing(反走样,抗锯齿)
采样带来的问题
- 锯齿
- 摩尔纹现象
- Wagon Wheel effect
抗锯齿的方法
方法 1: 增加采样率
增加屏幕分辨率
方法 2:采用反走样
先对锯齿边界做模糊处理,再做采样
MSAA(MultiSampling Anti-Aliasing)
对一个像素点进行多次采样,然后取平均表示这个像素点的值。样本不是一定需要均匀分布。
FXAA(Fast Approximate AA)
同过找到边界,直接对边界做处理实现抗锯齿。
TAA(Temporal AA)
复用上一帧的信息。