Генерування місцевості на GPU


9

У своєму двигуні я створюю нескінченну місцевість із використанням алгоритму шуму Perlin, обчисленого на процесорі.

Створення місцевості відбувається так:

  • Якщо камера майже не завантажена, виправте її
  • Обчисліть масив шуму 513x513 із заданими межами
  • Обчисліть норми, дотичні, бінормальні, показники
  • Передати дані vbo

Плюси:

  • Потрібно надавати лише у разі потреби
  • Легко здійснити зіткнення

Кон

  • Повільні 64 патчі 513x513 створені за 3,1s (одна нитка). Для кожної плитки ~ 20 мс створення шуму, ~ 25 м вершин, нормалі, дотична, бітангенс, індекси. Коли камера рухається швидко, користувач може помітити завантаження плитки.
  • пам'ять споживає ???

Тепер мені було цікаво, як це прискорити, повністю генеруючи місцевість на GPU, але є деякі сумніви:

  • Якщо шейдери запускають кожен кадр, чи не є ця обчислювальна потужність для обчислення шуму знову і знову? Цього можна уникнути, записавши результат у текстуру RBGA і використовувати згодом у вершинній шейдері для переміщення, але збільшити використання пам'яті. З іншого боку, якщо створення було б дуже швидким, в пам'яті повинні залишатися лише видимі плитки. Однак від'єднання буфера викликає синхронізацію gpu-cpu, що може сповільнити додаток (я прав?)
  • Якщо місцевість - це просто плоска сітка, зміщена вершинним шейдером, таку ж роботу потрібно виконати і на процесорі, щоб обчислити висоту і нормальну для даної точки зіткнення.
  • Це просто концепція, але щоб прискорити все, я замислювався над проекцією сітки на вікно перегляду, тому використовується лише мінімальна кількість вершин. Як ви думаєте, це спрацювало б?

Моє остаточне питання:

Яка найкраща / найшвидша / широко використовується техніка для створення нескінченної місцевості на GPU?


8
Зауважте лише, що створення місцевості на GPU ускладнить виявлення зіткнень, виявлення вибору або майже будь-яку взаємодію з місцевістю.
MichaelHouse

1
Для генерації рельєфу на GPU може використовуватися обчислювальний шейдер (DX10 або 11). Але, як заявив Byte56, вам потрібно буде витягнути значення назад з GPU, щоб взаємодіяти з ним. msdn.microsoft.com/en-us/library/windows/desktop/…
UnderscoreZero

створення місцевості на GPU виглядає як погана ідея для мене. Це може спрацювати, але я думаю, що це, ймовірно, буде працювати трохи краще, якщо ви просто генеруєте місцевість на стороні процесора та надсилаєте стандартний матеріал для малювання в GPU.
Бенджамін Дангер Джонсон

Просто мій досвід; Я насправді робив саме це з aparapi і насправді дістав прокляту справу; але це насправді було повільніше, ніж просто мати процесор, щоб виконати роботу. Я думаю, що через накладні витрати на передачу даних в / з gpu. Якщо я правильно пам'ятаю, gpu реально працює, лише якщо обчислення велике порівняно з розміром даних (а також великим в абсолютних показниках)
Річард Тінгл

Ця стаття може дати вам ідеї http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Ієремія Леслі

Відповіді:


2

Добре, якби я намагався використовувати GPU для подібної речі, я думаю, я б пішов на compute / opencl / cuda.

Однак незалежно від використання графічного процесора або процесора (що саме я і роблю), я би робив це асинхронно, і вирішити, що вам потрібна нова місцевість для поточного кадру, швидше за все, пізно (наприклад, врахуйте 1000 мс / 60 = 16,666 мс, і весь кадр хоче вписатись у це).

Почніть генерувати (або завантажувати з стислих файлів) місцевість на робочу нитку, і зробіть її доступною для решти гри та візуалізації після того, як робітник закінчить, як правило, це буде наступний кадр або, можливо, кадр після цього, так що Користувач насправді не помітить різницю там, але це робить більш гладкими.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.