precision mediump float;
uniform sampler2D u_sampler0;
//uniform sampler2D u_sampler1;
//uniform vec4 u_cameraParam;
// 使用数组的方式
uniform vec4 u_colors[2];
// The common structure uniform is the bad implements, it is low runtime performeance, because:
// gl.getUniformLocation(shd_program, u_baseParam.color);
// gl.getUniformLocation(shd_program, u_baseParam.offset);
// // 使用struct的方式
// struct BaseParam {
// vec3 color;
// vec3 offset;
// };
// uniform BaseParam u_baseParam;
// The base type uniform array or ubo are usually recommended.
varying vec2 v_uvs;
void main()
{
vec4 color4 = texture2D(u_sampler0, v_uvs);
color4 *= u_colors[0];
gl_FragColor = color4;
}
这里结构体会导致更新对应数据的次数增加,因此效能变低。
如上代码实例, 使用struct 方式的时候,更新BaseParam里面的color和offset数据,需要调用两次gl.uniform3f()函数更新数据。
而使用数组的形式,则只需要调用一次gl.uniform4fv()(或者gl.uniform3fv())函数。为何这里用vec4类型,这是为了内存对齐,以便尽可能的提高性能。
所以能放在一起传给GPU的数据就尽量不要分开传。这样才能尽可能的避免不必要的性能损耗。
推荐使用基本类型的数组作为 uniform, 或者使用UBO.