Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

редактировать:обратите внимание, что для второго метода, пока вы включаете, а затем отключаете ЗАПИСЬ буфера глубины, вы все равно используете ТЕСТИРОВАНИЕ буфера глубины, поэтому прозрачные объекты позади ваших обычных объектов (например, шлем, направленный «внутрь» экрана) не будут отрисованы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top