В разрабатываемом приложении мы пытаемся переместить большую часть жестко закодированного кода 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 ++.
У кого-нибудь есть альтернативное решение / подсказка реализации, чтобы выполнить это?
Задача ещё не решена.
Других решений пока нет …