当前位置: 首页 > 面试题库 >

离屏渲染金属

昝晗昱
2023-03-14
问题内容
 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)。这是进行屏幕外渲染的优化方法

当我仅禁用Metal API验证时,将运行此代码。否则我得到以下问题

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

建议请优化


问题答案:

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



 类似资料:
  • 因为屏幕渲染可在位图中获取浏览器窗口内容,所以它可以呈现在任何地方,例如3D场景中的纹理。 Electron中的屏幕渲染的使用方法与 Chromium Embedded Framework项目类似,都可以使用两种渲染模式,并且只有脏区域在 'paint' 事件中传递才能更有效率。可以停止或继续渲染,还可以设置帧速率。指定的帧速率是上限值,当网页上没有发生任何事情时,不会生成任何帧。最大帧速率为60

  • 离线渲染允许您在位图中获取浏览器窗口的内容,因此可以在任何地方渲染,例如在3D场景中的纹理。 Electron中的离屏渲染使用与 Chromium Embedded Framework 项目类似的方法。 可以使用两种渲染模式,并且只有脏区通过 'paint' 事件才能更高效。 渲染可以停止、继续,并且可以设置帧速率。 指定的帧速率是上限值,当网页上没有发生任何事件时,不会生成任何帧。 最大帧速率是

  • 概览 离屏渲染允许你以位图的方式来获取 BrowserWindow 中的内容,所以它可以在任何地方被渲染,例如在3D场景中的纹理。 Electron中的离屏渲染使用与 Chromium Embedded Framework 项目类似的方法。 注意: 有两种渲染模式可以使用(见下),只有未渲染区域传递到 绘图 事件才能提高效率。 您可以停止/继续渲染并设置帧速率。 最高帧速率为 240,因为更高的值

  • 离屏渲染     当图层属性的混合体被指定为在未预合成之前不能直接在屏幕中绘制时,屏幕外渲染就被唤起了。屏幕外渲染并不意味着软件绘制,但是它意味着图层必须在被显示之前在一个屏幕外上下文中被渲染(不论CPU还是GPU)。图层的以下属性将会触发屏幕外绘制: 圆角(当和maskToBounds一起使用时) 图层蒙板 阴影     屏幕外渲染和我们启用光栅化时相似,除了它并没有像光栅化图层那么消耗大,子图

  • 通过Three.js发开Web3D应用的时候,渲染窗口可能是全屏效果占满web页面整个body区域,也可能是web页面上一个特定位置特定区域,比如渲染区域是一个特定位置、特定宽高的div元素所在区域。 全屏渲染 直接通过Three.js的WebGL渲染器WebGLRenderer的.setSize()方法设置渲染尺寸为浏览器body区域宽高度。 var width = window.innerWi

  • 我正试图通过使用在中显示一个带有QT的Coin3D/Open Inventor场景,我需要帮助将其转换为 到目前为止,我尝试的是将场景渲染到中,并获得如下缓冲区: 然后从缓冲区数据创建一个: 这是正确的方法吗? 正如在这个关于绘制图像的问题中所描述的,如果源是一张图片,我就能够绘制它。 e:为了确保我的缓冲区实际上包含一个场景,我将缓冲区内容写入两个文件。例如,您可以使用Irfan View及其插