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