У своєму двигуні я створюю нескінченну місцевість із використанням алгоритму шуму Perlin, обчисленого на процесорі.
Створення місцевості відбувається так:
- Якщо камера майже не завантажена, виправте її
- Обчисліть масив шуму 513x513 із заданими межами
- Обчисліть норми, дотичні, бінормальні, показники
- Передати дані vbo
Плюси:
- Потрібно надавати лише у разі потреби
- Легко здійснити зіткнення
Кон
- Повільні 64 патчі 513x513 створені за 3,1s (одна нитка). Для кожної плитки ~ 20 мс створення шуму, ~ 25 м вершин, нормалі, дотична, бітангенс, індекси. Коли камера рухається швидко, користувач може помітити завантаження плитки.
- пам'ять споживає ???
Тепер мені було цікаво, як це прискорити, повністю генеруючи місцевість на GPU, але є деякі сумніви:
- Якщо шейдери запускають кожен кадр, чи не є ця обчислювальна потужність для обчислення шуму знову і знову? Цього можна уникнути, записавши результат у текстуру RBGA і використовувати згодом у вершинній шейдері для переміщення, але збільшити використання пам'яті. З іншого боку, якщо створення було б дуже швидким, в пам'яті повинні залишатися лише видимі плитки. Однак від'єднання буфера викликає синхронізацію gpu-cpu, що може сповільнити додаток (я прав?)
- Якщо місцевість - це просто плоска сітка, зміщена вершинним шейдером, таку ж роботу потрібно виконати і на процесорі, щоб обчислити висоту і нормальну для даної точки зіткнення.
- Це просто концепція, але щоб прискорити все, я замислювався над проекцією сітки на вікно перегляду, тому використовується лише мінімальна кількість вершин. Як ви думаєте, це спрацювало б?
Моє остаточне питання:
Яка найкраща / найшвидша / широко використовується техніка для створення нескінченної місцевості на GPU?