attribute 和 uniform 的区别
1. 作用域和生命周期
- attribute
- 仅存在于 顶点着色器(Vertex Shader)中
- 用于传递 逐顶点数据(如顶点位置、法线、纹理坐标等)
- 每个顶点都有独立的 attribute 值
- 在绘制调用期间动态变化(每个顶点不同)
- uniform
- 存在于 顶点着色器 和 片段着色器(Fragment Shader)中
- 用于传递 全局常量数据(如变换矩阵、光照参数、颜色等)
- 在整个绘制调用中保持不变(所有顶点/片元共享同一值)
2. 数据更新频率
- attribute
// 顶点着色器示例
attribute vec3 aPosition; // 每个顶点不同的位置
attribute vec2 aTexCoord; // 每个顶点不同的纹理坐标
- uniform
// 顶点/片段着色器示例
uniform mat4 uModelViewProjectionMatrix; // 全局的 MVP 矩阵
uniform vec3 uLightColor; // 全局的光照颜色
3. 应用场景
- attribute
- 顶点位置、法线、颜色、纹理坐标等逐顶点属性
- 通过 glVertexAttribPointer 绑定到顶点缓冲区(VBO)
- uniform
- 变换矩阵(Model、View、Projection)
- 光照参数(光源位置、颜色)
- 材质属性(漫反射颜色、高光强度)
- 通过 glUniform* 系列函数设置值
4. 现代 GLSL 的变化
- 在 OpenGL 3.3+/GLSL 330+ 和 WebGL 2.0 中:
- attribute 被重命名为 in(顶点着色器输入)
- varying 被拆分为 out(顶点着色器输出)和 in(片段着色器输入)
- uniform 的用法保持不变
5.总结
特性 |
attribute |
uniform |
作用域 |
顶点着色器 |
所有着色器 |
数据粒度 |
逐顶点 |
全局一致 |
更新频率 |
每顶点变化 |
每绘制调用不变 |
典型用途 |
顶点属性 |
全局参数 |
设置方式 |
glVertexAttrib* |
glUniform* |
实际使用时,attribute 处理顶点级数据,uniform 处理全局配置,二者共同完成 GPU 的并行计算。