Metal中的Renderpass描述符

时间:2019-01-09 12:34:48

标签: ios swift metal metalkit

我是Metal的新手。我们可以在一个应用程序中创建任意限制多少个MTLRenderpassdescriptor?

我想拥有三个MTLRenderpassdescriptor是可能的。我需要根据手指位置绘制四边形。就像离屏渲染一样。将输出纹理。

我想将输出纹理传递给另一个renderpass描述符以处理其颜色,这也类似于“屏幕外渲染”。这里将提供新的输出纹理

我想在屏幕上显示新的输出纹理。可能吗 ?当我创建三个renderpass描述符时,只有两个可用。

第一次屏幕外渲染效果很好

let renderPass = MTLRenderPassDescriptor()

renderPass.colorAttachments[0].texture = ssTexture
renderPass.colorAttachments[0].loadAction = .clear
renderPass.colorAttachments[0].clearColor = MTLClearColorMake(  0.0,  0.0,  0.0,  0.0)
renderPass.colorAttachments[0].storeAction = .store
let commandBuffer = commandQueue.makeCommandBuffer()

var commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: renderPass)
for scene in scenesTool{
    scene.render(commandEncoder: commandEncoder!)
}
commandEncoder?.endEncoding()

此renderpass描述符在Debug中也不可用。

let renderPassWC = MTLRenderPassDescriptor()
renderPassWC.colorAttachments[0].texture = ssCurrentTexture
renderPassWC.colorAttachments[0].loadAction = .clear
renderPassWC.colorAttachments[0].clearColor = MTLClearColorMake(  0.0,  0.0,  0.0,  0.0)
renderPassWC.colorAttachments[0].storeAction = .store

let commandBufferWC = commandQueue.makeCommandBuffer()
let commandEncoderWC = commandBufferWC?.makeRenderCommandEncoder(descriptor: renderPassWC)
for scene in scenesWCTool{
    print(" msbksadbdksabfkasbd")
    scene.render(commandEncoder: commandEncoderWC!)
}

commandEncoderWC?.endEncoding()

第三个Renderpass描述符运行正常。

let descriptor = view.currentRenderPassDescriptor
commandEncoder = commandBuffer?.makeRenderCommandEncoder(descriptor: descriptor!)

for x in canvasTemporaryScenes{
    x.updateCanvas(texture: ssTexture!)
    x.render(commandEncoder: commandEncoder!)
}

commandEncoder?.endEncoding()
guard let drawable = view.currentDrawable else { return }
commandBuffer?.present(drawable)
commandBuffer?.commit()
commandBuffer?.waitUntilCompleted()

1 个答案:

答案 0 :(得分:2)

MTLRenderPassDescriptor对象创建起来很便宜,与Metal中的其他一些对象(例如管道状态对象)不同。您应该在需要时随时创建描述符。您不需要将它们保留很长时间。每当您要创建渲染命令编码器时,只需重新创建它们即可。例如,每帧创建多个渲染过程描述符是完全正常的。您可以创建的数量没有具体限制。

我不知道您的意思是“当我创建三个renderpass描述符时只有两个可用”和“此renderpass描述符在Debug中不可用”。这些句子中的“可用”是什么意思?确切说明您想要和期望的结果以及实际发生的事情与之不同。

相关问题