#objective-c #macos #metal #metal-performance-shaders
#objective-c #macos #Металлические #металл-производительность-шейдеры
Вопрос:
У меня есть некоторый рендеринг в Metal (macOS), который довольно дорогой, но допустимо, если результаты немного размыты. Итак, для оптимизации я выполняю рендеринг текстуры с разрешением, равным половине разрешения вида, затем увеличиваю масштаб результата и применяю фильтр размытия (MPS).
Чтобы увеличить масштаб текстуры, я сначала визуализирую ее в другой текстуре, а затем применяю фильтр размытия, который записывает результат в прорисовываемый объект. Я ищу метод, позволяющий избежать этой промежуточной текстуры (_texture2), чтобы фильтр размытия получал входные данные из исходной текстуры (_texture1). Возможно, мне следует написать свой собственный шейдер размытия?
id <MTLTexture> _texture1; // half the size of the drawable
id <MTLTexture> _texture2; // same size as drawable
id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
id<MTLRenderCommandEncoder> renderEncoder =
[commandBuffer renderCommandEncoderWithDescriptor:...];
// this encoder renders to _texture1
if (renderEncoder) {
// do rendering here
[renderEncoder endEncoding];
MPSImageBilinearScale* scaleFilter =
[[MPSImageBilinearScale alloc] initWithDevice:_device];
scaleFilter.scaleTransform = ...; // enlarge by factor 2
[_scaleFilter encodeToCommandBuffer:commandBuffer sourceTexture:_texture1
destinationTexture:_texture2];
MPSImageGaussianBlur* blurFilter =
[[MPSImageGaussianBlur alloc] initWithDevice:_device sigma:1.0];
[_blurFilter encodeToCommandBuffer:commandBuffer sourceTexture:_texture2
destinationTexture:_view.currentDrawable.texture];
[commandBuffer presentDrawable:_view.currentDrawable];
}
[commandBuffer commit];
Комментарии:
1. Вероятно, это работа для Core Image. Используйте текстуру на основе металла
CIContext
. СоздайтеCIImage
из своей текстуры. Объедините подходящиеCIFilter
параметры для масштабирования и размытия. Затем визуализируйте текстуру назначения.