2014-01-14 3 views
0

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

Я нашел сайты, которые говорят мне, что я использую разные типы смешивания, а некоторые сайты просто отключают глубинные проверки, которые я знаю, что я должен делать. Но нужно ли вручную сортировать геометрию? Означает ли это, что я должен сортировать его в соответствии с его положением на оси z? Единственная проблема заключается в том, что угол камеры изменяется, поэтому я не знаю, нужно ли сортировать по всей оси.

+0

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

ответ

0

Вам необходимо преобразовать геометрию в соответствии с вашим FOV/углом зрения камеры, а затем отсортировать ее по оси z, чтобы узнать порядок визуализации.

+1

Ну да, но если я переведу камеру, мне нужно все же визуализировать фронт назад от того, что я смотрю? Например, угол камеры начинается с 0 по оси вращения y, так что z находится прямо. Если я поверну на 90 градусов по оси y, ось x будет прямо вперед. Итак, я бы сортировал по оси x? Или всегда на z? –

+0

Вам нужно сортировать в пространстве камеры, это означает, что ваше значение Z, которое вы хотите отсортировать, - это Vector4.DotProduct ([ox, oy, oz, 1], viewMatrix.Column2). Если это столбец 2 или строка 2, зависит от API на стороне клиента (ваши классы Java и методы для матриц и т. Д.). Для OpenTK это похоже на baove. – PawelP

1

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

Что по существу означает: вам придется выполнять работу. Но так как вам все равно нужно правильно подготовить чертежный паспорт (удаление отрывков, распределение активов, изменение состояния, сводящее к минимуму предварительное задание и т. Д.), Это не означает много дополнительной работы.

Конечно, если вы рассматриваете OpenGL как-то, это не так, а именно график сцены, ваши результаты будут суб-пар.

+1

Я понимаю, что это не график сцены, я просто не знал, будет ли это сортировать мою геометрию для меня. У меня есть последний вопрос, всегда ли я сортируюсь по оси z? Или мне нужно сортировать вдоль оси, на которую смотрит игрок? –

+0

@ opiop65: Как он мог сортировать геометрию, если она не хранит геометрию? OpenGL должен был быть графом сцены, чтобы он мог сортировать. Когда вы спрашиваете о том, какую ось сортировать вдоль, ну, по координатам оси Z (= глаз). В зависимости от вашего вида, которое может быть другой осью в мировых координатах. Просто возьмите столбец Z матрицы modelview и используйте его как операнд в скалярном (= точка) продукте с позициями, результатом будет квадрат расстояния; вам не нужно брать квадратный корень для сортировки, так как x⟼x² - сильная монотонная функция. – datenwolf

+0

Я понимаю, что сейчас, извините. Поэтому, чтобы быть ясным, я всегда сортируюсь по одной и той же оси? Он никогда не переключится? Я просто получаю геометрию, которая наиболее далека от оси «z» и визуализирует ее, а затем продолжайте наращивать вдоль оси «z», пока я не доберусь до ближайшей позиции к игроку? –

Смежные вопросы