Преобразовать замкнутую кривую Безье в виде связного множества Coons Patch

В разрабатываемом приложении мы пытаемся переместить большую часть жестко закодированного кода OpenGL в Skia.
Одна вещь все еще мешает нам сделать это, поскольку я не знаю, возможно ли это в Скиа.

В какой-то момент нам нужно визуализировать фигуры такого типа (см. Скриншот ниже):

введите описание изображения здесь

Все внутри «основной» замкнутой кривой Безье — сплошной цвет, указанный пользователем, и все
между «основной» и «внешней» замкнутой кривой Безье находится наклонная плоскость, где контрольные точки снаружи имеют черный и прозрачный цвет.

В настоящее время наша реализация делает следующее:

1) Разделите 2 кривые Безье на достаточное количество шагов, чтобы они не были видны при разрешении рендеринга

2) Тесселяйте внутренний безье, который теперь является многоугольником, на треугольники, веерные треугольники и полосы треугольников: отправьте эти примитивы в OpenGL напрямую сплошным цветом

3) Тесселяйте вручную область между внутренним и внешним полигонами, постепенно перебирая края по мере необходимости в виде треугольников или веерных треугольников. Отправьте эти примитивы в OpenGL с правильным цветом вершин, и специальный шейдер фрагментов применяется для вычисления Ramp с предоставленными пользователем параметрами (Fall-off, Ramp type и т. Д. ….)

Первый непривлекательный подход состоял бы в том, чтобы сохранить рабочий процесс тесселяции и каким-то образом внедрить его в середине других операций Skia, либо в виде необработанного OpenGL, либо с помощью API Skia … но есть ли способ применить фрагментные шейдеры GLSL и загрузить Примитивы OpenGL?

Я предпочел бы найти более общее решение, которое не полагается на обходные пути, созданные в Skia API.

Одним из возможных подходов к переносу этого на Skia будет использование Кунс патч вместо того, чтобы тесселить в треугольниках самостоятельно: у нас все внутри внутреннего замкнутого Безье будет разбито на патчи Кунса и все между 2 сплайнами, как патчи Кунса. Это позволило бы Skia сделать плавную растеризацию.

Однако я не знаю простого способа добиться преобразования замкнутой кривой Безье в набор невырожденных патчей Кунса.
Единственное, что я мог найти в Интернете, это Библиотека асимптот которая является реализацией эта исследовательская работа. Однако реализация тесно связана с Asymptote и требует много времени для извлечения в надлежащий C ++.

У кого-нибудь есть альтернативное решение / подсказка реализации, чтобы выполнить это?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]