2010-08-20 5 views
2

Я рисую двумерные, вогнутые, иногда многоконтурные, иногда самопересекающиеся многоугольники с OpenGL. Вот пример: alt textЕсть ли лучший способ сделать это?

Прямо сейчас, я беру очки, которые, если связанные приведет к контуру полигона. Затем я помещаю их в GLUTesselator, где выходят треугольники. Затем я делаю текстурные координаты и текстуру полигона.

Абсолютный самый медленный компонент - это тесселяция/триангуляция. Учитывая, что мне просто нужно нарисовать их, как вы видите, каковы более быстрые альтернативы триангуляции? Могу ли я найти алгоритм рисования, который бы соответствовал пикселю?

Благодаря

+1

как это связано с C++? – Chubsdad

+0

Мое приложение написано на C++, и много алгоритмов может быть слишком, поэтому я не хочу ограничивать свои результаты. – jmasterx

ответ

1

Сначала более простая задача: предположим, что вы просто хотите использовать один цвет. Вы можете начать со списка контуров, а затем просмотреть все окно за строкой и столбцом: всякий раз, когда вы пересекаете границу, вы увеличиваете или уменьшаете (в зависимости от смысла пересечения) счетчик how_many_outlines_am_I_inside. Когда он равен нулю, нарисуйте белый пиксель, иначе нарисуйте его зеленым (и, я думаю, черный для самой границы). Это правильно обработает самопересекающиеся кривые.

Теперь для оттенков. Судя по вашему примеру, затенение равномерно по вертикали, но изменяется горизонтально, масштабируется до полной ширины контура. Таким образом, вместо простого счетчика вам понадобится стек (я рекомендую stl :: list) контуров, чтобы вы могли отслеживать, какой контур (из тех, что вы внутри), сверху, так что вы можете вычислить какую часть расстояния вы покрыли от x мин до x max. Наконец, для полупрозрачности (как при частичной видимости звезды через прямоугольник): вам придется самим решать правила, я не могу вывести их из глазного яблока, но стек должен облегчить его реализацию.

Хотите помочь с кодом на C++?

+0

Ну, я сделал еще несколько поисков и обнаружил, что существует технология, использующая буфер трафарета. Я попробую это, и если это то, что я ищу, я вернусь к вам :) – jmasterx

+0

Я думаю, что он рисует один полигон за раз - я не вижу необходимости в стеке. –

+0

@Tom Sirgedas: мой метод включает в себя окраску по одному пикселю за раз, поэтому ему нужен стек. Подумайте об этом, есть интересные интересные трюки, которые можно попробовать ... – Beta

Смежные вопросы