渲染管线常见术语解释
玩过3D游戏或者接触过图形开发的人,可能都听过“渲染管线”这个词。它就像一条工厂流水线,把3D模型一步步变成你在屏幕上看到的画面。这条线上每个环节都有自己的名字和作用,下面把这些常见的术语掰开揉碎讲清楚。
顶点(Vertex)
3D模型是由很多点组成的,这些点就是顶点。每个顶点包含位置信息(x, y, z),还可能带有颜色、纹理坐标、法向量等数据。比如一个立方体有8个顶点,它们决定了这个立方体在空间中的形状和朝向。
顶点着色器(Vertex Shader)
这是渲染管线的第一站,负责处理每一个顶点。它可以移动顶点位置、计算光照影响,或者传递数据给后续阶段。比如让一个角色模型动起来,就是顶点着色器在逐帧调整顶点坐标实现的。
attribute vec3 aPosition; // 输入顶点位置
uniform mat4 uMVPMatrix; // 变换矩阵
void main() {
gl_Position = uMVPMatrix * vec4(aPosition, 1.0);
}
图元装配(Primitive Assembly)
顶点处理完后,系统会把它们按规则组合成图元,比如三角形、线段或点。三个顶点组成一个三角形,这是最常用的图元类型,因为任何复杂曲面都可以用一堆小三角形拼出来。
几何着色器(Geometry Shader)
这个阶段不是必须的,但它可以生成新的图元。比如输入一个点,输出一个四边形,用来做粒子效果特别方便。下雨时每一滴雨点自动扩展成一个小水花,背后可能就有它的功劳。
光栅化(Rasterization)
这一步是把三角形这样的矢量图形转换成屏幕上的像素点。想象一下用网格纸盖住一个三角形,所有被覆盖的格子都会被标记出来,这些就是将要绘制的像素。光栅化决定了哪些像素需要着色。
片段(Fragment)
光栅化产生的每个像素候选点叫片段,还不是最终像素。它包含了颜色、深度、纹理坐标等信息,等着被进一步处理。你可以理解为“待上色的小方块”。
片段着色器(Fragment Shader)
也叫像素着色器,负责决定每个片段最终显示什么颜色。它可以读取纹理贴图、计算光照细节、添加阴影或模糊效果。比如让金属表面反光,或者给皮肤加上细腻的纹理,都是在这里完成的。
precision mediump float;
uniform sampler2D uTexture;
varying vec2 vTexCoord;
void main() {
gl_FragColor = texture2D(uTexture, vTexCoord);
}
深度测试(Depth Test)
场景里物体前后重叠,得判断哪个该显示哪个该遮挡。深度测试通过比较片段的深度值(z值)来决定是否保留。比如你站在墙前,墙后面的敌人不会透出来,就是因为深度测试把它剔掉了。
混合(Blending)
用于处理透明效果。当一个半透明的窗口或玻璃出现在画面中,它不会完全覆盖背后的像素,而是和原颜色混合。比如UI界面上的透明面板,就是靠混合实现的。
帧缓冲(Frame Buffer)
最终所有处理完的像素都会写入帧缓冲,等一帧画完后统一推送到屏幕上。你可以把它看作一张隐形画布,所有渲染操作都在这张画布上进行,画好了再翻出来给人看。