简体   繁体   中英

Off Screen Rendering Metal

 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()
    }

I am new to Off screen rendering. I hope I am doing it correct. can any one suggest whether it is correct or not. I am drawing it in sample Texture in first and then setting the sample texture to the quad(plane) which is drawing in the current drawable. Is it the optimized way of doing off screen rendering.

This code runs when i only disable Metal API validation. otherwise i got following issue

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

Suggestions please to optimize

屏幕纹理对.renderTarget的用法,您应该使用[.renderTarget,.shaderRead]。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM