gpt4 book ai didi

swift - 如何使用 rgba16Float MTLPixelFormat 显示 MTKView

转载 作者:行者123 更新时间:2023-11-28 05:44:26 24 4
gpt4 key购买 nike

我有一个 MTKView 设置为使用 MTLPixelFormat.rgba16Float。我遇到了显示问题,下图对此进行了最好的描述:

enter image description here

所以预期的 UIColor 被冲掉了,但只有当它在 MTKView 中显示时。当我将可绘制纹理转换回图像以通过 CIIMage 在 UIView 中显示时,我恢复了原始颜色。以下是我如何创建该输出:

let colorSpace = CGColorSpaceCreateDeviceRGB()
let kciOptions = [kCIImageColorSpace: colorSpace,
kCIContextOutputPremultiplied: true,
kCIContextUseSoftwareRenderer: false] as [String : Any]
let strokeCIImage = CIImage(mtlTexture: metalTextureComposite, options: kciOptions)!.oriented(CGImagePropertyOrientation.downMirrored)
let imageCropCG = cicontext.createCGImage(strokeCIImage, from: bbox, format: kCIFormatABGR8, colorSpace: colorSpace)

其他相关设置:

uiColorBrushDefault: UIColor = UIColor(red: 0.92, green: 0.79, blue: 0.18, alpha: 1.0)
self.colorPixelFormat = MTLPixelFormat.rgba16Float
renderPipelineDescriptor.colorAttachments[0].pixelFormat = self.colorPixelFormat

// below is the colorspace for the texture which is tinted with UIColor
let colorSpace = CGColorSpaceCreateDeviceRGB()
let texDescriptor = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: MTLPixelFormat.rgba8Unorm, width: Int(width), height: Int(height), mipmapped: isMipmaped)
target = texDescriptor.textureType
texture = device.makeTexture(descriptor: texDescriptor)

有些帖子暗示在某处采用了 sRGB,但没有具体说明如何禁用它。

我希望我在 MTKView 上显示的颜色与输入匹配(尽可能接近它)并且仍然能够将该纹理转换为我可以在 ImageView 中显示的内容。我已经在 iPad Air 和新 iPad Pro 上对此进行了测试。相同的行为。任何帮助将不胜感激。

最佳答案

看来您已经非常接近完整的解决方案了。但是你所拥有的并不完全正确。这是一个 Metal 函数,它将从 sRGB 转换为线性值,然后您可以将其写入 Metal 着色器(我仍然建议您写入 sRGB 纹理,但您也可以写入 16 位纹理)。请注意,sRGB 不是简单的 2.2 Gamma 曲线。

// Convert a non-linear log value to a linear value.
// Note that normV must be normalized in the range [0.0 1.0].

static inline
float sRGB_nonLinearNormToLinear(float normV)
{
if (normV <= 0.04045f) {
normV *= (1.0f / 12.92f);
} else {
const float a = 0.055f;
const float gamma = 2.4f;
//const float gamma = 1.0f / (1.0f / 2.4f);
normV = (normV + a) * (1.0f / (1.0f + a));
normV = pow(normV, gamma);
}

return normV;
}

关于swift - 如何使用 rgba16Float MTLPixelFormat 显示 MTKView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55384641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com