Дескриптор рендеринга в металле - PullRequest
0 голосов
/ 09 января 2019

Я новичок в металле. Сколько MTLRenderpassdescriptor мы можем создать в одном приложении с любым лимитом?

Я хочу иметь три MTLRenderpassdescriptor, это возможно. Один мне нужно нарисовать четверки в соответствии с положением пальца. Это как закадровый рендеринг. Будет вывод текстуры.

Я хочу передать выходную текстуру другому дескриптору renderpass, чтобы обработать его цвет, который также похож на Offscreen Rendering. Здесь будет доступна новая выходная текстура

Я хочу представить новую выходную текстуру на экране. Является ли это возможным ? Когда я создаю три дескриптора 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()

Третий дескриптор рендеринга работает нормально.

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 голосов
/ 09 января 2019

MTLRenderPassDescriptor объекты дешевы в создании, в отличие от некоторых других типов объектов в Metal (например, объекты состояния конвейера). Вы должны создавать дескрипторы в любое время, когда они вам нужны. Вам не нужно хранить их в течение длительного периода времени. Просто воссоздайте их каждый раз, когда вы собираетесь создать кодировщик команды рендеринга. Например, создание нескольких дескрипторов прохода рендеринга на кадр вполне нормально. Нет конкретного ограничения на число, которое вы можете создать.

Я понятия не имею, что вы подразумеваете под "Когда я создаю три дескриптора renderpass, доступно только два" и "Этот дескриптор renderpass недоступен в Debug". Что вы подразумеваете под «доступным» в этих предложениях? Точно объясните, каких результатов вы хотите и ожидаете, и что происходит на самом деле, иное.

...