Вопрос или проблема
Я работаю с комплексной анатомической моделью человеческого тела, которая состоит примерно из 5000 отдельных мешей (костей, вен, органов и т.д.). Чтобы оптимизировать рендеринг, я объединил большие секции (например, все кости, все вены) в единые меши. Мне всё ещё нужно взаимодействовать с отдельными частями, поэтому я оставил неслившиеся меши для обнаружения столкновений во время трассировки лучей. Эта настройка позволяет мне кликать по слитой модели и получать правильную часть тела в консоли.
Ранее у меня была настройка с отдельными мешами, где я записывал в пользовательский буфер глубины, чтобы выделить выбранные части, следуя этому уроку, и это работало отлично.
Теперь я попытался совместить оба подхода — выделять отдельные части, отображая слитую модель. Однако это привело к тому, что “меш выбора” рендерился поверх слитой модели. Чтобы это исправить, я отключил меш выбора от основного прохода сцены, но тогда меш выбора стал черным и все равно оставался довольно затратным для рендеринга. С положительной стороны, выделение работало.
Чтобы улучшить FPS, я сделал меш выбора совершенно прозрачным. Производительность значительно улучшилась, и я все еще мог кликать и получать правильное пересечение, но выделение больше не работало.
Может кто-то помочь мне разобраться, как снова запустить выделение, не теряя прирост производительности?
Ответ или решение
Чтобы сделать actor (актер) невидимым, но при этом записывать его в пользовательский буфер глубины, можно использовать несколько подходов, которые помогут решить вашу задачу. Я опишу шаги, которые помогут вам оптимизировать рендеринг и восстановить функциональность подчеркивания выделенных частей модели.
1. Настройка материалов для невидимости
Первым шагом является создание специального материала для вашего "picker mesh" (сетки выбора), который будет невидимым для основного рендеринга, но будет записывать информацию в буфер глубины.
- Создайте новый материал, который будет с использованием
blend mode
настроен наOpaque
(непрозрачный). - Убедитесь, что у материала отключена визуализация (например, с помощью
SetVisibility(false)
), но сохранили возможность записи в буфер глубины.
2. Настройка рендеринговых проходов
Обратите внимание на настройки рендеринга. Вам нужно добиться того, чтобы ваша сетка выбора рендерилась на одном из проходов, который поддерживает запись в буфер глубины:
- Используйте
Custom Depth Stencil
для настройки вашего "picker mesh". Вам нужно будет включить запись вCustom Depth
в его компонентах. - Для этого в свойствах вашего актера установите флаг
Render Custom Depth
вtrue
.
3. Использование разных буферов для выделения
Если вам нужно выделять части вашей модели, вы можете использовать Custom Depth Buffer
для осуществления выделений:
- Включите запись в пользовательский буфер глубины в вашем материале так, чтобы выделяемые части записывались по другому значению глубины, чем остальные. Это позволит вам отличать выделенные части от обычных при помощи материала.
4. Реализация выделения
При выделении объектов вы можете использовать простой алгоритм для проверки, попали ли вы в область выборки:
- После попадания в
picker mesh
, убедитесь, что вы используете методHitTest
или аналогичный для получения информации о нажатом объекте на основе значения в пользовательском буфере глубины.
5. Оптимизация производительности
Для улучшения производительности:
- Убедитесь, что все ненужные детали вашей модели не рендерятся, если они не нужны для сценария. Например, можно отключить рендеринг мешей для частей модели, которые не находятся в поле зрения камеры.
- Вы можете использовать
LOD (Level of Detail)
для оптимизации рендеринговых затрат. Если детали не видны издалека, можно использовать менее детализированные модели.
Заключение
Эти шаги помогут вам создать систему, где ваш "picker mesh" не будет видим, но при этом его информация будет записываться в пользовательский буфер глубины. Это восстанавливает функциональность выделения, сохраняя при этом высокую производительность рендеринга, что особенно важно при работе с такими сложными моделями, как ваше анатомическое представление.