2017-07-02 37 views
1

我是新来的金属和我很困惑...金属中的二次渲染 - 这很容易吗?

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

我想叠加第一个绘图通过一个额外的绘图通过使用不同的纹理。我开始强调必须进行加载/存储操作等。唉,没有 - 下面是我在Swift渲染循环中所做的。我应该说覆盖层中的绘图数量不到第一遍中绘制的数量的5%。

This Works。 这真的很简单吗?

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

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

回答

3

这不是真的清楚哪一部分你担心,但是,是的,这工作。您可以更改任何点上有“set”方法的渲染命令编码器的任何属性,并执行一些更多的绘制。你是而不是限于每个编码器一次抽取,甚至一个抽取配置。渲染命令编码器生命周期中唯一固定的东西是用于创建它的渲染过程描述符所描述的属性。

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

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