Эффективный способ масштабирования и размытия текстуры в металле - PullRequest
1 голос
/ 06 апреля 2019

У меня есть рендеринг в 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];
...