Производительность / конвейер 3D-рендеринга для сеток с уровнем детализации (LOD) в threejs

Просто ищу какое-то общее руководство, прошло очень много времени с тех пор, как я возился с чем-то 3D, и ландшафт сильно изменился, если вы простите за ужасный каламбур.

У меня есть ряд высокодетализированных 3D-моделей (более 3 миллионов лиц в каждой), созданных на основе реальных сканирований местности, которые необходимо отобразить в браузере. Они «нерегулярны» и не могут быть визуализированы из сетки / матрицы высот или чего-либо еще.

Я разделил модели на более мелкие объекты и сгенерировал LOD для каждого объекта (3 уровня), который создает общий набор вершин и три индексных буфера, ссылающихся на некоторые или все вершины, которые я постепенно передаю JS-клиенту.

Я собираюсь рендерить где-то между 500 тыс. - 1 млн полигонов в кадре, задав LOD для каждого объекта в зависимости от расстояния от камеры.

Итак, мой вопрос: как мне эффективно переключаться между этими уровнями?

Я пробовал наивный подход, который, естественно, вызывает удары и сбои в частоте кадров при отправке данных на графический процессор. Но я искал способ отправить все данные (вершины и три индексных буфера) в память графического процессора, а затем сказать ему выполнить рендеринг с конкретным индексным буфером, скажем, с низким разрешением, а затем переключиться на средний или высокий res буфер по мере приближения камеры.

Решение Three.LOD (), похоже, бесполезно для меня, поскольку оно просто дает тот же сбой fps, что и мое наивное решение.

Был бы признателен за некоторые рекомендации, хотя и общие. Ваше здоровье!


person Alan MacLeod    schedule 14.04.2016    source источник


Ответы (1)


Вы хотите эффективно и плавно изменять уровень детализации (LOD) вашего объекта в зависимости от расстояния от камеры.

С учетом вашего варианта использования одно из решений - создать для каждого объекта BufferGeometry, содержащий все три уровня детализации. Другими словами, вы должны использовать «индексированную» геометрию буфера, указать массив общих вершин и объединить ваши три индексных массива в один.

Затем установите свойство drawRange вашего BufferGeometry для рендеринга лиц того LOD, который вам нужен.

geometry.setDrawRange( startIndex, count );

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

three.js r.75

person WestLangley    schedule 14.04.2016
comment
Спасибо. Это примерно то, о чем я думал, концептуально, однако этот метод, похоже, устарел из API Three.js. Я не совсем понимаю, что такое современный эквивалент, какие-нибудь идеи? - person Alan MacLeod; 14.04.2016
comment
Спасибо, мне потребовалось несколько дней, чтобы попытаться это сделать, но, похоже, это помогло. ваше здоровье! - person Alan MacLeod; 20.04.2016
comment
Алан, у меня такая же проблема. Не могли бы вы поделиться кодом? - person Dino; 12.04.2017