三幅图像问题:如何在 MTKView 和 CIContext 中设置标记颜色数据以正确显示所有三幅图像?

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

我提供了一个 UIKit 测试应用程序的 link,该应用程序并排显示三个不同的图像,每个图像都位于单独的 MTKView 内。每个图像都标有不同的颜色配置文件:

  • 显示P3
  • uRGB
  • 测试RGB

我为所有颜色空间和格式设置了默认值。然后,我检查图像是否已标记,如果是,我会使用标记颜色空间中的状态覆盖这些值。

我设置的变量:

  • Metal CIContext 中的“workingColorSpace”,默认 = sRGB
  • Metal CIContext 中的“workingFormat”,默认 = RGBAf
  • Metal CIContext 中的“outputColorSpace”,默认 = displayP3
  • MTKView 中的“colorPixelFormat”,默认 = bgra8Unorm
  • 我在 MTKView 委托绘制方法中使用的 CIRenderDestination 中的“colorSpace”

“colorSpace”默认值 = CGColorSpaceCreateDeviceRGB()

我还使用 MTKView.colorPixelFormat 在 CIRenderDestination 中设置“pixelFormat”。

如果图像已标记,我将使用标记的 colorSpace 覆盖以下值:

  • CIContext.workingColorSpace
  • CIContext.outputColorSpace
  • CIRenderDestination.colorSpace

如果标记的 colorSpace.isWideGamutRGB = true,则我将 CIRenderDestination.colorSpace 设置为 ExtendedSRGB,忽略标记的广色域颜色空间中的颜色空间,并设置 colorPixelFormat = bgr10_xr

结果:

  • 上述场景将正确渲染 DisplayP3 图像和 uRGB 图像。 “测试 RGB”图像失败:

  • 如果我不使用标记图像中的值覆盖 CIRenderDestination.colorSpace,则“测试 RGB”图像会成功,但“uRGB”图像无法正确渲染:

问题:我是否已正确连接所有内容?如果是,为什么一张图像失败,而另一张图像成功?

示例项目链接:

https://www.dropbox.com/scl/fi/57u2fcrgdvys7jtzykzxt/ColorSpaceTest.zip?rlkey=unjeeiu7mi0wx9wfpylt78nwd&dl=0

metal metalkit mtkview
1个回答
0
投票

我想我已经解决了。对于非宽色域的标记图像,我在 MTKView 的底层 MetalLayer 上设置色彩空间(iOS/Catalyst 不允许您直接在 MTKView 上设置此设置):

在 MTKImageView.swift 中,替换:

if isWideGamutRGB {
    self.colorPixelFormat = MTLPixelFormat.bgr10_xr
}

与:

if isWideGamutRGB {
    self.colorPixelFormat = MTLPixelFormat.bgr10_xr
} else {
    if let metalLayer = self.layer as? CAMetalLayer {
        if let colorSpace = image.colorSpace {
            metalLayer.colorspace = colorSpace
        }
    }
}

所有三个图像现在都能正确显示。

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