Это немного сложный и дорогостоящий метод, но любой вогнутый многоугольник можно нарисовать с помощью следующих шагов (обратите внимание, что этот метод наверняка работает на плоских многоугольниках, но я также предполагаю, что вы пытаетесь рисовать на плоской поверхности или в 2Dортогональный режим):
- включить проверку трафарета, использовать
glStencilFunc(GL_ALWAYS,1,0xFFFF)
- отключить маску цвета для предотвращения нежелательных рисунков:
glColorMask(0,0,0,0)
- Я думаю, у вас есть вершиныв массиве типа double или в другой форме (настоятельно рекомендуется, так как этот метод рисует один и тот же полигон несколько раз, но можно использовать и glList или glBegin-glEnd)
- set
glStencilOp(GL_KEEP,GL_KEEP,GL_INCR)
- нарисовать многоугольник как GL_TRIANGLE_FAN
Теперь на слое трафарета у вас установлены биты> 0, где были нарисованы треугольники многоугольника.Хитрость в том, что вся действительная область многоугольника заполнена значениями, имеющими mod2 = 1, это потому, что рисунок веерного треугольника перемещается вдоль поверхности многоугольника, и если выбранный треугольник имеет область вне многоугольника, он будет нарисован дважды (один раз втекущая последовательность, затем на следующих чертежах, когда нарисованы действительные области) Это может происходить много раз, но во всех случаях пиксели вне многоугольника рисуются четные времена, пиксели внутри рисуются нечетные времена.Могут произойти некоторые исключения, когда порядок пикселей приводит к тому, что внешние области больше не рисуются.Чтобы отфильтровать эти случаи, необходимо нарисовать массив вершин в обратном направлении (все эти случаи работают правильно при переключении порядка): - установите glStencilFunc (GL.GL_EQUAL, 1,1), чтобы эти ошибки не происходили в обратном направлении (можно рисовать только областивнутри многоугольника, нарисованного в первый раз, поэтому ошибки, возникающие в другом направлении, не появятся, логически это создает пересечение двух половин решения) - рисовать многоугольник в обратном порядке, сохраняя glStencilFunc для увеличения значений развернутых пикселей. Теперь у нас естьисправьте слой трафарета с pixel_value% 2 = 1, где пиксель действительно находится внутри многоугольника.Последний шаг - нарисовать сам многоугольник: - установите glColorMask(1,1,1,1)
для рисования видимого многоугольника - оставьте glStencilFunc (GL_EQUAL, 1,1) для рисования правильных пикселей - рисуйте многоугольник в том же режиме (массивы вершин и т. Д.), Или еслиВы рисуете без освещения / текстурирования, также можно нарисовать один прямоугольник всего экрана (быстрее, чем рисовать все вершины, и будут установлены только правильные пиксели многоугольника)
Если все идет хорошо, полигонправильно нарисованный, убедитесь, что после этой функции вы сбросили использование трафарета (тест трафарета) и / или очистили буфер трафарета, если вы также используете его для другой цели.