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