Проблемы с отображением цвета металла (в пиксельном формате sRGB) - PullRequest
0 голосов
/ 25 апреля 2018

Я не могу добиться правильного представления цвета в моем самом базовом Metal-проекте, если его CAMetalLayer pixelFormat установлен на rgba8Unorm_srgb. Под правильным я подразумеваю, что мои UIColor и UIImage должны выглядеть одинаково в металле, как в UIKit. Я выяснил, что это точно, если мой пиксельный формат CAMetalLayer равен rgba8Unorm. Но мне действительно нужно использовать rgba8Unorm_srgb.

Я прикрепил два скриншота этого проекта. Имеет квадрат CAMetalLayer. Это серый цвет фона его MTLRenderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1). У него также есть белые и черные квады и один другой с красным градиентом над ними, который фактически использует стандартное альфа-смешение:

colorAttachments[0].rgbBlendOperation = .add
colorAttachments[0].alphaBlendOperation = .add

colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha

colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha

Единственная разница между двумя скриншотами - это их пиксельный формат CAMetalLayer. Но, как вы можете видеть, даже ясный цвет уже другой. (Они на самом деле отличаются именно гамма-коррекцией). Белый и черный одинаковы, но все остальные цвета тоже разные. Альфа-смешение не работает корректно и на rgba8Unorm_srgb: вы можете видеть, что его половина на белом назначении является ненасыщенной, а половина на черном назначении перенасыщена.

Из моего понимания мне не нужно беспокоиться о гамма-коррекции, не нужно изменять мои шейдеры или цвета. Металл должен делать всю математику в линейном пространстве независимо от пиксельного формата. Так почему же это происходит?

rgba8Unorm rgba8Unorm_srgb

...