Я нарисовал несколько разноцветных многоугольников на экране, теперь я должен нарисовать другой многоугольник другого цвета, но этот многоугольник следует рисовать только на тех пикселях, которые имеют определенный цвет.
Я визуализирую каждый из разноцветных полигонов одновременно в своих «слоях» (= один цвет за раз). Они могут покрывать друг друга; Новейший слой покрывает все предыдущие слои. Черный цвет на изображении — это область «без полигонов»: пустое пространство, и это тоже следует игнорировать.
Итак, в основном я просто рендеринг полигонов, а затем N-й (не первый) слой полигонов должен быть замаскирован следующим слоем полигона, и ничто другое под ним не должно быть затронуто.
Изображение метода необходимо:
Какой метод я могу использовать для достижения этого с OpenGL? Я бы предпочел не шейдерное решение для этого, если это возможно (?).
Единственный метод, который я могу сделать в настоящее время, — это визуализировать каждый слой отдельно в память, затем самостоятельно пройтись по пикселям и объединить слои «вручную», но это кажется очень медленным методом, выполнимым, но скорость важна Вот.
Чтобы использовать буфер трафарета для этого, вы можете сделать следующее:
Убедитесь, что вы запрашиваете контекст, в котором есть трафаретный буфер, это зависит от оконной системы, поэтому я не буду описывать его здесь. Вызов 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();
Других решений пока нет …