Вопрос
Можно ли сказать OpenSceneGraph использовать Z-буфер, но не обновлять его при рисовании полупрозрачных объектов?
Мотивация
При рисовании полупрозрачных объектовважен порядок, в котором они нарисованы, поскольку видимые поверхности могут быть закрыты, если они нарисованы в неправильном порядке.В некоторых случаях собственная интуиция OpenSceneGraph о порядке, в котором объекты должны быть нарисованы, не срабатывает - полупрозрачные поверхности перекрываются другими полупрозрачными поверхностями, и может возникать «всплывающее» (если это слово можно использовать таким образом), когда OSG считает, чтопорядок расстояния центров объектов до камеры изменился и решает изменить порядок рендеринга.Поэтому возникает необходимость вручную управлять порядком рендеринга полупрозрачных объектов путем ручного указания бина рендеринга для каждого объекта с использованием метода setRenderBinDetails
в наборе состояний.
Однако это также может не всегда работать, так какв общем случае невозможно выбрать порядок рендеринга для объектов (даже если отдельные треугольники в сцене были упорядочены) так, что все фрагменты нарисованы правильно (см., например, задачу художника ), иможно все еще получить окклюзию.Альтернативой является использование глубинного пилинга или другого метода, не зависящего от порядка прозрачности , но, честно говоря, я не знаю, насколько это сложно реализовать в OpenSceneGraph или насколько это замедлитприложение закрыто.
В моем случае, в качестве компромисса между эстетичностью и алгоритмической сложностью и скоростью, в идеале я бы всегда хотел нарисовать фрагмент полупрозрачной поверхности, даже если другой фрагмент другого полу-прозрачная поверхность, которая (в этом пикселе) ближе к камере, уже нарисована.Это предотвратит выталкивание и окклюзию полупрозрачных поверхностей другими полупрозрачными поверхностями и будет эффективно достигнуто, если - для каждого полупрозрачного объекта, который был визуализирован, Z-буфер используется для проверки видимости, но не обновляетсякогда фрагмент был нарисован.