IPhone 5S - Возможная проблема с буфером глубины

В моем приложении я выполняю плоскость над плоскостью. Нижняя плоскость имеет Z = 0, вторая имеет Z = 0,5. Если я их визуализирую (сначала снизу), я потерял часть рендера, как показано на рисунке

enter image description here

На iPhone 4 и на рабочем столе (с использованием эмулятора ES) все правильно и без проблем. Что может послужить причиной этого?

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

Ответ 1

Хорошо... Я решил это. В моем шейдере возникла проблема, которая заставляла буфер глубины заполняться безрезультатно. Я использовал

precision mediump float;

что заставило геометрию быть неточным и Z = 0 vs Z = 0,5 было смешано вместе.

Изменение точности до highp решило проблему.

Нижняя линия. Эта "оптимизация" была огромной ошибкой и никогда не использовала mediump в Vertex Shader (если вы не сталкиваетесь с каким-то влиянием на производительность и даже тем, что ее не стоит. Разница в рендеринге не примечательна)

Ответ 2

(Это ответ на ваш собственный ответ, который является лишь частично правильным)

У вас есть случай Z-борьбы, который происходит из-за сопоставления значений вашей сцены Z в z-буфере. Это может быть нелинейное отображение (1/f (Z) является общим), но я не уверен в z-буферах с плавающей запятой.

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

Посмотрите на свои сцены; вы хотите сопоставить z-диапазон в 3D-сцене с максимально возможным диапазоном значений, которые может хранить z-буфер, иначе вы теряете куски диапазона чисел, которые может хранить z-буфер. Вычисление этого отображения для каждого кадра может быть полезным, в зависимости от того, что вы хотите сделать с z-буфером позже.

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