// 顶点着色器接收颜色转发给片段着色器 const char *vs #version 330 core\n layout(location 0) in vec2 position;\n layout(location 1) in vec3 color;\n // 从 C 顶点数据读颜色 out vec3 fragColor;\n // 输出给片段着色器 void main() {\n gl_Position vec4(position, 0.0, 1.0);\n fragColor color;\n // 每个顶点用自己的颜色 }\n; // 片段着色器接收插值后的颜色。注意顶点着色器 out 名字 这里 in 名字 const char *fs #version 330 core\n in vec3 fragColor;\n out vec4 outColor;\n void main() {\n outColor vec4(fragColor, 1.0);\n // 四个角的颜色在体内部自动混合 }\n;这两段代码构成了现代 OpenGL 中最基础的渲染管线一个负责处理顶点数据的顶点着色器Vertex Shader和一个负责计算像素颜色的片段着色器Fragment Shader。它们使用 GLSLOpenGL Shading Language编写语法上高度类似 C/C但专为图形处理设计。下面为您逐行进行详细的语法与功能解析一、 顶点着色器 (Vertex Shader) 详解#version 330 core语法预处理指令#version。作用声明该着色器使用的 GLSL 版本。330代表 OpenGL 3.3 版本core表示使用核心模式Core Profile这意味着废弃了旧的固定管线功能必须使用现代编程方式。layout(location 0) in vec2 position; layout(location 1) in vec3 color;layout(location X)布局限定符。它显式地将着色器中的输入变量绑定到特定的插槽索引0 和 1。这必须与 C 代码中调用enableAttributeArray()和setAttributeBuffer()时传入的索引严格对应。in输入变量限定符。表示该变量是从外部即 C 端通过 VBO 传递的顶点数组读取的。vec2/vec3GLSL 内置的向量数据类型。vec2包含 2 个浮点数通常表示 x, yvec3包含 3 个浮点数通常表示 x, y, z 或 R, G, B。out vec3 fragColor;out输出变量限定符。表示该变量的值将被发送到渲染管线的下一个阶段即片段着色器。数据传递机制顶点着色器的out变量与片段着色器的in变量必须类型相同且名称一致这里是fragColorGPU 才能正确匹配并传递数据。void main() { gl_Position vec4(position, 0.0, 1.0); fragColor color; }void main()着色器的入口函数每个着色器都必须有且仅有一个main函数。gl_PositionOpenGL 的内置保留变量类型为vec4。顶点着色器必须向它写入数据否则图元不会被渲染。这里利用vec4(vec2, float, float)构造函数将 2D 坐标扩展为 4D 齐次坐标补全 Z0.0, W1.0。fragColor color;直接将接收到的顶点颜色赋值给输出变量准备传递给片段着色器。二、 片段着色器 (Fragment Shader) 详解in vec3 fragColor;in接收来自顶点着色器的输出数据。核心特性光栅化插值当 GPU 将三个顶点连成三角形并填充内部成千上万个像素时硬件会根据当前像素距离这三个顶点的相对位置自动对fragColor进行线性插值。例如如果当前像素正好在红色顶点和绿色顶点正中间GPU 传进来的fragColor就是(0.5, 0.5, 0.0)黄色。out vec4 outColor;out片段着色器的输出变量。在 OpenGL 3.3 核心模式中片段着色器不能像老版本那样直接赋值给内置变量gl_FragColor而是必须显式声明一个out vec4变量来输出最终颜色。void main() { outColor vec4(fragColor, 1.0); }vec4(fragColor, 1.0)类型构造函数。因为接收到的fragColor是vec3只有 RGB而最终输出需要vec4RGBA所以这里手动补上了1.0作为 Alpha透明度通道表示该像素完全不透明。最终输出将计算好的颜色赋给outColorGPU 随后会将其写入显存中的帧缓冲区FrameBuffer最终显示在屏幕上。总结这段代码完美展示了现代 OpenGL 的核心思想CPU 只负责提供顶点数据位置颜色而具体的颜色混合与像素渲染完全交由 GPU 在着色器中并行完成。