MTLTexture 到 CIImage 的转换生成错误的颜色

问题描述

我有一个 MTLTexture 数组,它来自我的 Renderer 绘制方法。 当我获得 MTLTexture 时,我想将其用作 SCNScene 中的 SCNMaterialdiffuse.contents,然后将其导出为 CIImage,然后将其导出为 web 的 jpeg/png。

为了方便说明问题,我导出了3张图片。

  1. 原始 MTLTexture

    Original MTLTexture

  2. 来自 MTLTexture 的 CIImage

    CIImage from MTLTexture

  3. 来自 CIImage 的 UIImage

    enter image description here

问题:

正如你所看到的,我的蓝线有不同的颜色。第一张图片是我想要的 MTLTexture 中的线,它是由非常多的点与非常低的 alpha 重叠生成的。 由于某种原因,在第二张和第三张图像中,线条具有较低的 alpha,好像点混合不是额外的。

alpha 通道在着色器的片段函数中计算如下:

baseColor.a = color.a / overlapping;

其中重叠是指每个空间单位有多少个具有相同 alpha 重叠的蓝点。

如果我设置“baseColor.a = 1.0;”,所以我的纹理中没有打算使用 alpha 通道,那么结果就是我所期望的,并且 MTLTexture CIImage 和 UIImage 重合。

对于任何其他 alpha 值,我都会收到上述错误。

我想要实现的流程是导出 6 个 MTLTexture 并将它们设置为 SCNBox 面。 由于 Material.diffuse.contents 可以是 MTLTexture,我尝试直接设置我的纹理,结果我获得了类似图像 3 的图像(来自 CIImage 的 UIImage)。

有人建议修改我的 SCNScene 中的混合选项:我尝试了所有可能的设置,最接近原始图像的设置是“倍增”。

然而,颜色更深(见图 4)。

  1. 蓝色更深

Blue is darker

我的色彩空间在 Metal 空间中到处都是 bgra8Unorm,创建 CIImage 我将 CGColorSpaceCreateDeviceRGB() 设置为色彩空间。

有什么想法吗? 谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...