Я действительно не могу понять, что заставляет одну поверхность перекрывать другую. В 3D движке, который я создаю, моя техника терпит неудачу в крайних случаях.
Мой метод сортировки поверхностей, которые будут окрашены, от самых дальних к ближайшим. Чтобы определить близость, я сравниваю средние значения z. Однако иногда перекрывающаяся поверхность имеет более высокое среднее значение z, чем та, которую она перекрывает. Таким образом, поверхность, расположенная дальше, закрашивается более близкой, что приводит к причудливому рендерингу следующим образом:
То, что нужно видеть, это фиолетовая передняя поверхность куба, а красная боковая поверхность закрашена пурпурной. Среднее значение z пурпурной поверхности выше, и поэтому «дальше». Поэтому у меня есть некоторые сомнения относительно правильности этой техники.
Я также пытался определить расстояние от камеры (то есть до начала координат) до поверхности, но затем мне понадобилась точка. Я выбрал середину каждой поверхности, но также это не всегда работает, потому что не все поверхности такие большие, как друг друга.
Следовательно, каков надежный способ определения порядка близости поверхностей к началу координат?
У вас есть проблема видимости . Одним из решений является использование z-буфера .
источник
Сортировка граней по их среднему z-значению не работает, поскольку среднее z-значение не предоставляет информации о фактическом z-значении вершин или даже пикселей поверхности.
Пример (предупреждение, ASCII искусство впереди):
Есть две грани A и B. С точки зрения камеры A перед B. Тем не менее, среднее значение z для B меньше. Давайте посмотрим на другие z-значения:
Вы можете попытаться отсортировать их по минимальным z-значениям, но в некоторых случаях это тоже не сработает. Просто невозможно правильно отсортировать произвольные грани, используя только одно z-значение.
В алгоритме Ньюэлла http://en.wikipedia.org/wiki/Newell 's_algorithm, что вы делаете, сортируете минимальные / максимальные диапазоны z-значений. Если диапазоны двух граней не перекрываются, вы можете точно знать, какая из них впереди. Если они это делают, иногда вам абсолютно необходимо разделить лица. Иногда достаточно будет проследить каждую вершину для окклюзии или какой-либо другой техники.
источник
Хорошо, что вы изучаете рендеринг в действии. Престижность. В этом случае на PS1 нет решения «алгоритма рисования», вместо того, чтобы пытаться исправить его путем сортировки, на котором мы просто пытались держать полигоны примерно одинакового размера, когда они были рядом друг с другом (что вы делаете как насколько я могу судить), и задняя часть отбраковки (что вы не делаете)
Отбор задней поверхности - это проверка нормали поверхности в пространстве экрана на предмет ее направления (достаточно получить знак элемента глубины из пространства экрана, преобразованного в нормаль (в нашем случае это была z нормали), или перекрестное произведение двух векторов треугольник, то есть крест (v1-v0, v2-v0))
Если вы реализуете выборку задней поверхности, вы также уменьшите количество растеризации, которую вы делаете ... двойной выигрыш.
источник