Я рисую много квадратичных кривых Безье в моей программе OpenGL. Прямо сейчас кривые являются тонкотонными и с программным обеспечением, потому что я нахожусь на довольно ранней стадии, и этого достаточно, чтобы увидеть, что работает.
Достаточно просто, учитывая 3 контрольные точки (P 0 до P 2), я оцениваю следующее уравнение с t, изменяющимся от 0 до 1 (с шагом 1/8) в программном обеспечении и используйте GL_LINE_STRIP
для их соединения:
B (t) = (1 - t) 2 P 0 + 2 (1 - t) tP 1 + t 2 P <суб > 2суб >
Где B
, очевидно, получается двумерный вектор.
Этот подход работал "достаточно хорошо", так как даже мои самые большие кривые не нуждаются в более чем 8 шагах, чтобы выглядеть изогнутыми. Тем не менее, тонкие кривые одного пикселя уродливы.
Я хотел написать шейдер GLSL, который бы принял контрольные точки и единую переменную thickness
, чтобы, к тому же, сделать кривые более густыми. Сначала я подумал о создании пиксельного шейдера, который будет окрашивать только пиксели в пределах расстояния thickness / 2
кривой, но для этого требуется решение полинома третьей степени, и выбор между тремя решениями внутри шейдера не похож на лучшая идея когда-либо.
Затем я попытался найти, если другие люди уже это сделали. Я наткнулся на белую бумагу Loop и Blinn из Microsoft Research, где ребята показывают простой способ заполнить область под кривой. В то время как это работает хорошо до такой степени, мне трудно адаптировать идею к рисованию между двумя кривыми боудинга.
Поиск ограничивающих кривых, соответствующих одной кривой, довольно просто с геометрическим шейдером. Проблемы связаны с фрагментарным шейдером, который должен заполнить все это. Их подход использует интерполированные координаты текстуры, чтобы определить, падает ли фрагмент или под кривой; но я не мог понять, как это сделать с двумя кривыми (я довольно новичок в шейдерах, а не эксперт по математике, поэтому факт, что я не понял, как это сделать, конечно, не означает, что это невозможно).
Моя следующая идея заключалась в том, чтобы разделить заполненную кривую на треугольники и использовать шейдер фрагмента Bézier на внешних частях. Но для этого мне нужно разбить внутреннюю и внешнюю кривые на переменные пятна, и это снова означает, что я должен решить уравнение, что на самом деле не является вариантом.
Существуют ли жизнеспособные алгоритмы для поглаживания квадратичных кривых Безье с шейдером?