Эффективный способ увеличить масштаб и размыть текстуру в металле

#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 параметры для масштабирования и размытия. Затем визуализируйте текстуру назначения.