Java OpenGL буфер глубины сохранения - PullRequest
0 голосов
/ 25 марта 2010

Я не совсем уверен, смогу ли я сделать то, что я хочу, но у меня есть куча объектов, визуализируемых в OpenGL (используя JOGL). Для одной группы объектов я хочу убедиться, что определенные объекты в этой группе отображаются перед другими объектами в этой группе. Я попытался очистить бит буфера глубины и отрендерить «передние» объекты последними, и это работает, за исключением того, что он портит другие буферы глубины на экране.

Что сводится к тому, что у меня есть список отображаемых объектов, и я хочу убедиться, что определенные объекты в этом списке отображаются перед другими объектами (хотя они все имеют одинаковую координату Z). Есть ли способ сделать это?

спасибо, Джефф

1 Ответ

1 голос
/ 25 марта 2010

Это очень распространенный метод рисования прозрачных объектов (объектов, у которых есть части с альфа! = 1).

Наиболее распространенный подход заключается в том, чтобы сначала построить дерево объектов для рисования, которое затем можно будет отсортировать по «глубине» после прохождения через матрицы проекционных * камер. По сути, вместо того, чтобы просто слепо бросать треугольники в графический процессор, вы отправляете свои объекты один за другим, обрабатывая их в мире, во временный буфер. Эти объекты обладают полным знанием каждого треугольника и каждого цвета вершины / вершинного шейдера / имени текстуры + id и т. Д. Затем вы можете сортировать свой буфер (наивно, объект за объектом или полноценную сортировку на основе похожих патчей между объектами).

Трюк glDepthMask, если я правильно помню, выглядит примерно так:

glDepthMask(true);
drawOpaqueObjects();
glDepthMask(false);
drawTransparentObjects();

Для достижения наилучших результатов прозрачные объекты сортируются задом наперед, но в большинстве (простых) приложений это не имеет значения.

edit: обратите внимание, что для 2-й техники, в то время как вы включаете и затем отключаете буфер глубины WRITING, вы все еще используете TESTING буфера глубины, поэтому прозрачные объекты за вашими обычными объектами (например, шлем, указывающий "на" экран) выиграют ' тянутся.

...