Как отрисовать кривую Безье второго порядка на GPU?

Друзья, передо мной стоит задача нарисовать сплайн Безье, состоящий из набора квадратичных кривых Безье (второго порядка, параболы) при помощи одной из технологий/платформ, работающих с GPU. Собственно профильная платформа это Adobe Flash Stage3D, но речь в вопросе идет об алгоритме, поэтому это не так важно. Важен лишь факт отсутствия каких-либо готовых решений в виде расширений/библиотек, которые, насколько я понимаю, имеют место быть, например, в OpenGl.
Одним из важных моментов является тот факт, что мне хотелось бы отказаться от триангуляции сегмента кривой и создания сложной геометрии из множества треугольников для одного конкретного сегмента, а обойтись одним (возможно несколькими) треугольником на сегмент. Причиной почему, надеюсь, это может быть возможно, является фиксированная толщина сегмента кривой - 1-2px, при длине кривой в десятки раз ее превышающей.
В настоящее время я использую алгоритм, описанный в работе Loop/Blinn research.microsoft.com/pubs/78197/p1000-loop.pdf или GPUGems3 http.developer.nvidia.com/GPUGems3/gpugems3_ch25.html
Сейчас фрагментный шейдер выглядит так:
float4 QuadraticPS(float2 p : TEXCOORD0,  
  float4 color : COLOR0) : COLOR  
{  
  // Gradients  
   float2 px = ddx(p);  
   float2 py = ddy(p);  
  // Chain rule  
   float fx = (2*p.x)*px.x - px.y;  
   float fy = (2*p.x)*py.x - py.y;  
  // Signed distance  
   float sd = (p.x*p.x - p.y)/sqrt(fx*fx + fy*fy);  
  // Linear alpha  
   float alpha = thickness - abs(sd);  
  if (alpha > 1)       // Inside  
    color.a = 1;  
  else if (alpha < 0)  // Outside  
    clip(-1);  
  else                   
  // Near boundary  
    color.a = alpha;  
    return color;  
}


что позволяет получать на выходе подобное изображение:
6d205380c7a44f838aade6ee098f2809.png

Как мы видим - было бы прекрасно, если бы мы могли получить сегмент кривой Безье в одном треугольнике - но на участках, близлежащих к углам, толщина линии меняется (поскольку часть ее как бы переходит в отрицательную область). Что при отображении реального сплайна приводит к следующему эффекту:

15898cbd45b64396830544640bad0e48.png

Подскажите пожалуйста каким образом можно решить данную проблему и можно ли действительно обойтись лишь несколькими треугольниками (для отображения "отрицательных" участков кривой рядом с углами)?

Любая помощь - на вес золота!
  • Вопрос задан
  • 637 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы