Я пытаюсь, чтобы тестирование глубины работало корректно на OpenGL ES, используя расширение draw_texture. Я рано понял, что «нормальные» координаты z при рендеринге с использованием этого расширения не работают. Это произошло из-за расширения, эффективно использующего координату Z в качестве отношения между 0 и 1, а не фактическую позицию z в буфере глубины, как показано на странице текстуры рисования OES OpenGL:
Zs отображается на глубину окна Zw следующим образом:
{ n, if z <= 0
Zw = { f, if z >= 1
{ n + z * (f - n), otherwise
where <n> and <f> are the near and far values of
DEPTH_RANGE.
Я прочитал на странице FAQ по прозрачности для OpenGL, что:
При использовании буферизации глубины в приложении вы должны быть осторожны
о порядке, в котором вы делаете примитивы. Полностью непрозрачный
сначала нужно отобразить примитивы, а затем частично непрозрачные
примитивы в обратном порядке. Если вы не визуализируете примитивы в
этот порядок, примитивы, которые в противном случае были бы видны через
частично непрозрачный примитив, может полностью потерять тест глубины.
Это подводит меня к моей проблеме. У меня 2 квадрата, оба 64х64. Они текстурированы с кругом. Квадрат «сверху» расположен немного дальше от квадрата ниже, вот так.
___________
| .____. |
| / \ |
|_|______|_|
| .____. |
| / \ |
| | s | |
| \____/ t|
|__________|
Текстура круга - это сплошной цвет (цвета), который образует круг, затем полностью прозрачная окружающая область (t).
Когда OpenGL отображает его, квадрат под ним не проходит тест глубины и не отрисовывается, даже если пиксели над ним прозрачны, поэтому вы получаете эффект полукруга от слоя под ним, а не от всего изображения.
BAD GOOD
___________ ___________
| .____. | | .____. |
| / \ | | / \ |
|_|______|_| |_| |_|
| .____. | | \.____./ |
| / \ | | / \ |
| | | | | | | |
| \____/ | | \____/ |
|__________| |__________|
Как я могу предотвратить это?