tgoop.com/unity_cg/48214
Last Update:
В Unity есть возможность Indirect рендеринга: Graphics.RenderMeshIndirect
Начну чуть издалека.
Что есть дроуколл?
Это запуск GPU пайплайна по неким параметрам.
Вот вспомните ту самую картинку, которую вы видели: вертексный шейдер -> геометрический -> .... -> фрагментный
Для дроуколла надо выставить эти параметры:
-переключатели на гпу для НЕпрограммируемых stages
-программы для программируемых
-забиндить буферы и прочие ресурсы
Основные буферы - это вертексный (позиции) и индексный (индексы вертексов).
Индексный буфер опционален, но важен для оптимизации, т.к. многие вертексы повторяются в разных треугольниках и для них нам не надо уже перевычислять позицию и вертексы можно упорядочить не по порядку как они в треугольнике располагаются, а оптимальным для производительности способом.
Что есть инстансинг?
это когда мы не делаем новые дроуколлы, а просто перезапускаем пайплайн X раз в рамках одного дк.
Для каждого перезапуска пайплайна мы просто меняем SV_InstanceID (видеокарта сама его меняет) - SV_InstanceID от 0 до X.
Мы не перебиндиваем ничего и не ждём команд от цпу - поэтому инстансинг очень быстрый.
Что есть индирект?
это когда количество запусков пайплайна, количество вертексов и индексы для них задаются не напрямую - с цпу, а так же рассчитываются на гпу - в компьют шейдере.
Но в рамках одного вызова, даже вызова индирект - мы не можем забиндить разные индексные оффсеты.
(p.s. схожим образом, кстати, работают Task и Mesh шейдера)
Что есть MDI?
Это когда гпу может сама решить сколько вызовов indirect ей нужно.
И не только запустить несколько вызовов пайплайна, но и индексные оффсеты сопоставить на разных вызовах самостоятельно.
Для этого гпу помимо номера инстанса - SV_InstanceID знает и номер текущей отрисовки.
MDI не на всех апи поддерживается, на некоторых реализации отличаются, на других делается фоллбэк, а на третьих вообще его нет.
Метод Graphics.RenderMeshIndirect позволяет рисовать MDI там где это поддерживается и делает серию обычных Indirect вызовов там, где MDI не поддерживается.
Однако, как показали тесты, семантика SV_DrawID
поддерживается не везде =(
BY WellMOR in Unity CG Tech
Share with your friend now:
tgoop.com/unity_cg/48214