2015-05-29 2 views
1

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

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

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

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

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

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

+0

только для уточнения C всегда фон - если B оказывается выше A, вы хотите, чтобы C был показан, и если A отображает выше B, вы хотите увидеть A? – MuertoExcobito

+0

Да, вы правы. C всегда является фоном. – Howy

+0

... так что это похоже на то, что B - это отверстие, которое вы снимаете на A? – Tommy

ответ

2

Самое простое решение заключается в следующем:

  1. дро-C;
  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); 
+0

Я собираюсь снять этот ответ до выяснения вопроса. – Tommy

+0

Undeleted по запросу. – Tommy