Как использовать мультисэмплинг с MTKView? - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь заставить работать мультисэмплинг с MTKView.У меня есть MTKView с делегатом.Я устанавливаю для свойства sampleCount представления значение 4. Я создаю дескриптор состояния конвейера с параметром rasterSampleCount, равным 4, и использую его для создания состояния конвейера рендеринга, которое я использую при рендеринге.

В делегатеМетод draw(in:), я создаю дескриптор прохода рендеринга, получая текущий дескриптор прохода рендеринга представления и устанавливая storeAction в multisampleResolve.Я также установил попробовать storeAndMultisampleResolve безрезультатно.

Я создал текстуру разрешения для дескриптора прохода рендеринга, и она имеет ту же ширину и высоту, что и вид, и в том же формате пикселей.

Учитывая вышесказанное, я получаю полную красную рамку во время рендеринга.Я использовал металлический отладчик для просмотра текстур, и как текстура вида, так и текстура разрешения имеют правильный рендеринг.Я нахожусь на машине AMD, где полностью красная текстура часто указывает на неинициализированную текстуру.

Нужно ли что-нибудь сделать, чтобы рендеринг вышел на экран?

Вот как яЯ устанавливаю вид, состояние конвейера и текстуру разрешения:

    metalView = newMetalView
    metalView.sampleCount = 4
    metalView.clearColor = MTLClearColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0)
    device = newMetalView.device!

    let metalLibrary = device.makeDefaultLibrary()!
    let vertexFunction =  metalLibrary.makeFunction(name: "vertexShader")
    let fragmentFunction = metalLibrary.makeFunction(name: "fragmentShader")

    let pipelineStateDescriptor = MTLRenderPipelineDescriptor.init()
    pipelineStateDescriptor.label = "Particle Renderer"
    pipelineStateDescriptor.vertexFunction = vertexFunction
    pipelineStateDescriptor.fragmentFunction = fragmentFunction
    pipelineStateDescriptor.colorAttachments [ 0 ].pixelFormat = metalView.colorPixelFormat
    pipelineStateDescriptor.rasterSampleCount = 4

    do {
        try pipelineState = device.makeRenderPipelineState(descriptor: pipelineStateDescriptor)
    } catch {
        NSLog("Unable to create pipeline state")
        pipelineState = nil
    }

    let textureDescriptor = MTLTextureDescriptor.texture2DDescriptor(pixelFormat: metalView.colorPixelFormat, width: Int(metalView.bounds.width), height: Int(metalView.bounds.height), mipmapped: false)
    resolveTexture = device.makeTexture(descriptor: textureDescriptor)!

И вот как я рисую:

    let commandBuffer = commandQueue.makeCommandBuffer()
    commandBuffer?.label = "Partcle Command Buffer"
    let renderPassDescriptor = metalView.currentRenderPassDescriptor
    renderPassDescriptor?.colorAttachments[0].clearColor = MTLClearColorMake(0.0, 0.0, 0.0, 0.0)
    renderPassDescriptor?.colorAttachments[0].loadAction = MTLLoadAction.clear
    renderPassDescriptor?.colorAttachments[0].storeAction = MTLStoreAction.multisampleResolve
    renderPassDescriptor?.colorAttachments[0].resolveTexture = resolveTexture

    let renderEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: renderPassDescriptor!)
    renderEncoder?.label = "Particle Render Encoder"
    renderEncoder?.setViewport(MTLViewport(originX: 0.0, originY: 0.0, width: Double(viewportSize.x), height: Double(viewportSize.y), znear: -1.0, zfar: 1.0))
    renderEncoder?.setRenderPipelineState(pipelineState!);

Затем я выполняю вызовы рисования, а затем заканчиваювверх по вызову:

    renderEncoder?.endEncoding()
    commandBuffer?.present(metalView.currentDrawable!)
    commandBuffer?.commit()

Вот что отладчик показывает в моих текстурах:

enter image description here

Странно, при выполнении этой отладкиЯ случайно спрятал Xcode, и для 1 кадра вид показал правильную текстуру.

1 Ответ

0 голосов
/ 20 октября 2018

Какова начальная конфигурация renderPassDescriptor (как возвращено из metalView.currentRenderPassDescriptor?

Я полагаю, вы хотите, чтобы texture для цветного вложения было установлено на metalView.multisampleColorTexture, а для resolveTexture было установлено metalView.currentDrawable.textureТо есть он должен выполнить первичный рендеринг с несколькими выборками для текстуры с несколькими сэмплами, а затем преобразовать ее в текстуру для рисования, чтобы фактически нарисовать ее в виде.

Я не знаю, MTKView автоматически устанавливает currentRenderPassDescriptor таким образом, когда есть sampleCount> 1. В идеале это было бы.

...