Главная » Программирование игр под Android » Точность z-буфера и z-схватка – РАЗРАБОТКА ИГР ДЛЯ ОС ANDROID

0

Всегда есть желание злоупотребить использованием ближней и дальней плоскостей отсечения так, чтобы они показывали как можно больше нашей замечательной сцены. Мы приложили большие усилия для того, чтобы создать множество объектов для игрового мира, и хотели бы, чтобы от них была польза. Единственная проблема заключается в том, что z-буфер имеет ограниченную точность. На большинстве устройств с ОС Android каждое значение глубины, хранящееся в z-буфере, может иметь размер не более 16 бит, в общей сложности получается 65 535 различных значений глубины. Поэтому вместо того, чтобы установить значения ближней и дальней плоскостей отсечения равными 0,00001 и 1 000 000 соответственно, выберите более обдуманные значения. В противном случае вы увидите артефакты, которые будет производить неверно сконфигурированная область видимости в комбинации с z-буфером.

В чем заключается проблема? Представьте, что мы установили значения ближней и дальней плоскостей отсечения такими, какими мы только что обозначили. Значение глубины пиксела – это расстояние от ближней плоскости отсечения, чем пиксел к ней ближе, тем меньше значение глубины. При величине буфера, равной 16 бит, мы делим расстояние от ближней до дальней плоскости отсечения на 65 535 сегментов. Каждый сегмент занимает 1 000 000 / 65 535 = 15 единиц измерения нашего мира. Если мы выберем в качестве единицы измерения метры, а все объекты будут иметь размер 1 х 2 х 1 м и при этом находиться к одном сегменте, z-буфер не будет столь полезным, поскольку все пикселы будут иметь одинаковое значение глубины.

ВНИМАНИЕ

Значения глубины, хранящиеся в z-буфере, не линейны, но общая идея верна.

Еще одной проблемой, связанной с z-буфером, является так называемая z-схватка. Она проиллюстрирована на рис. 10.9.

Рис. 10.9. Z-схватка

Два прямоугольника, изображенные на рис. 10.9, компланарны; это значит, что они лежат в одной и той же плоскости. Поскольку они пересекаются, у них также есть несколько общих пикселов, которые имеют одинаковые значения глубины. Однако из-за ограниченной точности вычислений с плавающей точкой GPU может неверно обработать одинаковые значения глубины для перекрывающихся пикселов. Пикселы, проходящие тест глубины, определяются в случайном порядке. С этой проблемой обычно можно справиться, отодвинув один из двух компланарных объектов от другого на небольшое расстояние. Значение подобного смещения зависит от нескольких факторов, поэтому лучше всего поэкспериментировать. В качестве итога можно сказать следующее.

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

Избегайте применения компланарных объектов, немного их смещая.

Источник: Mario Zechner / Марио Цехнер, «Программирование игр под Android», пер. Егор Сидорович, Евгений Зазноба, Издательство «Питер»

По теме:

  • Комментарии