本节摘要:图元装配把孤立的顶点按绘制命令指定的模式拼成图元,裁剪掉视野外的部分,完成透视除法与视口变换;光栅化随后把连续的三角形离散成屏幕上的片元网格,并用插值把顶点属性摊到每个片元上。本节解剖这两个固定功能阶段,重点讲清楚像素质心规则(决定边缘像素归属)、插值中的透视校正(决定纹理为什么不歪),以及背面剔除与近远裁剪的典型病变。这是从「几何世界」到「像素世界」的过桥节。
2.1 节说过,顶点着色器眼里没有三角形。三角形的诞生时刻在图元装配:GPU 读取绘制命令里的图元模式(三角形、三角形带、线段、点……),把顶点流按模式切组。GL_TRIANGLES 模式下每三个顶点一组;GL_TRIANGLE_STRIP 模式下顶点共享成一条带,N 个顶点产出 N 减 2 个三角形,四边形网格用条带能省近半的顶点传输。模式的选择权在你手里,装配规则是固定的。
装配之后紧跟两刀。第一刀是背面剔除(可选开关):根据屏幕空间里三角形顶点的环绕方向判断它朝向还是背向摄像机,背向的直接扔掉——封闭物体内部那半面永远不该被看到,剔掉等于少画一半三角形。第二刀是裁剪:把完全在视锥外的图元扔掉、跨越边界的切成小块,上一节说过这必须在透视除法之前完成,因为裁剪空间的「负 w 到正 w」判断最便宜。
裁剪完才轮到透视除法(除以 w 得到 NDC)和视口变换(把 NDC 的负 1 到 1 范围映射成具体的像素坐标和深度值)。至此,几何体完成了从抽象数学到具体像素格的落位,光栅化接手。
⚠️ 常见坑一:环绕方向搞反。默认逆时针为正面,如果建模软件导出的网格是顺时针习惯,全部三角形会被背面剔除当成背面扔掉——症状是整个模型"消失"只剩个别内表面。修法要么翻转环绕约定,要么在导入时交换顶点顺序。模型整体消失,先查背面剔除和环绕方向。
⚠️ 常见坑二:物体靠近摄像机时突然消失成洞。这是近平面裁剪在起作用:比近平面还近的部分被切掉。透视投影的近平面不能设成 0 或极小值(数学上发散、深度精度上灾难,4.3 节展开),物体怼到镜头前必然被切。
光栅化回答的问题只有一个:屏幕上网格中,哪些像素被这个三角形覆盖,覆盖到的每个像素取什么属性值。判断覆盖用的是质心规则:一个像素是否归属某三角形,看像素中心点是否落在三角形内。规则听起来平淡,但它保证了一个重要性质——无重叠、无遗漏:相邻三角形恰好瓜分像素,不多不少。这意味着接缝处既不会双重绘制(闪烁)也不会漏缝(孔洞)。

光栅化不只判定归属,还要插值。三角形三个顶点各自带着法线、纹理坐标、颜色,中间的片元拿什么值?答案是按重心坐标加权:片元在三角形里的位置离哪个顶点近,就多继承那个顶点的属性。屏幕上的渐变色就是这样来的——顶点给三原色,中间自动过渡。
但直接按屏幕空间距离插值有个隐蔽的错误,叫透视失真。设想一条贴在地上的长条纹理:近端和远端的纹理坐标分别在两个顶点上,屏幕上中点像素离两端各半,朴素插值会取纹理坐标的中点。可是透视让近端在屏幕上占的像素多、远端占的少,「屏幕中点」实际对应的是地面条带偏近端的位置——朴素插值给的却是物理中点的纹理坐标。结果是透视越强纹理越歪斜,地砖越远越拧。
硬件的药方是透视校正插值:插值前先除以各自的 w,插值后再除回来,把透视的影响从权重里抵消。这个过程完全在固定功能硬件里发生,你感知不到它,除非——你在顶点着色器里手工传递插值用的变量。noperspective 限定符可以主动关掉校正(个别特殊效果需要屏幕空间均匀的插值,比如屏幕空间贴图),但 99% 的场景应该保持默认的透视校正。
💡 关键直觉:透视校正插值是「免费的正确」,noperspective 是「付费的错误」。默认选项就是对的选项,除非你明确知道自己在买什么。
这一站的成本几乎只由一个数字决定:被覆盖的像素数(术语叫填充率)。三角形越大、屏幕分辨率越高、物体离摄像机越近,片元越多。几个工程含义:高 DPI 屏幕上渲染量按面积翻四倍,移动端必须考虑分辨率缩放;大量互相遮挡的超大三角形是纯粹的浪费(画完被覆盖),视锥剔除和遮挡剔除(第 7 章)就是为此存在;「小三角形问题」反方向作恶——三角形小于一个像素时并行效率崩塌,顶点工作量不少、片元产出为零,过密的细分曲面容易踩中。
填充率压力的定量感受可以这样建立:一块全屏的 1080p 后处理 pass 大约两百万片元;如果这个 pass 采样五张全屏纹理,就是一千万次纹理读取。四个这样的 pass 叠起来,帧预算里纹理带宽的账单就逼近中端 GPU 的舒适上限——这解释了为什么第 5 章后处理链要发明降采样(在四分之一分辨率上做模糊再升回来):像素数减到十六分之一,带宽账单同步缩水。判断某效果贵不贵,先算它碰多少像素、每像素碰多少次显存——这个心算习惯比记住任何基准数字都有用。
💡 关键直觉:顶点站与片元站的优化方向天然相反。顶点站省的是「每个顶点的属性宽度与重复计算」(3.1 节的索引复用、6.2 节的紧凑格式);片元站省的是「被触发的像素总数与每像素的采样次数」。同一个场景,镜头拉近时瓶颈常从顶点站滑向片元站——排错前先看镜头,再选怀疑对象。
片元已经带着插值好的属性站到了下一站的传送带上——片元着色器,整条管线里戏份最重、与你日常打交道最多的可编程阶段。