Я пишу графический движок на металле и использую буфер трафарета, чтобы маскировать объемы, покрытые сферическими гармоническими огнями в сцене.Для этого я использую два шейдера, и мне нужно 3 вызова отрисовки на источник света: один для задних граней, другой для лицевых граней и окончательный вызов отрисовки с другим шейдером для фактического рендеринга источника света.
НоЕсли я хорошо понимаю документацию по Metal, вам нужно определить все ваши проходы «статически», то есть вам нужен отдельный кодировщик команд рендеринга для каждого используемого вами шейдера и конфигураций рендеринга поверхностей.Это правильно?
Это означает, что я закончил тем, что создал этот цикл для своих источников света, который кажется ужасным, потому что я создаю много кодеров,
for l in shLights {
let descStencil = createLightAccumulationRenderPass()
guard let encoderStencil = commandBuffer.makeRenderCommandEncoder(descriptor: descStencil) else {
continue
}
drawSHLightStencil(l, encoder: encoderStencil)
encoderStencil.endEncoding()
let descColor = createLightAccumulationRenderPass()
guard let encoderColor = commandBuffer.makeRenderCommandEncoder(descriptor: descColor) else {
continue
}
drawSHLight(l, encoder: encoderColor)
encoderColor.endEncoding()
}
Полный код здесь: https://github.com/endavid/VidEngine/blob/master/VidFramework/VidFramework/sdk/gfx/plugins/DeferredLightingPlugin.swift (drawSHLights
функция)
И если вам нужно больше контекста о том, как это используется, пожалуйста, проверьте этот блог: http://endavid.com/index.php?entry=85
Я также попытался повторно использоватькодировщики, но если вы не вызываете endEncoding
, Металл падает при следующем вызове makeRenderCommandEncoder
.
Возможно ли объединить эти кодировщики каким-либо образом?
Редактировать: IЯ сделал снимок с графического процессора, чтобы было легче увидеть весь конвейер рендеринга.Вот скриншот:
![GPU capture](https://i.stack.imgur.com/KEsOf.png)
Это довольно маленький, но я поместил несколько ярлыков сверху.Белые метки соответствуют материалу в цикле.В сцене есть 3 источника света, и они освещают 3 сферы.