代码之家  ›  专栏  ›  技术社区  ›  Diego

如何设置webgl不透明度而不丢失png透明度?

  •  0
  • Diego  · 技术社区  · 11 年前

    我使用webgl绘制二维图片,使用两个三角形,比使用画布二维上下文更快。我把事情做得很简单,因为我只用来画画,没有3d。 现在我正在尝试为片段着色器添加不透明度,因为webgl上下文没有.globalalpha属性。

    这是我的代码:

    <script id="2d-fragment-shader" type="x-shader/x-fragment">
        precision mediump float;
    
        uniform sampler2D u_image;
        varying vec2 v_texCoord;
        uniform float alpha;
    
        void main()
        {
            gl_FragColor = vec4(texture2D(u_image, vec2(v_texCoord.s, v_texCoord.t)).rgb, alpha);
        }
    </script>
    
    ...
    
    webglalpha = gl.getUniformLocation(gl.program, "alpha");
    
    ...
    
    gl.uniform1f(webglalpha, d_opacity);
    

    不透明度是绘图函数作为参数获得的不透明度值。

    不透明度发生了变化,但现在我的透明png变成了黑色背景,尽管以前我还在使用png透明度

    gl_FragColor = texture2D(u_image, vec2(v_texCoord.s, v_texCoord.t));
    

    如何设置不透明度而不丢失pngs透明度?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Overv    11 年前

    需要将覆盖alpha乘以纹理中的原始alpha:

    void main()
    {
        vec4 color = texture2D(u_image, vec2(v_texCoord.s, v_texCoord.t));
        gl_FragColor = vec4(color.rgb, alpha * color.a);
    }
    

    例如,当纹素A的PNG不透明度为 0.5 而纹素B为PNG不透明度 0.3 ,你希望这些 0.25 0.15 当您将全局alpha设置为 0.5 而不是两者 0.5 .