SwiftUI colorEffect 着色器 alpha 在深色模式下不受尊重

问题描述 投票:0回答:1

Xcode 15.0.1,iOS 17.0.2

问题:在深色模式下绘制着色器时,SwiftUI colorEffect 着色器不尊重给定颜色的 Alpha 通道。

这发生在 Xcode Canvas(预览版)、Xcode 模拟器和设备上。

此外...如果我强制退出应用程序,将设备设置为深色模式,然后重新启动应用程序,我会非常简短地看到所需的结果 - 地球仪可能会在深色背景上显示 1 帧 - 但随后地球仪被替换为实心填充的矩形(地球仪的框架)。

无论原始颜色或新颜色是动态颜色还是绝对颜色(例如十六进制值),都会发生此行为。

// SwiftUI view

struct ContentView: View {
    var body: some View {
        Image(systemName: "globe")
            .font(.system(size: 200))
            .foregroundStyle(.blue)
            .colorEffect(
                ShaderLibrary.replaceColor(.color(Color(hex: "ff8000")))
            )
    }
}

// Shader code

#include <metal_stdlib>
using namespace metal;

[[stitchable]] half4 replaceColor(float2 pos, half4 oldColor, half4 newColor) {
    return half4(newColor.r, newColor.g, newColor.b, oldColor.a);
}

导致轻模式

Results in in Light Mode

深色模式的结果

Results after Dark mode is activated

.color() 着色器实用程序的文档指出:

   /// Returns an argument value representing `color`. When passed
   /// to a MSL function it will convert to a `half4` value, as a
   /// **premultiplied** color in the target color space.

问题:我在这里缺少什么?我的猜测是它与 alpha 预乘有关。但如何解决这个问题?

swiftui shader metal
1个回答
0
投票

将新的 RGB 值与 alpha 值相乘应该可以解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.