OpenGL中shader程序的流水线执行顺序 与 点到面的属性映射。
顶点着色器仅对顶点执行,而片段着色器对每个像素执行,中间的数据传递依赖于GPU的自动插值。以下是详细分析:
⚙️ 1. 顶点着色器的执行(每个顶点执行一次)
- 输入数据来源:
aPos和aTexCoord来自CPU端定义的顶点数据(如VBO)。
例如一个三角形的3个顶点数据:float vertices[] = { // 位置(x,y,z) 纹理坐标(u,v) -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, // 左下顶点 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // 右下顶点 0.0f, 0.5f, 0.0f, 0.5f, 1.0f // 上顶点 }; - 顶点着色器输出:
对每个顶点输出gl_Position(裁剪空间位置)和TexCoord(纹理坐标)。
此时仅有3组输出(对应3个顶点)。
🌐 2. 光栅化阶段的插值(GPU自动完成)
- 插值原理:
光栅化将三角形分解为片元(像素),并为每个片元计算重心坐标(α, β, γ)。
片元的属性通过以下公式插值:
其中 α + β + γ = 1。片元属性 = α × 顶点1属性 + β × 顶点2属性 + γ × 顶点3属性 - 示例:
若三角形中心的重心坐标为(0.33, 0.33, 0.34),则其纹理坐标为:TexCoord = 0.33×(0.0,0.0) + 0.33×(1.0,0.0) + 0.34×(0.5,1.0) ≈ (0.5, 0.34)
🎨 3. 片段着色器的执行(每个像素执行一次)
- 输入数据来源:
接收的是插值后的属性(如TexCoord),而非原始顶点数据。 - 执行次数:
若三角形覆盖屏幕上的200×200像素,片段着色器会执行40,000次,每次输入不同的插值坐标。
💎 4. 完整流程总结
| 阶段 | 执行次数 | 输入数据 | 输出数据 |
|---|---|---|---|
| 顶点着色器 | 顶点数量(如3次) | 原始顶点属性(aPos, aTexCoord) |
变换后位置(gl_Position) + 属性(TexCoord) |
| 光栅化 | 自动 | 顶点着色器的输出 | 为每个片元生成插值属性 |
| 片段着色器 | 片元数量(如40,000次) | 插值后的属性(如 TexCoord) |
像素颜色(FragColor) |
⚠️ 关键点:
- 顶点着色器直接输出的属性(如
TexCoord)会被GPU自动插值,传递给片段着色器[citation:6][citation:9]。- 开发者只需定义顶点级数据,无需处理像素级映射细节[citation:3]。
通过这一机制,OpenGL仅用3个顶点的属性,就能为数万像素生成平滑过渡的纹理坐标,兼顾效率与视觉效果。
顶点着色器确定面的三个顶点后,片段着色器会获取面中所有点和所有根据顶点插值后的属性。顶点着色器中输出的所有属性在片段着色器中获取是都是经过插值后的值。如此就完成了点到面的映射


浙公网安备 33010602011771号