Чтобы нарисовать меш в традиционном-пайплайне, нужно привязать вершинный буфер. Если двум объектам нужны разные меши, придётся дважды вызвать bind + draw. На сложных сценах для минимизации дроуколлов приходится городить батчинг.
Указатели в шейдерах открывают более эффективные способы работать с вершинами.
Представим, что у нас есть огромный террейн. Его можно поделить на равные части и загрузить каждую из них в отдельный буфер (благодаря арена-аллокатору они будут лежать рядом в памяти). Правило триангуляции у всех частей одинаковое, поэтому индексный буфер нужен только один.
Теперь самое интересное: помимо матрицы в каждый инстанс нужно записать указатель (DeviceAddress: u64) на соответствующий буфер вершин. Указатель на буфер с инстансами можно передать через пуш константы.
Это позволит нарисовать любое количество патчей за один cmdDrawIndexed. А если террейн не просто огромный, а условно-бесконечный, можно легко организовать стриминг (с диска или генерить на лету), ведь патчи лежат в независимых друг от друга буферах.
Никаких дескрипторов, меньше вызовов в драйвер и CPU-процессинга.
Post #435
449

- 🔥 7
- ❤ 1
- 🍓 1
- 🤓 1