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

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

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

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

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

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

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

Мне кажется, что решение Three.LOD() не имеет смысла, так как оно дает тот же сбой fps, что и мое наивное решение.

Был бы признателен за некоторые рекомендации, однако общие. Ура!

1 ответ

Решение

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

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

Затем установите drawRange собственность вашего BufferGeometry визуализировать лица LOD, которые вы хотите.

geometry.setDrawRange( startIndex, count );

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

three.js r.75

Другие вопросы по тегам