OpenGL Как использовать невидимую маску, чтобы скрыть объекты за ней

У меня есть проблема с OpenGL, которую нужно решить. У меня есть объект/сетка A, объект/сетка B и фоновая текстура C.

Изначально фреймбуфер заполнен фоновой текстурой C. Мы отрисовываем в фреймбуфере и A, и B. Мы хотим, чтобы объект A был видимым, а объект B всегда невидимым.

В начале A находится перед B. При вращении под определенным углом B находится перед A по результатам теста глубины, но поскольку B всегда невидим, часть B должна быть заполнена фоном C.

Кто-нибудь знает простой подход к решению этой проблемы?

Является ли трафаретный тест хорошим подходом? В основном задайте цвет объекта B, сравните цвет B с фоном C и покажите фон C, когда тест не пройден.

У кого-нибудь есть пример кода, который я могу прочитать?


person Howy    schedule 29.05.2015    source источник
comment
просто чтобы уточнить, что C всегда является фоном - если B отображается над A, вы хотите, чтобы C отображался, а если A отображается над B, вы хотите видеть A?   -  person MuertoExcobito    schedule 29.05.2015
comment
Да, ты прав. C всегда является фоном.   -  person Howy    schedule 29.05.2015
comment
... так это похоже на то, что B - это дыра, которую вы визуализируете на A?   -  person Tommy    schedule 29.05.2015
comment
Я думаю, он просто хочет, чтобы B + A было дырой - если это просто B над C, тогда вы должны увидеть B?   -  person MuertoExcobito    schedule 29.05.2015
comment
О, я не так прочитал. Мой ответ не подходит для этого. При необходимости отредактирую.   -  person Tommy    schedule 29.05.2015
comment
Я не понимаю требований, что произойдет, если B не перекроет A? Вы хотите, чтобы фон отображался вместо B только для тех частей B, которые находятся перед A?   -  person peppe    schedule 29.05.2015
comment
Я хочу сделать B всегда невидимым, то есть часть B всегда заполнена фоном C. Но я хочу, чтобы тест глубины прошел. Если B находится перед A, не показывайте A, а покажите C. Если A находится перед B, покажите A.   -  person Howy    schedule 29.05.2015
comment
Вы хотите, чтобы тест на глубину прошел что? Например, вы хотите, чтобы значения глубины A оставались в буфере глубины независимо от местоположения B? ... или вам нужны значения глубины из C, где бы ни был B? Чтобы вы действительно могли видеть гипотетическое D, где-то между A/B и C, через A, где B был? Разрешено рисовать D после рисования A/B?   -  person Tommy    schedule 29.05.2015
comment
@ Howy, может быть, вам следует отредактировать свой вопрос, чтобы было немного яснее, что вы хотите. Мы рисуем оба A и B поверх него - для меня это означает, что A и B оба рендерятся в цветовой буфер. Если B всегда невидим, то ответ Томми должен работать.   -  person MuertoExcobito    schedule 29.05.2015
comment
Извини, Томми, да. Ваш ответ правильный. Я пробовал, и это работает. Спасибо MuertoExcobito, теперь я прояснил вопрос. Пожалуйста, опубликуйте свой ответ еще раз. и я проголосую.   -  person Howy    schedule 29.05.2015


Ответы (1)


Самое простое решение:

  1. нарисовать С;
  2. нарисовать B с цветовой маской, предотвращающей запись в буфер кадра (но не трогать маску глубины, чтобы запись в буфер глубины все еще производилась);
  3. нарисуйте A, при условии проверки глубины.

Конкретная вещь, которую нужно использовать, это glColorMask — если вы предоставите GL_FALSE для каждого канала через это, то последующая геометрия не будет записывать никакого цветового вывода. Но если вы не коснулись glDepthMask, он все равно будет записывать вывод глубины.

Итак, вы, вероятно, в настоящее время получили код:

drawBackground(C);
render(A);
render(B);

Вы просто адаптируете это к:

drawBackground(C);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
render(B);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
render(A);
person Tommy    schedule 29.05.2015
comment
Я собираюсь отозвать этот ответ до выяснения вопроса. - person Tommy; 29.05.2015
comment
Восстановлено по запросу. - person Tommy; 29.05.2015