Загрузка буфера вершин и индексов в GPU

Я создаю движок ландшафта, и в настоящее время я загружаю весь ландшафт VB (буфер вершин) и IB (индексный буфер) в GPU сразу, так как ландшафт невелик. На данный момент это 256x256.

Теперь предположим, что я хочу создать процедурный ландшафт, который использует шум перлина для создания карты высот.

Конечно, я мог бы генерировать «патчи» и загружать все VB и IB патчей сразу в GPU, но поскольку игрок перемещается далеко и необходимо генерировать новые патчи, мне пришлось бы генерировать новые патчи и загружать их на ГПУ. Путаница или проблемы, которые я имею в виду:

  1. Медленно ли загружать VB и IB на GPU? Будет ли игрок замечать мерцание при загрузке данных в графический процессор?

  2. Будет ли производительность лучше, если я буду загружать VB и IB патчей в GPU постепенно, а не все сразу? В основном я спрашиваю, имеет ли значение размер VB и IB.

Любая информация об этой концепции будет принята с благодарностью.

Спасибо!


person Jón Trausti Arason    schedule 09.06.2011    source источник


Ответы (1)


Обычно вы разделяете свою местность на несколько небольших участков, которые вы транслируете по мере движения игрока. В моем движке ландшафта я никогда не помещал индексный буфер в объекты буфера, так как механизм LOD постоянно меняет отрисовываемые вершины и порядок отрисовки для улучшения раннего Z. 256×256 — разумный размер патча, особенно если вы используете структура, подобная quadtrees.

Итак, что вы можете сделать, так это загрузить 9 патчей ландшафта, размер каждого патча выбирается таким образом, чтобы видимый диапазон заканчивался где-то вокруг границ вокруг центрального патча.

   |   |
---+---+---
   | C |
---+---+---
   |   |

Когда игрок перемещается по патчу C, диапазон видимости гарантирует, что он не сможет смотреть дальше загруженной области. Как только игрок перейдет на другой патч, оберните патчи с другой стороны, т.е.

 A |   |
---+---+---
 B | X-> C
---+---+---
 C |   |

переназначит плитки A, B, C на

       |   | A'
    ---+---+---
       ->C | B'
    ---+---+---
       |   | C'

Где A', B', C' повторно используют память A, B, C, но наполняют ее новым содержанием. Поскольку игрок перемещается в новый патч C с дальнего конца, т. е. просто может видеть более близкие части новых патчей, вы можете загружать содержимое A', B', C' в течение нескольких кадров.

Чтобы ответить на ваши два вопроса:

  1. загрузка геометрии на самом деле является довольно быстрым процессом, так что это не мешает шоу. Вы не увидите мерцания, так как загрузка данных происходит между кадрами рендеринга, и только после обновления данных начнутся команды рисования.

  2. То, как вы загружаете материал, не влияет на производительность рендеринга. Однако это влияет на то, сколько времени потребуется для загрузки самой карты. Если вы хотите, чтобы игроки могли путешествовать по большим мирам без раздражающих фаз загрузки между ними, вам придется загружать небольшие патчи по требованию.

person datenwolf    schedule 09.06.2011
comment
Удивительно, я сделаю несколько тестов сегодня вечером и посмотрю, как это работает. Спасибо за очень подробный ответ. Но что касается того, сколько времени требуется для загрузки самой карты, давайте предположим, что VB и IB готовы к загрузке (кэшированы во vram), не будет ли размер VB и IB иметь значение при загрузке на GPU, если VB может быть есть патч с 1000x1000 вершин, тогда я должен заметить шторку, верно? Чем меньше, тем быстрее загружается в GPU? - person Jón Trausti Arason; 09.06.2011
comment
@raRaRa: Что ты имеешь в виду под vram? Оперативная память на видеокарте? Что ж, это ОЗУ графического процессора, и это то, что касается объектов буфера. Если он уже загружен в системную оперативную память: Да, чем он больше, тем больше времени займет загрузка. Но в конечном итоге учитывается общее количество загруженных вершин, и не имеет большого значения, приходят ли они множеством маленьких патчей или одним большим. Если сцена, которую вы визуализируете, требует всех этих визуальных деталей, они должны быть загружены в любом случае, прежде чем что-либо можно будет нарисовать. - person datenwolf; 09.06.2011
comment
Я имею в виду системную память. Но да, я также имею в виду постепенную загрузку множества небольших патчей, а не загрузку всех маленьких сразу. - person Jón Trausti Arason; 09.06.2011
comment
@raRaRa: Постепенная загрузка также известна как потоковая передача, и это довольно обычное дело. Например, так работает Google Earth. Пока вы загружаете/заменяете геометрию, которая находится вне поля зрения, все в порядке. Вы не увидите мерцания, и самое худшее, что может случиться, — это падение частоты кадров. Но пока вы остаетесь около 40 кадров в секунду, никто не заметит, черт возьми, большинство людей не видят слайд-шоу перед своими глазами, пока оно не упадет ниже 20 кадров в секунду. - person datenwolf; 09.06.2011