Аппаратно-ускоренное рисование изогнутых фигур

11

Как быстро нарисовать изогнутую форму?

  • «быстро» я предполагаю, что нужно максимально использовать аппаратные средства

  • под «изогнутыми» я подразумеваю границы, определенные либо квадратичными, либо кубическими кривыми Безье

  • под «формой» я подразумеваю либо «толстый» штрих (т. е. шириной более 1 пикселя), либо четно-нечетный / ненулевой заполненный «2D-изогнутый многоугольник», возможно, с отверстиями (т. е. буква «О»)

Я спрашиваю, потому что у вариантов, которые я знаю, есть несколько недостатков:

  • триангуляция формы и отправка ее в OpenGL - выполняет самую сложную работу с процессором и может использовать слишком много / мало треугольников (т. е. расточительно / грубо)

  • Атлас текстуры - должен пересчитывать / загружать текстуру при каждом изменении (форма, масштаб, поворот, ...)

  • Поле расстояния со знаком - в больших масштабах детали выглядят не очень красиво или должны пересчитать / загрузить текстуру

  • NV_path_rendering - могло бы быть, если бы он не работал только на картах Nvidia

  • OpenVG - могло бы быть, если бы он не работал только на мобильном телефоне

  • ?


* Мне кажется, что OpenVG, мягко говоря, движется не совсем вперед. Кто-нибудь знает что-нибудь о его будущих перспективах? Стоит ли вообще следить за сегодняшним днем?

** OpenGL 4+ предоставляет возможность тесселяции полигонов на лету. Можно ли его как-то использовать для уточнения сетки из опции «триангуляция», чтобы граница формы, по крайней мере, не выглядела «под углом»?

Ecir Hana
источник
2
Эта статья GPU Gems растеризует квадратичные кривые отождествлением части корпуса , которые изогнуты и аналитически вычисления охвата в пиксельный шейдер, может быть стоит посмотреть: developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html
yuriks
2
@yuriks Да, Loop & Blinn, совсем забыл об этом. Но разве это не запатентовано?
Ecir Hana
Смотрите также массивно-параллельных векторной графики , опубликованной в SIGGRAPH Азии 2014.
LHF
Между вариантами, которые вы перечислили в своем вопросе, и документами Loop и Blinn, я думаю, вы в значительной степени исчерпали все возможности.
Натан Рид
Вы можете тесселяции линии, как описано здесь . Или вы можете триангулировать в вычислительном шейдере.
nikitablack

Ответы:

2

Вы можете использовать тесселяционные шейдеры OpenGl 4.x для преобразования контрольных точек Безье в полигоны.

Поиск в Google по запросу «shaz bezier тесселяции» обнаружил эту схему, описывающую тесселяцию поверхностей и кривых Безье:

http://web.engr.oregonstate.edu/~mjb/cs519/Handouts/tessellation.1pp.pdf

Это переносит оценку Безье с ЦП на ГП и уменьшает поток данных по шине.

ATB
источник
3
Вы можете улучшить этот ответ, немного уточнив или даже просто добавив ссылку на что-то, что объясняет дальше.
Натан Рид
1
Одним из способов расширения этого ответа было бы устранить недостатки, о которых упоминает автор, и объяснить, как ваш подход помогает в этом.
Трихоплакс
0

Можно сделать изогнутый рисунок с помощью оборудования. В GPU Gems 3 описан метод , описывающий, как это сделать. Пользователь @yuriks фактически комментирует это. Я на самом деле сделал быстрое грязное демо для вас, чтобы посмотреть.

кривая

Рисунок 1 : HW ускоренное формирование кривой (нарисовано с использованием треугольника) и источник webgl

joojaa
источник