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

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

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

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

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

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

б) Я хочу, чтобы уровень_3 был правильно закрыт применительно к уровню_1, тем самым скрывая части динамического блока, если он расположен частично за стеной уровня_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

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

Спасибо!

2 ответа

Решение

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

gl.glDepthMask(ложь);

gl.glDepthMask(истина);

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

Вы должны визуализировать сцену в три этапа в соответствии с уровнями, которые вы описали. Уровень_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         
    */
Другие вопросы по тегам