Я читал о буфере трафарета в OpenGL. Основная концепция имеет смысл; фрагмент рисуется только в том случае, если он удовлетворяет определенному условию после того, как он был побитовым AND со значением в буфере шаблонов. Но я не понимаю, как на самом деле вы пишете в буфер трафарета. Есть ли здесь функция, которую я пропускаю?
Постскриптум Когда я говорю «написать», я имею в виду указать конкретные значения в буфере трафарета.
Я описал как визуализировать в буфер трафарета здесь, используя libGDX. Процесс применения маски в OpenGL одинаков независимо от версии или платформы OpenGL.
Как маскировка работает в OpenGL
Есть много способов создать маску в OpenGL, обратите внимание, что код для создания маски в моем предыдущем ответе фактически использует буфер глубины. Я мог бы использовать трафаретный буфер аналогичным образом для достижения того же результата.
Используя буфер глубины, вы можете применить маски следующим образом:
Инициализируйте и настройте глубинное тестирование
Начните с очистки буфера глубины и отключите рендеринг в буфер цвета:
glClearDepthf(1.0f);
glClear(GL_DEPTH_BUFFER_BIT);
glColorMask(false, false, false, false);
Далее, укажите критерии для буфера, это говорит OpenGL, как выполнить рендеринг в буфер глубины для создания маски. Вы делаете это, позвонив glDepthFunc
(должна ли замаскированная область быть областью сцены, где нарисована фигура, или что-то еще? о различных видах ввода в функцию глубины см. раздел «Проверка глубины» на этом сайте.)
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glDepthMask(true);
// Your code to render the mask goes here
Создание маски
После включения буфера вы визуализируете полигоны в форме, которую вы хотите использовать для маски. Поскольку мы отключили запись в цветной буфер, визуализированное изображение не будет отображаться на экране, оно отображается в буфере глубины. Буфер глубины имеет те же размеры ширины и высоты, что и буфер цвета, но состоит из значений 0 и 1. К каждому пикселю применяется тест глубины, если он проходит, то значение 1 помещается в буфер для этого местоположения, в противном случае соответствующее местоположение имеет значение 0.
Включить цветной буфер, установить функцию глубины и визуализировать на сцену
Теперь вы настраиваете OpenGL для рендеринга в буфер цвета и применяете маску глубины следующим образом:
glColorMask(true, true, true, true);
glDepthMask(true);
glDepthFunc(GL_EQUAL);
// Your code to render the scene goes here
Поскольку у вас включен буфер глубины, каждый пиксель в окне просмотра будет иметь соответствующее значение 0 или 1. Теперь другая функция глубины применяется к соответствующему значению для каждого пикселя, и, если результат равен true, пиксель отображается на экране. Здесь выбор функции глубины определяет способ применения маски.
Отключить тестирование глубины
Чтобы снова разрешить нормальный рендеринг сцены, вы отключаете буфер глубины следующим образом:
glDisable(GL_DEPTH_TEST);
Других решений пока нет …