着色器 blend 在浏览器中显示异常

我写了一个很简单的着色器,来去掉透明背景 PNG 的黑底,来方便后续给这张 PNG 图片上色(见下方代码片元着色器里被注释掉的部分)。

刚发现下面这段代码在 blendState 中的配置,在电脑浏览器中完全失效了:

CCEffect %{
  techniques:
  - name: opaque
    passes:
    - vert: vs:vert
      frag: fs:frag
      blendState:
        targets:
        - blend: true
          blendSrc: src_alpha
          blendDst: one_minus_src_alpha
      depthStencilState:      
          depthTest: false  
          depthWrite: false 
}%

CCProgram vs %{
  precision highp float;
  #include <cc-global>
  in vec3 a_position;
  in vec2 a_texCoord;  
  out vec2 uv;
  
  vec4 vert() {
    vec4 pos = vec4(a_position, 1);

    pos = cc_matViewProj * pos;

    uv = a_texCoord;
    
    return  pos;
  }
}%

CCProgram fs %{
  precision highp float;
  #include <sprite-texture> 

  in vec2 uv;

  vec4 frag() {
    // vec3 green = vec3(0.0, 1.0, 0.0);
    vec4 color = texture(cc_spriteTexture, uv); 
    // color.rgb = mix(color.rgb, green, 0.8);      // 使用内置的 GLSL 方法 mix 混合颜色
    return color;
  }
}%

如下图所示,Macbook 上的 Chrome 浏览器(Safari 浏览器也一样),都会莫名显示黑色底色:

留意在 Cocos Creator 编辑器中运行则完全正常(见上图右侧),仅电脑浏览器上有问题。

:bulb: 【重要】几天前电脑浏览器运行也是正常的,不知道为何今天重新运行出现这种异常(代码没有任何修改),有没有可能是苹果更新了 Webkit 内核带入了什么 bug?

更多信息:

  • Creator 版本:3.8.6
  • MacOS:15.5 (24F74)
  • Chrome 版本 138.0.7204.93(正式版本) (arm64)

使用的 PNG 图片(打成 zip 压缩包):avatar_transparent.png.zip (41.1 KB)

另外我特意在手机(iPhone 13 Pro, iOS 18.5)的 Safari 浏览器试了下,发现没有黑色底色,但是会有不明显的白色高亮:

也希望你们能仔细看一下 iPhone 上的这个问题,因为 Cocos Creator 编辑器上没有这种奇怪的白色高亮,这张 PNG 我也仔细检查过了,它的底色就是 100% 透明的。

找到原因了,是因为在宏配置那里勾选上了允许画布背景透明(ENABLE_TRANSPARENT_CANVAS)。

不过也是奇怪,不应该编辑器里跟浏览器里的表现不一才是 :fearful: