首页 文章

金属中的二次渲染 - 这很容易吗?

提问于
浏览
2

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

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

我想使用不同的纹理覆盖第一个绘图过程和另一个绘图过程 . 我对于必须执行加载/存储操作等问题感到非常紧张 . 唉,不 - 下面是我在Swift的渲染循环中所做的 . 我应该说,覆盖层中的绘图量消失的次数少于第一遍中的5% .

这有效 . Is it really just this easy?

我只是有这种唠叨的感觉,我错过了一些东西 . 另一方面,我可能错误地认为只有一个机会在渲染循环中,比如说,设置渲染编码器的顶点缓冲区 .

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

1 回答

  • 3

    它在任何时候都是一个"set"方法,并做一些绘图 . 您仅限于每个编码器一次绘制,甚至一次绘制配置 . 在渲染命令编码器的生命周期中唯一固定的东西是用于创建它的渲染过程描述符描述的属性 .

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

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

相关问题