执行方式:自动完成
图元装配自动化流程
顶点坐标存入装配区 → 按绘制模式连接顶点 → 生成完整几何图元
示例:gl.drawArrays(gl.TRIANGLES, 0, 3)自动生成三角形
会自动自动裁剪超出屏幕范围(NDC空间外)的三角形,仅保留可见部分
光栅化
将几何图元转换为屏幕上的片段(Fragment),即潜在的像素候选
在此阶段进行插值计算(如纹理坐标、颜色插值)
光栅化阶段核心步骤详解
一、空间转换阶段
-
齐次裁剪空间 → NDC空间
通过透视除法将顶点坐标归一化至[-1,1]范围(OpenGL/Unity)或[0,1]范围(Direct3D)
x_ndc = x_clip / w_clip
,y_ndc = y_clip / w_clip
-
视口变换
将NDC坐标映射到屏幕坐标系:x_{screen} = (x_{ndc} + 1) * 0.5 * screenWidth y_{screen} = (1 - y_{ndc}) * 0.5 * screenHeight
保留z值用于深度测试
二、图元处理阶段
3. 三角形设置
- 输入:屏幕坐标下的三个顶点
- 计算三角形边方程、法线方向
- 构建三角形包围盒(Bounding Box)确定潜在覆盖像素范围
- 三角形遍历
- 遍历包围盒内所有像素
- 通过重心坐标判断像素是否在三角形内:
α + β + γ = 1 \quad (α,β,γ ≥ 0)
- 生成片元(Fragment)数据
三、数据插值阶段
5. 属性插值计算
- 使用透视校正插值(Perspective-Correct Interpolation):
f = \frac{αf_0/w_0 + βf_1/w_1 + γf_2/w_2}{α/w_0 + β/w_1 + γ/w_2}
- 对UV坐标、法线、深度等顶点属性进行插值
四、优化处理阶段
6. 裁剪与背面消隐
- 视锥体裁剪:剔除屏幕外图元
- 背面剔除:通过三角形法线与视线的夹角判断可见性
if(dot(normal, viewDir) < 0) cull;
- 深度测试(Z-Test)
- 比较片元深度值与深度缓冲区
- 采用
LESS/EQUAL
等比较规则决定是否更新像素
五、像素生成阶段
8. 片段着色处理
- 输入插值后的片元属性
- 执行光照计算(Phong/BRDF等模型)
- 纹理采样与颜色混合
- 输出合并
- Alpha混合:
finalColor = srcColor * alpha + dstColor * (1-alpha)
- 写入帧缓冲(考虑颜色缓冲、深度缓冲、模板缓冲)
- Alpha混合:
关键技术与注意事项
- 抗锯齿处理:MSAA通过子采样提升边缘质量
- Early-Z优化:在片元着色前执行深度测试,减少无效计算
- 透视失真:必须使用透视校正插值避免纹理扭曲
- 包围盒优化:通过
min/max
计算减少遍历范围
根据Unity官方数据,合理优化的光栅化流程可使移动端渲染效率提升40%+。建议结合工具进行分阶段性能分析。