OpenSceneGraph: не обновлять z-буфер при рисовании полупрозрачных объектов - PullRequest
0 голосов
/ 17 октября 2018

Вопрос

Можно ли сказать OpenSceneGraph использовать Z-буфер, но не обновлять его при рисовании полупрозрачных объектов?

Мотивация

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

Однако это также может не всегда работать, так какв общем случае невозможно выбрать порядок рендеринга для объектов (даже если отдельные треугольники в сцене были упорядочены) так, что все фрагменты нарисованы правильно (см., например, задачу художника ), иможно все еще получить окклюзию.Альтернативой является использование глубинного пилинга или другого метода, не зависящего от порядка прозрачности , но, честно говоря, я не знаю, насколько это сложно реализовать в OpenSceneGraph или насколько это замедлитприложение закрыто.

В моем случае, в качестве компромисса между эстетичностью и алгоритмической сложностью и скоростью, в идеале я бы всегда хотел нарисовать фрагмент полупрозрачной поверхности, даже если другой фрагмент другого полу-прозрачная поверхность, которая (в этом пикселе) ближе к камере, уже нарисована.Это предотвратит выталкивание и окклюзию полупрозрачных поверхностей другими полупрозрачными поверхностями и будет эффективно достигнуто, если - для каждого полупрозрачного объекта, который был визуализирован, Z-буфер используется для проверки видимости, но не обновляетсякогда фрагмент был нарисован.

1 Ответ

0 голосов
/ 18 октября 2018

Вы полностью на правильном пути.

Да, можно оставить Z-тест включенным, но отключить Z-запись с помощью setWriteMask() во время рисования:

// Disable Z-writes
osg::ref_ptr<osg::Depth> depth = new osg::Depth;
depth->setWriteMask(false);
myNode->getOrCreateStateSet()->setAttributeAndModes(depth, osg::StateAttribute::ON)

// Enable Z-test (needs to be done after Z-writes are disabled, since the latter
// also seems to disable the Z-test)
myNode->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);

https://www.mail-archive.com/osg-users@openscenegraph.net/msg01119.html

http://public.vrac.iastate.edu/vancegroup/docs/OpenSceneGraphReferenceDocs-2.8/a00206.html#a2cef930c042c5d8cda32803e5e832dae

Вы можете проверить узел узла osgTransparencyTool, который мынесколько лет назад написал для клиента CAD: https://github.com/XenonofArcticus/OSG-Transparency-Tool

Он включает в себя несколько методов прозрачности, которые вы можете протестировать с вашими сценами, и изучить исходную реализацию, в том числе реализацию независимой от заказа реализации прозрачной очистки глубины и отложенной смеси.метод, вдохновленный Open Inventor.Delayed Blend - это высокопроизводительное несортированное однопроходное приближение, которое, вероятно, проверяет все поля, которые вы хотите, если абсолютная точность прозрачности не является наиболее важным критерием.

Вот документ, в котором обсуждаются различные подходы в мучительных деталях, если у вас нет 'читать его: http://lips.informatik.uni -leipzig.de / files / bathesis_cbluemel_digital_0.pdf

...