GL_POINTS скрывают друг друга при моделировании частиц

У меня есть симуляция огня, содержащая большое количество текстурированных GL_POINTS. Каждая частица имеет прозрачный фон, и при взгляде на огонь под определенными углами смешивание работает корректно. Однако при просмотре под другими углами видно, что фон, который должен быть прозрачным, скрывает частицы, отрисовываемые позади других. См. рисунок ниже.

введите здесь описание изображения

Как видите, на пути частицы оказывается много черных ящиков. Как я могу этого избежать? Функция смешивания, которую я использую, это GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA. Использование GL_ONE в качестве второго аргумента для glBlendFunc дает очень похожие результаты.


person Fitzy    schedule 16.09.2014    source источник
comment
Аналогично stackoverflow.com/q/23280692/3530129. Могут быть разные соображения, поскольку речь идет о системе частиц, а не просто об общем рендеринге с прозрачными текстурами. Поэтому я не уверен, что это должен быть дубликат.   -  person Reto Koradi    schedule 16.09.2014
comment
отключить буфер глубины   -  person BeyelerStudios    schedule 16.09.2014
comment
@BeyelerStudios, просто отключив тест глубины, решает проблему перекрывающихся фонов, но создает проблемы с прозрачностью в других частях текстуры.   -  person Fitzy    schedule 16.09.2014
comment
Возможно, вам придется отсортировать частицы и визуализировать их в правильном порядке, то есть сзади наперед.   -  person Gigo    schedule 16.09.2014
comment
для светоизлучающих частиц попробуйте аддитивное смешивание. Есть несколько приемов, которые вам нужно знать для получения хороших эффектов частиц. Я предполагаю, что вы собираетесь использовать эффект огня: проверьте здесь   -  person BeyelerStudios    schedule 16.09.2014
comment
@BeyelerStudios то, что было сделано в этом вопросе, кажется довольно длительным процессом, кажется, что было бы более простое решение, особенно с учетом того, что я рисую точки только на черном фоне. Простое использование аддитивного смешивания дает результаты, подобные картинке, которую я привел выше.   -  person Fitzy    schedule 16.09.2014
comment
звучит как ошибка для меня. начните сокращать свой код до mcve: очистите фон, нарисуйте две частицы, частично перекрывающие друг друга. сравните свой текущий подход к рисованию двух четырехугольников с использованием вашей текстуры. увидеть, какой результат вы ожидали.   -  person BeyelerStudios    schedule 16.09.2014
comment
Рето Коради прав, большинство этих методов можно использовать и для систем частиц. Другой подход, не упомянутый в этой ветке, — предварительно умноженная альфа, как описано здесь: blogs.msdn.com/b/shawnhar/archive/2009/11/06/   -  person StarShine    schedule 17.09.2014


Ответы (1)


http://www.opengl-tutorial.org/intermediate-tutorials/billboards-particles/particles-instancing/#The_main_simulation_loop

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

Однако вы можете избежать сортировки, если действительно хотите. Существуют алгоритмы 3D-прозрачности, которые немного более эффективны. См.: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-10-transparency/#Order_Independent_Transparency

person Joonazan    schedule 15.06.2015