You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL顶点着色器疑问:为何三角形呈现渐变色彩?

为什么顶点着色器仅按顶点执行却会产生像素级渐变?

首先明确:顶点着色器确实是每个顶点运行一次,你看到的渐变效果来自OpenGL渲染管线的光栅化阶段属性插值,并非每个像素都执行了顶点着色器。

你的代码逻辑完全合理,渐变的本质是:

  • 顶点着色器为三角形的三个顶点分别计算出对应的vertexColor值(基于顶点位置的x、y分量)
  • 当顶点数据传递到光栅化阶段时,OpenGL会自动对三角形内部的每个像素位置,根据三个顶点的vertexColor进行线性插值
  • 最终片段着色器拿到的是每个像素位置插值后的vertexColor,因此渲染出了平滑的渐变过渡效果

举个直观例子:如果三角形三个顶点的颜色分别是红、绿、蓝,光栅化时会在顶点之间的区域逐步混合颜色,让每个像素的颜色自然过渡,这就是你看到的渐变的核心原理。

你的着色器代码

顶点着色器

#version 330 core
layout (location = 0) in vec3 aPos;
out vec3 vertexColor;

void main()
{
   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
   vertexColor = vec3(aPos.x, aPos.y, 1);
}

片段着色器

#version 330 core
in vec3 vertexColor;
out vec4 FragColor;
void main()
{
   FragColor = vec4(vertexColor.xyz, 1.0f);
}

渲染效果

渲染效果

如果想关闭插值(让整个三角形面使用单一顶点的颜色),可以在顶点着色器的输出变量前添加flat修饰符:

flat out vec3 vertexColor;

同时片段着色器的输入也要对应修改:

flat in vec3 vertexColor;

这样渲染出来的三角形就会呈现单一颜色,不会有渐变效果。

内容的提问来源于stack exchange,提问作者Alessandro Di Cicco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:39:18