ios - 离屏渲染 Metal

标签 ios swift textures metal metalkit

 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)

建议优化

最佳答案

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

关于ios - 离屏渲染 Metal ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51511686/

相关文章:

memory - CUDA:纹理内存的访问时间是否类似于合并的全局内存?

ios - 在 Swift 项目中找不到接受类型 'CGSize' 的参数列表的类型 '(() -> _)' 的初始值设定项

ios - children count 总是返回0 ,无法正确到达

objective-c - 简单的多边形纹理贴图/iOS/cocos2d

c++ - OpenGL 中的 Texture Splatting 是如何实现的?

ios - swift 中的 NSLayoutConstraint

ios - countForFetchRequest 为空表返回 1

android - 是否可以在 React-Native 中使用内置的视频播放器

ios - AVPlayer 运行时无法滑动 UIScrollView

iOS + Swift,如何访问所有音乐文件