swift metal HDR video цветопередача
я разрабатываю приложение в котором требуется загружать видео из галереи и обрабатывать в шейдере через Metal
все работает за исключением цветопередачи на видео которые были записаны с поддержкой HDR
в зеленом квадрате верная цветопередача, слой ниже это рендер из Metal
я написал тестовый проект в котором можно воспроизвести проблему - https://github.com/easyproger/testHDRcolor
так же я нашел решение с получением текстуры через контекст, но при таком способе производительность падает в два раза по сравнению с CVMetalTextureCacheCreateTextureFromImage
пример контекста:
context = CIContext(mtlDevice: device, options: [
.workingFormat: CIFormat.RGBAh,
.workingColorSpace: colorSpace
])
context.render(image, to: texture, commandBuffer: nil, bounds: image.extent, colorSpace: colorSpace)
пример через CVMetalTextureCacheCreateTextureFromImage
func createTexture(fromPixelBuffer pixelBuffer: CVPixelBuffer, pixelFormat: MTLPixelFormat, planeIndex: Int) -> MTLTexture? {
var mtlTexture: MTLTexture? = nil
let width = CVPixelBufferGetWidthOfPlane(pixelBuffer, planeIndex)
let height = CVPixelBufferGetHeightOfPlane(pixelBuffer, planeIndex)
var texture: CVMetalTexture? = nil
let status = CVMetalTextureCacheCreateTextureFromImage(nil, textureCache!, pixelBuffer, nil, pixelFormat, width, height, planeIndex, &texture)
if status == kCVReturnSuccess {
mtlTexture = CVMetalTextureGetTexture(texture!)
}
return mtlTexture
}
я понимаю что проблема лежит в цветопередаче, но как ее решить не теряя производительность, не могу найти
Ответы (1 шт):
К сожалению, пока не получится так как Вы хотите на iOS.
Metal поддерживает рендеринг с использованием формата MTLPixelFormatBGR10_XR_sRGB, но на iOS пока не выходит за пределы цветового пространства P3
Как выглядит работа Metal с HDR:
Для последнего шага необходим wantsExtendedDynamicRangeContent, который доступен только на macOS.

