Desenho acelerado por hardware de formas curvas

11

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"?

Ecir Hana
fonte
2
Este artigo da GPU Gems rasteriza curvas quadráticas identificando partes do casco curvas e calculando analiticamente a cobertura no pixel shader. Vale a pena dar uma olhada: developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html
yuriks
2
@yuriks Sim, Loop e Blinn, esqueci completamente. Mas não é patenteado?
Ecir Hana
Veja também Gráficos vetoriais paralelos em massa , publicados no SIGGRAPH Asia 2014.
lhf 20/08/15
Entre as opções que você listou em sua pergunta e o artigo de Loop e Blinn, acho que você praticamente esgotou todas as possibilidades.
22615 Nathan Reed
Você pode ordenar uma linha como descrito aqui . Ou você pode triangular em um shader de computação.
Nikitablack 20/08/2015

Respostas:

2

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.

atb
fonte
3
Você pode melhorar essa resposta elaborando um pouco, ou até mesmo ligando para algo que explica melhor.
Nathan Reed
1
Uma maneira de expandir essa resposta seria abordar os inconvenientes mencionados pelo autor e explicar como sua abordagem os ajuda.
Trichoplax
0

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.

curva

Imagem 1 : Forma de curva acelerada HW (desenhada usando um triângulo) e fonte webgl

joojaa
fonte