Я не могу добиться правильного представления цвета в моем самом базовом 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_srgb](https://i.stack.imgur.com/5QylV.png)