Пользовательский порядок рисования для эффектов наложения AR в OpenGL ES (10)

Я работаю над приложением дополненной реальности, и мне нужно отсортировать рендеринг трех разных видов геометрии.

Уровень 1
Фоновая геометрия. Это набор треугольников, которые представляют базовую архитектуру. Стены и т. Д.

Уровень 2
Фотография самолета. Фотография архитектуры, помещенная в виде текстуры на плоскости в космосе. Эта плоскость геометрически находится перед Уровнем 1 (как видно из виртуальной камеры).

Уровень 3
Динамическая геометрия. Это примитивы, такие как коробки и т. Д., Для увеличения сцены. Они геометрически отстают от Уровня 2, потому что они правильно размещены в системе координат Уровня 1.

Желаемый эффект:
a) Я хочу, чтобы Level_2 всегда рисовался перед Level_1. Это достигается автоматически, помещая плоскость изображения ближе к камере.

б) Я хочу, чтобы Level_3 был правильно закрыт от Level_1, тем самым скрывая части динамического блока, если он частично размещен за стеной Level_1. Это автоматически происходит и с обычным конвейером. Глубинное тестирование и т. Д.

c) Я хочу, чтобы все фрагменты / пиксели Уровня_3 были нарисованы ВЫШЕ Уровня_2, даже если они на самом деле находятся за ним. Эффект должен заставить объекты выглядеть так, как если бы они были закрыты частями фотографии.

Я знаю, что это возможно, потому что у меня есть приложение в X3Dom (которое отображает в webgl), которое может добиться этого эффекта с помощью атрибута «sortkey». Но я не мог воссоздать тот же эффект в чистом OpenGL. Я думал, что это должно быть простое использование уловок Stencilbuffer или Z-Buffer, но у меня это не работает. Как мне дать «всегда проходить» геометрии Level_3, чтобы она отображалась поверх всего остального, но также правильно закрывалась от Level_1? Или как заставить Level_2 скрывать только Level_1, а не Level_3, даже если он находится перед обоими?

В основном:
1) Level_2 скрывает Level_1
2) Level_1 и Level_3 перекрывают друг друга
3) Видимые части Level_3 (против Level_1) не закрываются Level_2

Любая помощь?

Спасибо!


person J-S    schedule 13.05.2014    source источник


Ответы (2)


Вам нужно отрендерить сцену в три этапа в соответствии с описанными вами уровнями. Уровень_1 должен быть отрендерен первым с включенным тестом глубины. Затем вы должны отрендерить level_2 с отключенным тестом глубины. И на третьем этапе вы должны отрендерить level_3 с включенным тестом глубины. Таким образом, геометрия level_2 будет визуализироваться полностью перекрывая level_2, в то время как это не повлияет на z-буфер, поэтому геометрия level_3 будет визуализироваться так, как если бы level_2 не отображался вообще.

Чтобы включить или отключить проверку глубины, вы должны вызвать glEnable и glDisable функций. Вызов glDisable (GL_DEPTH_TEST) отключит проверку глубины и обновление буфера глубины. Чтобы включить проверку глубины и запись в буфер глубины, вы должны вызвать glEnable (GL_DEPTH_TEST)

Общие шаги, которые вам нужно сделать:

    /*
    Render level_1 
    */

    glDisable(GL_DEPTH_TEST); //disable depth test and update of the depth buffer

    /*
    Render level_2         
    */

    glEnable(GL_DEPTH_TEST);  //enable depth test and update of the depth buffer

    /*
    Render level_3         
    */
person Podgorskiy    schedule 14.05.2014
comment
Это не работает. Если вы отключите проверку глубины, она не позволит правильно отрисовать геометрию. Он создает все грани одинакового эффекта без окклюзии, но не с желаемым наложением. - person J-S; 26.05.2014

Узнал через некоторое время, но забыл здесь обновить. Решение было таким простым, как и ожидалось. Тестирование глубины остается активным все время. Рендеринг вызывается в порядке 1, 2, 3. Рендеринг уровня 2 заключен в

gl.glDepthMask (ложь);

gl.glDepthMask (правда);

Обеспечивает правильную визуализацию глубины и окклюзию каждого уровня, но не изменяет буфер глубины для элементов уровня 2 визуализации. Поэтому элементы уровня 3 игнорируют глубину уровня 2 и ограничиваются уровнем 1.

person J-S    schedule 26.05.2014