我正在创建一个带有WebGL的2D渲染引擎,我在其中使用纹理地图集并同时批量处理数百个实体。我需要为每个实体设置一个唯一的alpha值,而我却不知道如何做到这一点。
我当前的片段着色器是这样的:
precision mediump float;
uniform float u_alpha;
uniform sampler2D u_image;
varying vec2 v_texCoord;
void main () {
vec4 texture = texture2D(u_image, v_texCoord);
gl_FragColor = vec4(texture.rgb, texture.a * u_alpha);
}
我想将全局统一更改为统一缓冲区或将应用于v_texCoord的唯一值数组,但我不知道如何执行此操作。
答案 0 :(得分:1)
您需要将这些值作为属性传递,就像v_texCoord
一样。
attribute float a_alpha;
varying float v_alpha;
...
void main() {
...
v_alpha = a_alpha; // pass the alpha values to the fragment shader.
...
}
片段着色器中的
varying float v_alpha;
...
gl_FragColor = vec4(texture.rgb, texture.a * v_alpha);
除了使用单独的属性,您还可以使纹理坐标具有3个值。你,v和alpha。换句话说,将v_texCoord
更改为vec3
。更新顶点着色器中的属性以获取vec3
。更新您的UV数据,以便每个UV也有一个alpha。将片段着色器更改为。
varying vec3 v_texCoord;
void main () {
vec4 texture = texture2D(u_image, v_texCoord.xy);
gl_FragColor = vec4(texture.rgb, texture.a * v_texCoord.z);
}