Лучшее решение для визуализации нескольких объектов без наложения - PullRequest
0 голосов
/ 02 ноября 2019

Я просто не могу понять, как это сделать лучше. На трехмерной сцене несколько объектов находятся в одной плоскости, и мне нужно визуализировать их таким образом, чтобы, когда они фактически пересекались, один объект полностью отображался поверх другого объекта.

Чтобы сделать его более понятным,например, у меня есть такая 3d сцена: enter image description here

, и мне нужно сделать это для всех объектов: enter image description here

единственное, что приходит мне в голову, это очищать Z-буфер каждый раз после каждого рисования объекта:

1) Render object1.
2) Clear Z-buffer.
3) Render object2.
3) Clear Z-buffer.
......
N) Render objectN.
N+1) Clear Z-buffer.

Но, насколько я понимаю, такое решение будет чрезвычайно дорогостоящим по производительности. Можно ли как-то повторить этот эффект с помощью буфера трафарета или каким-либо другим способом?

Ответы [ 2 ]

2 голосов
/ 02 ноября 2019

Предполагая, что вы заранее знаете количество потенциально перекрывающихся объектов, вы можете использовать glDepthRange. Сортировка объектов по глубине, затем для объекта i (в порядке возрастания, т. Е. Наименьший i - ближайший объект): glDepthRange((float)i/N, (float)(i+1)/N), где N - количество объектов.

Обратите внимание, чтопорядок, в котором вы рисуете объекты, не имеет значения, поскольку тестирование глубины сохраняется, а расслоение является явным для диапазона глубины.

1 голос
/ 02 ноября 2019

Используйте алгоритм Painter: для каждой новой точки обзора камеры сортируйте (выпуклые) модели по расстоянию от центроида до положения камеры, отключите проверку глубины и визуализируйте все из них спереди назад.

Чтобы избежатьсортировка объектов по центроидам каждый раз, когда вы можете использовать пространственное дерево: это может быть дерево октав, дерево квадраторов, дерево BSP, дерево AABB или другие. Листья дерева указывают на ваши объекты, а внутренние узлы делят пространство, разделяющее их. Вы можете перемещаться по этим деревьям в обратном порядке из любой позиции камеры во время рендеринга.

BSP-дерево является наиболее гибким, поскольку вы можете выбирать плоскости, которые лучше всего отделяют ваши объекты друг от друга вбудем. Даже если объекты перекрывают друг друга, вы просто определяете плоскость, разделяющую их, и классифицируете их как полностью на одной стороне плоскости, и она будет работать так, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...