Можно ли сузить квадратичную кривую Безье, используя только графический процессор?

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

Достаточно просто, учитывая 3 контрольные точки ( P 0 до P 2 ), я оцениваю следующее уравнение с t , изменяющимся от 0 до 1 (с шагом 1/8) в программном обеспечении и использую GL_LINE_STRIP , чтобы связать их вместе:

B ( t ) = (1 - t ) 2 P 0 + 2 (1 - t ) t P 1 + t 2 P 2

Где B , очевидно, приводит к двумерному вектору.

Этот подход работал «достаточно хорошо», поскольку даже мои самые большие кривые не требуют более 8 шагов, чтобы выглядеть изогнутыми. Тем не менее, тонкие кривые в один пиксель уродливы.

Я хотел написать шейдер GLSL, который принимал бы контрольные точки и переменную однородной толщины , чтобы сделать кривые толще. Сначала я думал о создании только пиксельного шейдера, который бы раскрашивал только пиксели в пределах толщины / 2 расстояния от кривой, но для этого нужно было решить полином третьей степени и выбрать одно из трех решений внутри шейдера. не похоже, что это лучшая идея.

Затем я попытался узнать, сделали ли это уже другие люди. Я наткнулся на технический документ Лупа и Блинна из Microsoft Research , в котором ребята показывают простой способ заполнения области под кривой. Хотя до такой степени это работает хорошо, я у меня возникли проблемы с адаптацией идеи к рисованию между двумя кривыми строения.

Найти ограничивающие кривые, которые соответствуют одной кривой, довольно легко с геометрическим шейдером. Проблемы возникают с фрагментным шейдером, который должен заполнить все это целиком. Их подход использует интерполированные координаты текстуры, чтобы определить, падает ли фрагмент над кривой или под ней; но я не мог придумать, как это сделать с двумя кривыми (я новичок в шейдерах и не специалист по математике, поэтому тот факт, что я не понял, как это сделать, определенно не означает, что это невозможно).

Моей следующей идеей было разделить кривую с заливкой на треугольники и использовать шейдер фрагмента Безье только на внешних частях. Но для этого мне нужно разделить внутреннюю и внешнюю кривые в разных местах, и это снова означает, что мне нужно решить уравнение, что на самом деле не вариант.

Существуют ли жизнеспособные алгоритмы для обводки квадратичных кривых Безье с помощью шейдера?

14
задан zneak 5 April 2011 в 13:21
поделиться