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);
}
导致轻模式
深色模式的结果
.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 预乘有关。但如何解决这个问题?
将新的 RGB 值与 alpha 值相乘应该可以解决此问题。