光栅化阶段的主要工作是从投影的三维三角形计算像素颜色。

 
 

视口变换

Viewport Transform

裁剪完成后,硬件进行透视除法,将均匀的裁剪空间转换为标准化的设备坐标(NDC)。一旦顶点位于NDC空间中,形成2D图像的2D x和y坐标就被转换为后缓冲区上称为viewport的矩形。在这个转换之后,x和y坐标是以像素为单位的。通常,viewport转换不会修改z坐标,因为它用于深度缓冲,但可以通过修改D3D12_viewport结构的MinDepth和MaxDepth值来实现。MinDepth和MaxDepth值必须是介于0和1之间。

 
 

背面剔除

Backface Culling

一个平面有两个”面”,对正面和反面的区分按照以下规则:

如果一个三角形由三个vertex:v0, v1, v2构成,然后计算法线向量n,


法向量从正面 发出:


大对数对象是封闭的实体对象,因为前向三角形遮挡了后向三角形,所以绘制它们是没有意义的。背面剔除是指从管道中丢弃背面三角形的过程。这可能会将需要处理的三角形数量减少一半。


 
 


在不使用透明度的情况下,就像右边只能看到三个面。后面的三个三角形可以在处理过程中丢弃掉。

默认情况下,Direct3D将顺时针顺序(相对于查看器)的三角形视为前向,而具有逆时针顺序(相对于查看器)的三角形视为后向。

 
 

顶点属性插值

Vertex Attribute Interpolation

vertex中附加的其他属性,在经过视口变换之后,这些属性需要被插值到三角形覆盖的每一个像素。除了顶点属性外,顶点深度值还需要插值,以便每个像素都有深度缓冲算法的深度值。顶点属性需要在屏幕空间中进行插值,这样才能保证属性值在3D空间中基于三角形进行的线性插值的结果还能用。这就需要被称为透视正确插值的操作。具体的数学推导请参阅《introduce 3D math》那本书。