Как мне Z-сортировать треугольники для 3D-движка? - PullRequest
4 голосов
/ 18 сентября 2010

Я создаю небольшой 3D-движок для игры, над которой я работаю.Я отсортировал основы: текстурированные треугольники с отбраковкой задней поверхности.Однако сортировка по глубине оказывается сложной задачей.

Я вычисляю грань Z, усредняя 3 точки, которые составляют треугольную грань.Более длинные грани иногда перекрывают более мелкие грани, поскольку они имеют большее значение Z и, следовательно, поднимаются в отсортированном по глубине списке отображения.

Как это исправить?Я уверен, что существуют известные методы глубокой сортировки, если я могу только получить практическую помощь в их программировании.Я сам построил конвейер рендеринга, поэтому у меня есть доступ ко всем необходимым данным - треугольникам, точкам, текстурам, координатам УФ и т. Д.

alt text

Собор отрисован в моем 3D движке

alt text

Ответы [ 3 ]

4 голосов
/ 18 сентября 2010

Вам необходимо подразделить ваши треугольники так, чтобы они все были примерно одинакового размера - независимо от того, выполняете ли вы сортировку самостоятельно или используете z-буфер.Если, конечно, алгоритм z-буфера также разбивает для вас длинные тонкие треугольники.

Проблема в том, что если у вас есть несколько маленьких компактных треугольников и несколько длинных тонких (например), алгоритмБудут пропускать классифицировать длинные худые чаще, чем нет.Если вы используете среднюю точку треугольника, будут точки обзора, где он будет рассматриваться как «перед» более компактного, хотя на самом деле, если он действительно находится позади.Возьмите этот вид сверху вниз, где + представляет среднюю точку.

            o

-+-            1
-----+------   2
         -+-   3

*

Если смотреть от * до o, большой треугольник (2) можно интерпретировать как находящийся перед маленьким треугольником (3) и, следовательно, быть нарисованным поверх него.

Если (2) разбить на 3 или 4 меньших треугольника, то z-буферизация будет работать чаще.

4 голосов
/ 18 сентября 2010

Вы можете выбрать:

  1. Разделите ваши сетки так, чтобы вы можно отсортировать каждый полигон надежно (но Есть еще ужасные крайние случаи что вы можете или не можете видеть).

  2. Используйте Z-Buffer , который поддерживается всеми графическое оборудование и по существу бесплатно.

1 голос
/ 08 сентября 2015

Угловой случай, который усложняет любой алгоритм сортировки треугольников, представлен следующей диаграммой:

unsortable triangles

Каждый из треугольников находится перед одним треугольникоми за другим.Мне пришлось сделать несколько очень простых трюков в inkscape только для того, чтобы создать эту диаграмму.

Нетрудно расположить полигоны в 3D так, чтобы у вас был цикл на графике «перед».Чтобы решить эту проблему, вашему алгоритму понадобится возможность подразделить треугольники, чтобы разорвать цикл.

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

...