Я рисую много квадратичных кривых Безье в моей программе 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, который бы принимал контрольные точки и унифицированную переменную thickness
, чтобы сделать кривые более толстыми.Сначала я думал о создании только пиксельного шейдера, который бы окрашивал только пиксели на расстоянии thickness / 2
от кривой, но для этого требуется решить полином третьей степени, и выбор между тремя решениями внутри шейдера не выглядит каклучшая идея когда-либо.
Затем я попытался посмотреть, если другие люди уже сделали это.Я наткнулся на белую бумагу Лупа и Блинна из Microsoft Research , где ребята показывают простой способ заполнения области под кривой.Несмотря на то, что он хорошо работает в этой степени, у меня возникают проблемы с адаптацией идеи к рисованию между двумя кривыми роста.
Найти граничные кривые, которые соответствуют одной кривой, довольно просто с помощью геометрического шейдера.Проблемы приходят с фрагментным шейдером, который должен заполнить все это.Их подход использует интерполированные текстурные координаты, чтобы определить, находится ли фрагмент над или под кривой;но я не мог придумать способ сделать это с двумя кривыми (я довольно плохо знаком с шейдерами и не специалист по математике, поэтому тот факт, что я не понял, как это сделать, конечно, не означает, что это невозможно).
Моей следующей идеей было разделить заполненную кривую на треугольники и использовать только фрагментный шейдер Безье на внешних частях.Но для этого мне нужно разделить внутреннюю и внешнюю кривые в разных точках, и это снова означает, что мне нужно решить уравнение, что на самом деле не вариант.
Существуют ли жизнеспособные алгоритмы для обводки квадратичного Безьекривые с шейдером?