【问题标题】:Second-pass rendering in Metal -- is it this easy?Metal 中的第二遍渲染——就这么简单吗?
【发布时间】:2017-12-05 23:38:10
【问题描述】:

我是 Metal 新手,我很困惑......

我有一组顶点,我正在从主纹理中“平铺”出来。我同时使用顶点着色器和片段采样着色器来执行此操作。

我想在第一个绘图过程中使用不同的纹理覆盖另一个绘图过程。我对必须执行加载/存储操作等感到压力很大。唉,不——下面是我在 Swift 的渲染循环中所做的。我应该说,覆盖中的绘制量在第一遍中消除了不到 5%。

这行得通。 真的就这么简单吗?

我只是有一种唠叨的感觉,我错过了一些东西。另一方面,我可能有一种错误的印象,即在渲染循环中只有一次机会,比如设置渲染编码器的顶点缓冲区。

let renderEncoder : MTLRenderCommandEncoder = (commandBuffer?.makeRenderCommandEncoder(descriptor: renderPassDescriptor!))!
renderEncoder.label = "MyRenderEncoder"

renderEncoder.setViewport(MTLViewport.init(originX: 0.0, originY: 0.0, width:  Double(self.drawableSize.width), height: Double(self.drawableSize.height), znear: -1.0, zfar: 1.0))
renderEncoder.setRenderPipelineState(self.pipelineState)

// draw main content
let vertices = ...
let vCount = vertices?.count
let vSize = vCount!*MemoryLayout.size(ofValue: vertices?[0])
let mBuff = self.device!.makeBuffer(bytes: vertices!, length: vSize, options: [])
renderEncoder.setVertexBuffer(mBuff, offset: 0, at: 0)
renderEncoder.setVertexBytes(&self.viewportSize, length: MemoryLayout.size(ofValue: self.viewportSize), at: 1)
renderEncoder.setFragmentTexture(inputTexture, at: 0)
renderEncoder.drawPrimitives(type: MTLPrimitiveType.triangle, vertexStart: 0, vertexCount: vCount!)

// draw overlaying content
let vertices2 = ...
let vCount2 = vertices2?.count
let vSize2 = vCount2!*MemoryLayout.size(ofValue: vertices2?[0])
let mBuff2 = self.device!.makeBuffer(bytes: vertices2!, length: vSize2, options: [])
renderEncoder.setVertexBuffer(mBuff2, offset: 0, at: 0)
renderEncoder.setVertexBytes(&self.viewportSize, length: MemoryLayout.size(ofValue: self.viewportSize), at: 1)
renderEncoder.setFragmentTexture(inputTexture2, at: 0)
renderEncoder.drawPrimitives(type: MTLPrimitiveType.triangle, vertexStart: 0, vertexCount: vCount2!)

// done drawing
renderEncoder.endEncoding()
commandBuffer?.present(view.currentDrawable!)
commandBuffer?.commit()

【问题讨论】:

    标签: swift metal


    【解决方案1】:

    目前尚不清楚您担心的是哪一部分,但是,是的,这很有效。您可以更改渲染命令编码器的任何属性,在任何时候都有“设置”方法,并进行更多绘图。您仅限于每个编码器一次绘制,甚至也不是一次绘制配置。在渲染命令编码器的生命周期内唯一固定的是您用于创建它的渲染通道描述符所描述的属性。

    您甚至可以更改使用的渲染管道状态。但是,请记住,渲染通道描述符是固定的,并且渲染管道状态的附件像素格式必须与渲染通道描述符的附件纹理匹配。

    当然,如果需要,您可以使用多个命令编码器,并且设置加载和存储操作真的不难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2015-03-14
      相关资源
      最近更新 更多