Como desenhar rapidamente uma forma curva?
por "rapidamente", presumo que se deva usar as instalações de hardware o máximo possível
por "curvado", quero dizer limites definidos por curvas de Bezier quadráticas ou cúbicas
Por "forma", quero dizer um golpe "gordo" (ou seja, com mais de 1 px de largura) ou um "polígono curvo 2D" preenchido com um número ímpar / diferente de zero, possivelmente com orifícios (por exemplo, letra "O")
Estou perguntando, porque as opções que conheço têm várias desvantagens:
triangular a forma e enviá-la para o OpenGL - faz o trabalho mais difícil na CPU e pode usar muitos / poucos triângulos (por exemplo, desperdício / grosso)
atlas de textura - tem que recalcular / fazer upload da textura a cada alteração (forma, escala, rotação, ...)
Campo de distância assinado - em grandes escalas, os detalhes não ficam bonitos ou precisam recalcular / fazer upload da textura
NV_path_rendering - poderia ser, se não estivesse funcionando apenas nas placas da Nvidia
OpenVG - poderia ser, se não estivesse funcionando apenas em dispositivos móveis
?
* Parece-me que o OpenVG não está exatamente avançando, para dizer o mínimo. Alguém sabe alguma coisa sobre suas perspectivas futuras? Vale a pena ficar de olho nos dias atuais?
** O OpenGL 4+ fornece meios de mosaico em tempo real de polígonos. De alguma forma, poderia ser usado para refinar a malha da opção "triangular" para que o limite da forma pelo menos não pareça "inclinado"?
fonte
Respostas:
Você pode usar os sombreadores de mosaico OpenGl 4.x para converter pontos de controle de Bezier em polígonos.
Uma pesquisa no google por "tessellation shader bezier" encontrou este esboço descrevendo o tessellation de superfícies e curvas de Bezier:
http://web.engr.oregonstate.edu/~mjb/cs519/Handouts/tessellation.1pp.pdf
Isso descarrega a avaliação de Bezier da CPU para a GPU e reduz o fluxo de dados através do barramento.
fonte
Pode-se fazer desenho curvo com hardware. Há um método descrito no GPU Gems 3 que descreve como fazer isso. O usuário @yuriks realmente comenta isso. Na verdade, fiz uma demonstração rápida e suja para você dar uma olhada.
Imagem 1 : Forma de curva acelerada HW (desenhada usando um triângulo) e fonte webgl
fonte