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