Как нарисовать многоугольник только на определенных цветах пикселей?

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

Я визуализирую каждый из разноцветных полигонов одновременно в своих «слоях» (= один цвет за раз). Они могут покрывать друг друга; Новейший слой покрывает все предыдущие слои. Черный цвет на изображении — это область «без полигонов»: пустое пространство, и это тоже следует игнорировать.

Итак, в основном я просто рендеринг полигонов, а затем N-й (не первый) слой полигонов должен быть замаскирован следующим слоем полигона, и ничто другое под ним не должно быть затронуто.

Изображение метода необходимо:

введите описание изображения здесь

Какой метод я могу использовать для достижения этого с OpenGL? Я бы предпочел не шейдерное решение для этого, если это возможно (?).

Единственный метод, который я могу сделать в настоящее время, — это визуализировать каждый слой отдельно в память, затем самостоятельно пройтись по пикселям и объединить слои «вручную», но это кажется очень медленным методом, выполнимым, но скорость важна Вот.

5

Решение

Чтобы использовать буфер трафарета для этого, вы можете сделать следующее:

Убедитесь, что вы запрашиваете контекст, в котором есть трафаретный буфер, это зависит от оконной системы, поэтому я не буду описывать его здесь. Вызов glGet(GL_STENCIL_BITS) чтобы убедиться, что вы получите достаточное количество бит.

Трафаретный буфер поддерживает целое число рядом с каждым пикселем и позволяет вам изменять его по мере прорисовки. Когда вы рисуете каждый слой, настройте буфер трафарета для установки определенного значения при рисовании каждого слоя. Вы делаете это с

 //draw layer N
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, N, -1);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

Теперь, когда вы рисуете каждый слой, последний многоугольник, который был нарисован на экране, также сохраняет свой номер слоя в буфере трафарета.

В этот момент, когда вы хотите вернуться и нарисовать свою зеленую звезду, вы просто указываете ей рисовать только на пикселях, где буфер трафарета равен N.

 //draw only where stencil == N
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_EQUAL, N, -1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
drawStar();
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector