Задать вопрос

Как отрисовать кривую Безье второго порядка на 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

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

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

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

Похожие вопросы