Скопируйте металлический каркасный буфер в MTLTexture с другим форматом пикселей - PullRequest
0 голосов
/ 23 марта 2020

Мне нужно захватить пиксели экрана в текстуру, чтобы выполнить постобработку. Ранее я использовал BlitCommandEncoder для копирования из текстуры в текстуру. Исходная текстура, являющаяся текстурой MTLDrawable, на мою текстуру назначения. Они оба имеют один и тот же MTLPixelFormatBGRA8Unorm, поэтому все работает отлично.

Однако теперь мне нужно использовать текстуру цветового вложения буфера кадра MTLPixelFormatRGBA16Float для рендеринга HDR. Поэтому, когда я беру пиксели экрана, я на самом деле берусь из этой цветовой текстуры, а не из рисованной текстуры. И я получаю эту ошибку:

[MTLDebugBlitCommandEncoder internalValidateCopyFromTexture: sourceSlice: sourceLevel: sourceOrigin: sourceSize: toTexture: destinationSlice: destinationLevel: destinationOrigin: options:]: 447: не подтверждено [destinationTexture pixelFormat] (MTLPixelFormatBGRA8Unorm)

Не думаю, что мне нужно менять текстуру назначения на формат RGBA16Float? Потому что это займет вдвое больше памяти. Одной полноэкранной текстуры (цветное вложение) с этим форматом должно быть достаточно для корректной работы HDR?

Есть ли другой способ для успешного выполнения такого рода копирования? На openGL нет ошибки при копировании с glCopyTexImage2D

1 Ответ

0 голосов
/ 23 марта 2020

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

В качестве альтернативы, если вы хотите избежать стандартного кода рендеринга без операции, вы можете использовать производительность MPSImageConversion. шейдер, который в основном делает то же самое.

...