Рисование вогнутого многоугольника в OpenGL - PullRequest
6 голосов
/ 08 октября 2011

У меня есть вогнутый многоугольник, который мне нужно нарисовать в OpenGL.
Многоугольник определяется как список точек, которые формируют его внешнее кольцо, и список списков точек, которые определяют его внутренние кольца (зоны исключения).

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

Решение с Boost.Geometry будет хорошим, так как я уже интенсивно использую его в своем приложении.

Мне это нужно для работы на iPhone, а именно OpenGL ES (старая версия с фиксированным конвейером).

Как я могу это сделать?

Ответы [ 3 ]

6 голосов
/ 08 октября 2011

Попробуйте OpenGL средства тесселяции .Вы можете использовать его для преобразования сложного многоугольника в набор треугольников, которые вы можете визуализировать напрямую.

EDIT (в ответ на комментарий): OpenGL ES не поддерживает функции тесселяции.В этом случае, и если полигон представляет собой статические данные, вы можете создать тесселяцию в автономном режиме, используя OpenGL на своем настольном компьютере или ноутбуке.

Если форма динамическая, то вам не повезло с OpenGL ES.Однако существует множество библиотек (например, CGAL ), которые будут выполнять ту же функцию.

2 голосов
/ 14 апреля 2014

Это немного сложный и дорогостоящий метод, но любой вогнутый многоугольник можно нарисовать с помощью следующих шагов (обратите внимание, что этот метод наверняка работает на плоских многоугольниках, но я также предполагаю, что вы пытаетесь рисовать на плоской поверхности или в 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) для рисования правильных пикселей - рисуйте многоугольник в том же режиме (массивы вершин и т. Д.), Или еслиВы рисуете без освещения / текстурирования, также можно нарисовать один прямоугольник всего экрана (быстрее, чем рисовать все вершины, и будут установлены только правильные пиксели многоугольника)

Если все идет хорошо, полигонправильно нарисованный, убедитесь, что после этой функции вы сбросили использование трафарета (тест трафарета) и / или очистили буфер трафарета, если вы также используете его для другой цели.

0 голосов
/ 07 ноября 2012

Проверьте клей , который имеет функции тесселяции, которые могут обрабатывать вогнутые многоугольники.

...