Games101-5-6 Rasterization
Lecture 05 Rasterization(Triangles)
a). Perspective Projection
如何定义一个frustum:
- 近平面宽度、高度(得到宽高比)
- FOV(Field of View)
b). Viewport transformation
经过MVP后,模型空间中点变换到标准立方体(canonical cube, x,y,z[-1, 1])中。之后就需要进行视口变换(Viewport transformation)
定义屏幕空间
- OpenGL屏幕空间坐标原点为左下(上图),DX坐标原点为左上
- 像素位置该像素(方块)左下角的坐标,如左下角像素坐标为$(0, 0)$,但像素中心为$(0.5, 0.5)$
Viewport transformation
c). Rasterization
Frame Buffer: Memory for a Raster Display
显存中的一块区域
补充:Render texture(详情见Other/Note)
以下以Unity为例:
渲染过程中,贴图最开始在CPU内存,这时的贴图被称为client-side的texture,最后被送到GPU,这时叫server-side的texture;
Render texture是将FrameBufferObject连接到一个server-side的texture;
- 注意:FrameBufferObject不一定只有一个,也不一定连接屏幕;
Triangles - Fundamental Shape Primitives
- 无法分割为其他多边形
- 保证是一个平面
- 容易区分内部和外部
- 内部插值方便
Fundament: What Pixel Values Approximate a Triangle?
Sampling(采样):逐像素中心采样,判断像素是否在三角形内
for (int x = 0; x < xmax; ++x) output[x] = f(x);
判断$(x,y)$是否在三角形内:做三次叉乘,看正负符号是否相同,相同则在三角形内;
Edge Cases:要么不做处理,要么特殊处理(OpenGL,DX里规定落于左边和上边算三角形中的点,而落于右边和下边的不算“Top-Left Rule“)
光栅化加速
- 光栅化中,对每一个像素都判断是否在三角形中性能浪费过大。因此,加入Bounding Box(包围盒)来限定需要进行判断的区域
- Incremental Triangle Traversal(找到三角形中每一行最左和最右的像素,但实际上没那么容易,是用于细长并旋转的三角形)