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
相关产品推荐
相关产品推荐

