Об’єднання геометрії / сітки без втрати переваг


11

У Three.js ми можемо просто об'єднати геометрію, щоб обмежити кількість дзвінків на розіграш і таким чином збільшити продуктивність. У простому тесті з одним матеріалом я міг намалювати 50 000 кубів + тіні @ 60 кадрів в секунду на моєму графічному графіку GTX660. Без злиття геометрії 5000 кубів вже спричинили проблему.

Цікаво, як зберегти переваги надання кожної кубикової сітки самостійно. Наприклад, як вибрати кубикову сітку, коли все об’єднано в одну геометрію? За замовчуванням це, звичайно, неможливо.

Чи є якась загальна техніка цієї проблеми? Зрештою, у мене всі об'єкти без зануреної сітки навіть після злиття. Тож повинен бути якийсь спосіб використовувати їх для збирання?

Що я хочу зробити в двох словах

  • SimCity любить гру для навчальних цілей
  • Кожен будинок - кубикова сітка
  • Хочете зробити 50 000 будинків і зможете додавати та видаляти будинки
  • Вибір будинку за допомогою курсору миші (вибір) повинен бути можливим

Я не впевнений, чи вам це корисно, але я згадую це для повноти. Simplygon має модель ціноутворення на основі роялті для інді-розробників і може зробити багато з цього об'єднання та розділення сітки на час проектування.
steeveeet

Відповіді:


11

Добре. Я зрозумів. Після об'єднання всієї геометрії разом я все ще маю окремі сітки в масиві. Тому я можу просто використовувати ці сітки для радіомовлення, навіть якщо вони навіть не відображаються. Мені знадобилося деякий час, щоб зрозуміти це.

введіть тут опис зображення

Для вибору я використовую цю реалізацію octree: http://threejs.org/examples/#webgl_octree_raycasting

Це знижує тести перетину за оновлення з 50 000 до ~ 500. Без октриси частота кадрів в секунду сильно зменшиться.

Помаранчевий корпус вибору, який ви бачите, - це насправді тепер винесена сітка (+1 виклик) із зміненим матеріалом та зміненим розміром.

введіть тут опис зображення

Тому я думаю, що наступним кроком є ​​реалізація якогось поділу карти. Тобто розбийте об’єднану геометрію на кілька частин. Причиною цього є те, що об’єднана геометрія має велику кількість вершин. Це означає, що якщо я переміщу карту на 99% з екрана, відеокарті все одно доведеться обробляти всі вершини, оскільки геометрія все ще переглядається, принаймні 1% її. Тож якщо вона розбита, потрібно винести лише ті деталі, які переглядаються.


Дуже дякую за це розуміння. Я також намагався знайти спосіб це зробити, і я думаю, що ваше рішення тут є найкращим! Хоча швидке запитання: для вашого локального списку об'єктів (тобто Three.Object3D), які властивості потрібні для роботи rayCaster.intersectObjects ()?
AlvinfromDiaspar

Дуже красиво зроблено.
ClassicThunder

У мене є аналогічна проблема, але якимось чином не можу отримати роботу з радіомовленням з r70. Ви робили щось особливе під час створення та об’єднання ящиків? Я використовую наступний код ( pastebin.com/PStaAF3P ), щоб створити та об'єднати вузли, але, можливо, щось не вистачає для того, щоб зловмисник працював?
fhahn

Швидке запитання: я роблю щось з вами дуже схоже (3d карта на основі даних geoJSON). З вашим методом, коли ви обертаєте камеру, вам також потрібно обертати наявні будівельні сітки? Або ви просто додаєте окремі скриньки на сцену, але не показуєте їх?
Спенсер

@Spencer Не потрібно обертатись. Я зберігаю окремі поля в глобальному масиві і лише додаю об’єднану геометрію до сцени. Потім ви можете робити радіомовлення з об'єктом у глобальному масиві, оскільки райкастер залежить від матриці камери та кожного положення поля. Швидше за все, не найкращим способом, це було для мене лише доказом концепції. У цей момент більше не робиться три.js.
user990827

1

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

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


0

Я не впевнений у деталях three.js, але два можливі вивіски про продуктивність приходять до тями в цілому OpenGL:

  1. Ви розглядали примірник? Вам також знадобиться лише один дзвінок дзвінка і використовувати менше VRAM.
  2. Ви серйозно поставилися до алгоритму збору? Якщо у ваших кубів є обмежуючі обсяги у списку замість дерева, наприклад, це пояснить різницю такої величини.

0

Ще один підхід, який ви можете скористатися, - це побудувати деякий атрибут вершини у вашій геометрії та ввести логіку виділення у ваш фрагмент шейдер. Це надзвичайно корисно, коли ви не хочете мати дві копії даних у пам’яті, і ви матимете більше контролю над тим, як реалізується підсвітка.

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