那只是一个命名约定,不是强制要求的。 但是对我来说可以轻松通过名字知道值从哪里来,a_ 代表属性,值从缓冲中提供; u_ 代表全局变量,直接对着色器设置;v_ 代表可变量,是从顶点着色器的顶点中插值来出来的。 查看WebGL工作原理获取更多相关信息。

命名约定的来源

a_、u_、v_ 并非 GLSL 的强制语法,而是着色器社区的通行命名约定,用来一眼区分数据来源。

  • a_(attribute,属性):由缓冲区逐顶点提供的输入,仅顶点着色器可用。
  • u_(uniform,全局量):整次绘制调用中保持不变,由应用程序直接设置。
  • v_(varying,可变量):从顶点着色器插值到片元着色器的值。

WebGL 与 Three.js 的大量教程、引擎示例都沿用这套约定,养成习惯能明显提升着色器代码的可读性。