Metal 中的 Renderpass 描述符
Renderpass Descriptor in Metal
我是 Metal 的新手。我们可以在单个应用程序中创建多少个 MTLRenderpassdescriptor(任意限制)?
我想要三个MTLRenderpassdescriptor 可以吗。一个我需要根据手指位置绘制四边形。这就像离屏渲染。会有贴图输出。
我想将输出纹理传递给另一个 renderpass 描述符来处理它的颜色,这也类似于 Offscreen Rendering.Here 新的输出纹理将可用
我想在屏幕上显示新的输出纹理。可能吗 ?当我创建三个 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 描述符在调试中也不可用。
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()
MTLRenderPassDescriptor
对象的创建成本很低,这与 Metal 中的某些其他类型的对象(例如管道状态对象)不同。您应该在需要时随时创建描述符。您不需要将它们保存很长时间。每次您要创建渲染命令编码器时,只需重新创建它们。例如,每帧创建多个渲染通道描述符是完全正常的。您可以创建的数量没有具体限制。
我不知道你所说的 "When I create three renderpass descriptors only two is available" 和 "This renderpass descriptor is not available in Debug" 是什么意思。这些句子中的 "available" 是什么意思?准确解释您想要和期望的结果,以及实际发生的与此不同的情况。
我是 Metal 的新手。我们可以在单个应用程序中创建多少个 MTLRenderpassdescriptor(任意限制)?
我想要三个MTLRenderpassdescriptor 可以吗。一个我需要根据手指位置绘制四边形。这就像离屏渲染。会有贴图输出。
我想将输出纹理传递给另一个 renderpass 描述符来处理它的颜色,这也类似于 Offscreen Rendering.Here 新的输出纹理将可用
我想在屏幕上显示新的输出纹理。可能吗 ?当我创建三个 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 描述符在调试中也不可用。
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()
MTLRenderPassDescriptor
对象的创建成本很低,这与 Metal 中的某些其他类型的对象(例如管道状态对象)不同。您应该在需要时随时创建描述符。您不需要将它们保存很长时间。每次您要创建渲染命令编码器时,只需重新创建它们。例如,每帧创建多个渲染通道描述符是完全正常的。您可以创建的数量没有具体限制。
我不知道你所说的 "When I create three renderpass descriptors only two is available" 和 "This renderpass descriptor is not available in Debug" 是什么意思。这些句子中的 "available" 是什么意思?准确解释您想要和期望的结果,以及实际发生的与此不同的情况。