离屏渲染金属 [英] Off Screen Rendering Metal

查看:203
本文介绍了离屏渲染金属的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我是屏幕外渲染"的新手.我希望我做对了.任何人都可以建议它是否正确.我首先在示例Texture中绘制它,然后将示例纹理设置为在当前drawable中绘制的quad(plane).是进行屏幕外渲染的优化方法.

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.

当我仅禁用Metal API验证时,将运行此代码.否则我会关注

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)

建议优化

推荐答案

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

off-screen texture's usage to .renderTarget, you should use [.renderTarget, .shaderRead].

这篇关于离屏渲染金属的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆