Вне экрана рендеринг металла

 func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {
        print("current drawable size:\(view.drawableSize)")
    }

    func draw(in view: MTKView) {


        guard let drawable = view.currentDrawable else { return }

        let textureDescriptor = MTLTextureDescriptor()
        textureDescriptor.textureType = MTLTextureType.type2D
        textureDescriptor.width = drawable.texture.width
        textureDescriptor.height = drawable.texture.height
        textureDescriptor.pixelFormat = .bgra8Unorm
        textureDescriptor.storageMode = .shared
        textureDescriptor.usage = .renderTarget

        let sampleTexture = device.makeTexture(descriptor: textureDescriptor)


        let renderPass = MTLRenderPassDescriptor()
        renderPass.colorAttachments[0].texture = sampleTexture
        renderPass.colorAttachments[0].loadAction = .clear
        renderPass.colorAttachments[0].clearColor =
            MTLClearColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
        renderPass.colorAttachments[0].storeAction = .store

        let commandBuffer = commandQueue.makeCommandBuffer()
        var commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: renderPass)


        let deltaTime = 1 / Float(view.preferredFramesPerSecond)


        for scene in scenes{
            scene.render(commandEncoder: commandEncoder!, deltaTime: deltaTime)
        }

        commandEncoder?.endEncoding()


        let descriptor = view.currentRenderPassDescriptor
        commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: descriptor!)



       for canvasScene in canvasScenes{
          canvasScene.updateCanvas(texture: sampleTexture!)
          canvasScene.render(commandEncoder: commandEncoder!, deltaTime: deltaTime)
       }

        commandEncoder?.endEncoding()


        commandBuffer?.present(drawable)
        commandBuffer?.commit()
    }

Я новичок в рендеринге вне экрана. Надеюсь, я делаю это правильно. может кто подскажет правильно это или нет. Сначала я рисую его в образце текстуры, а затем устанавливаю образец текстуры на четырехугольник (плоскость), который рисуется в текущем чертеже. Это оптимизированный способ рендеринга вне экрана.

Этот код запускается, когда я отключаю только проверку Metal API. в противном случае я получил следующую проблему

Fragment Function(fragment_shader_texture): Shader reads texture (texture[0]) whose usage (0x04) doesn't specify MTLTextureUsageShaderRead (0x01)

Предложения по оптимизации


person Ruban4Axis    schedule 25.07.2018    source источник
comment
Вместо того, чтобы устанавливать usage внеэкранной текстуры на .renderTarget, вы должны использовать [.renderTarget, .shaderRead].   -  person warrenm    schedule 25.07.2018
comment
@warrenm Спасибо. Теперь я могу включить проверку Metal API и запуск.   -  person Ruban4Axis    schedule 25.07.2018


Ответы (1)


использование внеэкранной текстуры в .renderTarget, вы должны использовать [.renderTarget, .shaderRead].

person Ruban4Axis    schedule 26.07.2018