
先别急着记术语我们从一个大白话问题开始你有没有玩过小时候那种**“按数字连线”**的游戏一张纸上散布着一堆带编号的小点1、2、3、4、5……你拿起笔按照旁边的提示1连22连33连4……把这些点一个个连起来。连着连着奇迹发生了——原本一盘散沙、毫无意义的小点竟然变成了一只小猫、一艘帆船、一个笑脸恭喜你如果你玩过这个游戏那你其实早就理解了图元装配的全部精髓。因为——图元装配说白了就是 GPU 在玩这个按提示连点成形的游戏。它做的事情一句话就能说清把一堆散落的点顶点按照一份连接说明书索引连接组装成一个个基本的形状主要是三角形。就这么简单。下面我们把这句话一个词一个词地掰开揉碎你就彻底懂了。第一步搞懂图元是啥——就是基本形状图元装配这四个字里图元是核心。别被它唬住它其实特别好懂。“图元Primitive”翻译成大白话就是“GPU 能认识的、最基本的图形形状”。你可能觉得GPU 那么厉害肯定能直接画出一辆汽车、一个人物吧错了。GPU 其实很笨也很专一它只认识几种极其简单的形状点—— 就一个孤零零的点;线—— 两个点连成一条线段;三角形—— 三个点围成的一个面。这几种简单形状就叫图元。它们是 GPU 眼里的基本积木。那问题来了GPU 只认识三角形这种简单玩意儿它怎么画出复杂的汽车、人物呢答案是——用海量的小三角形拼出来就像用乐高积木一样。一块乐高很简单,但成千上万块拼在一起,就能搭出城堡、飞船、恐龙。GPU 也是如此:一个三角形很简单,但成千上万个小三角形拼在一起,就能拼出一个圆滑的球、一辆逼真的车、一张生动的脸。所以记住这个颠覆认知的事实你游戏里看到的一切模型——再复杂再精美——本质上全都是由无数个小三角形拼接出来的为什么偏偏是三角形而不是正方形、五边形因为三角形是最靠谱的面——任意三个点永远能唯一确定一个平面绝不会翘边。而四个点就可能不在一个平面上像一张被折过的纸处理起来很麻烦。所以三角形是最稳定、最简单、最好用的面积木。第二步搞懂装配是啥——就是照着说明书组装理解了图元三角形再看装配就秒懂了。“装配”就是组装、拼装的意思。那么图元装配合起来就是把散落的顶点组装成三角形图元。但关键问题来了怎么组装谁跟谁连回到我们开头那个连点成画的游戏。假设你面前有一堆点但没有那份1连2、2连3的提示说明——你会怎么样你会懵掉!你根本不知道该把哪个点和哪个点连起来。乱连一通,只会连出一堆鬼画符。GPU 也一样。光给它一堆散点它不知道哪三个点应该组成一个三角形。所以必须有一份连接说明书。这份说明书在图形学里就叫索引Index。我们来看个具体例子。假设要拼一个正方形的面其实是用两个三角形拼的顶点们散落的点各有编号 顶点0 ●--------● 顶点1 | | 顶点3 ●--------● 顶点2 索引说明书这样写 第一个三角形用 顶点0、顶点1、顶点2 第二个三角形用 顶点0、顶点2、顶点3图元装配就照着这份说明书忠实地执行把 0、1、2 号点连起来 → 拼出右上那个三角形;把 0、2、3 号点连起来 → 拼出左下那个三角形;两个三角形拼一起 → 一个完整的正方形面出现了看这就是图元装配的完整过程——照着索引说明书把散点连成三角形。是不是和按数字连线游戏一模一样第三步一个常见的疑惑——为什么要多此一举搞个索引学到这里很多人会冒出一个问题“直接告诉 GPU’第一个三角形的三个点坐标是……,第二个三角形的三个点坐标是……不就行了吗?干嘛要搞个’编号(索引)这么绕?”好问题答案是为了省内存避免重复。我们再看上面那个正方形。注意到没有——顶点0 和 顶点2被两个三角形共用了如果不用索引、直接写坐标你就得把 顶点0 的完整信息坐标、颜色、法线、贴图坐标……一大堆数据写两遍顶点2 也要写两遍。多浪费而用了索引呢每个顶点的完整数据,只存一份(顶点0 就存一次);说明书里,想用哪个点,只需写它的编号就行——编号是个很小的数字,几乎不占空间。同一个点被反复使用,但它的完整数据只存一份,大家共享一个编号来引用它。这就好比通讯录里你把张三的电话只存一次之后无论多少次想联系他都只需要说张三这个名字编号而不用每次都把他 11 位电话号码完整背一遍。一个字省。这就是索引存在的意义。第四步装配好之后顺手还干了件聪明事——扔掉看不见的图元装配把三角形拼好后往往还会顺手做一个很聪明的优化叫背面剔除想象一个不透明的盒子,它有 6 个面。但你无论从哪个角度看,最多只能看到 3 个面,另外那些背对着你的面,是永远看不见的。既然看不见,费劲去处理它干嘛?于是图元装配会把那些背对着摄像机的三角形直接扔掉,不再往下传。这一扔就省掉了差不多一半三角形的后续工作量非常划算。一张图彻底记住它【上一步】顶点处理 交出一堆散落的、定好位置的点 像连点游戏里那些带编号的散点 ↓ ★★★ 图元装配 ★★★ 干的活照着索引说明书 把散点连成一个个三角形 顺手扔掉背对着我们、看不见的三角形 ↓ 【下一步】光栅化 拿到三角形开始把它填充成像素、上色最后用最简单的话再总结一遍如果你只想记住一句话那就是图元装配 GPU 照着一份连接说明书索引“把一堆散落的点顶点”连接成一个个三角形图元的过程。再啰嗦几个要点帮你彻底记牢“图元” GPU 认识的基本形状最重要的就是三角形;一切复杂模型都是无数小三角形拼出来的;“装配” 照着**索引这份说明书**把点连成三角形;用索引的目的 顶点数据只存一份省内存、避免重复;它的位置承上启下——上接顶点处理拿到散点下接光栅化交出三角形去填色。说到底图元装配就是那个把一盘散沙般的点变成有轮廓、有意义的形状的关键步骤。没有它后面的一切绘制都无从谈起——因为你总得先知道要画的是个什么形状才能往里填色对吧