Desenhar curva quadrática na GPU
Minha tarefa é renderizar a curva quadrática de Bezier (caminho) por meio da tecnologia Stage3d (Adobe Flash), que não possui extensões para esse desenho pronto para uso (enquanto o OpenGl o possui, como eu sei). Sim, existe um Starling-Extension-Graphics, mas ele usa um método simples para dividir um segmento de curva em muitas linhas retas, que gera muitos triângulos para o meu caminho de curva longa.
Portanto, existe uma maneira perfeita de renderizar formas independentes de resolução para Loop e Blinn. Eu li o artigo GPUGems3 (gpugems3_ch25.html) e enviei esse shader de fragmento para AGAL2:
Shader de pixel de curva quadrática
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;
}
Funciona. Mas existem dois problemas fundamentais:
Eu não entendo esse algoritmo :(. Eu li sobre campo de distância assinado, derivadas e outras ... Pensei muitas horas e li novamente - mas sem resultado! Minha pergunta é:Alguém me ajuda e explica o que acontece nesse sombreador (linha por linha (!), Se possível)?
O segundo problema é quea curva é cortada no canto do triângulo e tem uma espessura variável. Por favor, olhe a imagem:https://monosnap.com/file/84EBOuQ1czNM5lprQ5VlnRUKP2mKmW Então, se eu traçar um caminho, fica assim:https://monosnap.com/file/54Zs5Xui6s3BL6lNdZRCx9ibcV2bCF
Eu gosto desse método usando um triângulo por segmento de curva, porque nenhuma geometria é necessária. E não preciso ter curvas muito grossas (1-2 px é excelente), mas uma espessura variável é um problema. Alguém pode me ajudar?
(Desculpe pelo meu inglês. Não é minha língua nativa.)
edit1 por Spektre acabou de mudar de comentário e resposta inválida
Eu pretendo usar um triângulo por segmento de uma curva, algo como na imagem
o caminho consiste em muitos triângulosum por segmento de caminho (curva quadrática)Como lidar com problemas com essa abordagem se todos os pontos de controle são colineares (ficam na mesma reta) ou quase colineares?