Артефакты OpenGL ES 2.0 с вращающейся поверхностью

Я работаю над вращающейся сеткой, и по большей части она работает нормально, за исключением определенных этапов вращения. Например:

до

введите здесь описание изображения

между

введите здесь описание изображения

после

введите здесь описание изображения

Как видите, похоже, что OpenGL меняет свое мнение о том, что находится впереди. Самое забавное, что этапы «до» и «после» выглядят «нормально» сами по себе, хотя они являются своего рода инверсией друг друга. (Это триповый оптический эффект, но не то, что я хотел.)

Я программирую в iOS 6, используя GLKit.

Я не знаю, связана ли моя проблема с кодом настройки и рисования или это как-то связано с тем, как я делаю вращения. Любое понимание будет высоко оценено.


person rmp251    schedule 29.03.2014    source источник


Ответы (1)


К счастью, нашел свой ответ сразу после публикации этого. Просто нужно было включить буфер глубины.

view.drawableDepthFormat = GLKViewDrawableDepthFormat16;

(где вид - это ваш GLKView*)

Спасибо, Рэй Вендерлих, за хорошее объяснение< /а>:

drawableDepthFormat

Ваш контекст OpenGL также может иметь другой связанный с ним буфер, который называется буфером глубины. Это помогает убедиться, что объекты, расположенные ближе к зрителю, отображаются перед объектами, находящимися дальше.

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

Вы можете установить это свойство, чтобы выбрать формат буфера глубины. Значение по умолчанию — GLKViewDrawableDepthFormatNone, что означает, что буфер глубины вообще не включен.

Но если вам нужна эта функция (что вы обычно делаете для 3D-игр), вам следует выбрать GLKViewDrawableDepthFormat16 или GLKViewDrawableDepthFormat24. Компромисс здесь заключается в том, что с GLKViewDrawableDepthFormat16 ваше приложение будет использовать меньше ресурсов, но у вас могут возникнуть проблемы с рендерингом, когда объекты находятся очень близко друг к другу.

person rmp251    schedule 29.03.2014