【问题标题】:Renderpass Descriptor in MetalMetal中的渲染通道描述符
【发布时间】:2019-01-09 12:34:47
【问题描述】:

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

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

我想将输出纹理传递给另一个渲染通道描述符来处理它的颜色,这也类似于离屏渲染。这里将提供新的输出纹理

我想在屏幕上显示新的输出纹理。是否可以 ?当我创建三个渲染通道描述符时,只有两个可用。

第一次离屏渲染效果很好

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

此渲染通道描述符在 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()

第三个渲染通道描述符工作正常。

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

【问题讨论】:

    标签: ios swift metal metalkit


    【解决方案1】:

    MTLRenderPassDescriptor 对象的创建成本很低,这与 Metal 中的一些其他类型的对象(例如管道状态对象)不同。您需要随时创建描述符。您不需要长时间保留它们。每次您要创建渲染命令编码器时,只需重新创建它们。例如,每帧创建多个渲染通道描述符是完全正常的。您可以创建的数量没有具体限制。

    我不知道“当我创建三个渲染通道描述符时只有两个可用”和“此渲染通道描述符在调试中不可用”是什么意思。这些句子中的“可用”是什么意思?准确解释您想要和期望的结果,以及实际发生的与此不同的结果。

    【讨论】:

    • imgur.com/gallery/hu4UzRS 。在代码中您可以看到我创建了三个渲染命令编码器,但在调试会话中它在图像中显示为两个。中间一个不见了
    • 很难判断你在用命令缓冲区做什么。您的三个代码 sn-ps 各使用一个,但其中两个显示创建单独的代码,第三个显示提交其中一个。我怀疑你没有提交其中之一。
    • 是否可以为所有命令编码器保持相同的命令缓冲区?
    • 是的,没关系。在某些情况下,您可能希望为单个帧创建和提交多个缓冲区,但您现在可以忽略它。
    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 2011-11-19
    • 2020-12-21
    • 2021-09-05
    • 2011-11-22
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多