【问题标题】:How can I set webgl opacity without losing png transparency?如何在不丢失 png 透明度的情况下设置 webgl 不透明度?
【发布时间】:2014-08-01 00:48:11
【问题描述】:

我使用 webgl 绘制带有两个三角形的 2d 图片,比使用 canvas 2d context 更快。我把事情保持得很简单,因为我只用它来画图,没有 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);

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

不透明度发生了变化,但现在我的透明 png 得到了黑色背景,虽然 png 透明度以前可以工作,当时我还在使用

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

如何在不丢失 png 透明度的情况下设置不透明度?

【问题讨论】:

    标签: webgl opacity


    【解决方案1】:

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

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

    例如,当 texel A 的 PNG 不透明度为 0.5 而 texel B 的 PNG 不透明度为 0.3,当您将全局 alpha 设置为 @987654326 时,您希望它们分别变为 0.250.15 @ 而不是两者都是0.5

    【讨论】:

    • 有了这个新代码,我的精灵有时会有一点优势。我以前曾经遇到过这个问题,我在 getContext() 调用中添加了“premultipliedAlpha:false”来修复它。新代码似乎忽略了它。无论我在 getContext() 调用中删除或放置它,小边缘都会留在我的精灵周围。 :\ 知道为什么吗?
    • @Diego 你能提交一个新问题,并用图片显示问题吗?
    • 我认为它与这个问题太相关而无法创建另一个问题,但我会的。
    猜你喜欢
    • 2012-11-24
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 2015-07-18
    相关资源
    最近更新 更多