【问题标题】:Setting the Alphas of a Batched Vertex Array With a Uniform Array使用统一数组设置批处理顶点数组的 Alpha
【发布时间】:2013-04-02 17:25:46
【问题描述】:

我正在使用 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 的唯一值数组,但我不知道该怎么做。

【问题讨论】:

标签: javascript canvas 2d glsl webgl


【解决方案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 个值。 u、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);
}

【讨论】:

  • 谢谢!我采纳了你的第二个建议,因为它更有说服力。绑定缓冲区后,几乎错过了必须在我的 vertexAttribPointer 中设置正确的组件数,但我明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
相关资源
最近更新 更多