Desempenho de gráficos vetoriais versus gráficos de bitmap ou raster


20

Às vezes eu uso gráficos vetoriais, simplesmente porque eles parecem um pouco mais agradáveis ​​em alguns casos e outras vezes, uso gráficos bitmap / raster.

Eu queria saber, há alguma diferença significativa de desempenho entre essas duas opções?


6
Realmente, depende de muitos fatores. A NVIDIA fornece aceleração de hardware para gráficos vetoriais. Você viu isso? developer.nvidia.com/nv-path-rendering-videos
TheBuzzSaw

Respostas:


15

Como o TheBuzzSaw disse, depende de muitas coisas, incluindo implementações de gráficos rasterizados versus gráficos vetoriais.

Aqui estão alguns métodos gráficos de vetor de alto desempenho que são renderizados usando métodos tradicionalmente de rasterização.

Loop e Blinn mostram como renderizar uma curva quadrática de bezier de gráficos vetoriais renderizando um único triângulo e usando as coordenadas de textura em um pixel shader para dizer se um pixel está acima ou abaixo da curva: http: //www.msr-waypoint. net / pt-br / um / pessoas / cloop / LoopBlinn05.pdf

A idéia básica é que você defina as posições dos cantos dos triângulos para serem as três posições dos pontos de controle e defina as coordenadas da textura em cada canto como (0,0), (0,5,0) e (1,1), respectivamente. No seu sombreador, se a coordenada de textura interpolada (x * xy) for <0, o pixel estará abaixo da curva, caso contrário, estará acima da curva.

Você pode ver uma implementação falsa dele no shadertoy aqui: https://www.shadertoy.com/view/4tj3Dy

Quanto ao segundo método, aqui está um método da Valve, onde as distâncias de uma forma são armazenadas em uma textura, em vez de dados de pixel, permitindo que gráficos vetoriais sejam desenhados usando amostragem de textura. A decodificação é tão simples que pode ser implementada mesmo em hardware de função fixa usando apenas um teste alfa! http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

Para ter uma idéia de como a segunda técnica funciona, essa imagem de bigode de 1024x768 foi gerada a partir de uma imagem de origem de 64x32 que tinha um único canal de cor! (também conhecido como 2 KB descompactado)

insira a descrição da imagem aqui

Também escrevi algumas coisas sobre isso no meu blog: http://blog.demofox.org/2014/06/06/30/distance-field-textures/

Aqui está um exemplo de código OpenCL para mostrar como é simples:

float alpha = read_imagef(tex3dIn, g_textureSampler, textureCoords).w;
float3 color = (alpha < 0.5f) ? (float3)(1.0f) : (float3)(0.0f);

Ambas as técnicas são super rápidas e obscurecem um pouco a linha entre gráficos vetoriais e rasterizados. Eles são renderizados usando técnicas de rasterização, mas possuem propriedades de zoom / redimensionamento, como técnicas de gráficos vetoriais.



Sim, essa é uma técnica muito legal, que é a segunda técnica que mencionei, e também faço o link para o mesmo pdf acima.
Alan Wolfe

Woops, perdi, desculpe.
internets é feito de catz

11
Uma solução adaptativa para a suavização de borda dos campos de distância pode ser encontrada aqui: essentialmath.com/blog/?p=151 .
Jim Van Verth

8

Pode haver.

Resposta menos técnica:

Se você está construindo um site ou outro aplicativo em que você não tem nada a ver com a programação gráfica, a resposta provavelmente é sim. As APIs subjacentes tentarão adivinhar como renderizá-las e armazená-las em cache com eficiência. No entanto, à medida que o aplicativo é executado e a API às vezes adivinha incorretamente, pode ser necessário renderizar novamente as coisas e afetar o desempenho.

Mais técnico:

Lembre-se de que, a menos que você esteja usando uma das GPUs mais recentes e uma biblioteca para desenhar os caminhos de vetor na GPU, todas as texturas de bitmap serão renderizadas pela GPU.

Considerarei o caso típico em que os gráficos vetoriais são renderizados em texturas. Aqui, o desempenho dependerá da sua cadeia de ferramentas, se seu aplicativo está criando dinamicamente texturas a partir dos ativos vetoriais e se os gráficos são visualizados em vários níveis de zoom. Há duas questões envolvidas: recursos e geração de textura. Se você estiver exibindo apenas os gráficos em um tamanho estático, eu diria que não há diferença e talvez sua cadeia de ferramentas possa converter os ativos em gráficos de bitmap antes do tempo de execução. No entanto, se eles estiverem sendo exibidos em vários tamanhos ou em um mundo 3D, você precisará de texturas mapeadas mip que consomem mais memória. Eles levarão muita memória se você realmente quiser ver a fidelidade deles 'de perto' com uma textura maior.

Eu espero que isso ajude.


6

Existem algumas maneiras de renderizar gráficos vetoriais. Como o TheBuzzSaw menciona, a NVIDIA possui uma extensão que pode renderizar caminhos gerais muito rapidamente (mas é claro que funciona apenas nas GPUs NVIDIA). E Alan Wolfe menciona os métodos implícitos de superfície (campos Loop-Blinn / distance), que definem uma função que diz se você está dentro ou fora de uma forma e colorem os pixels com base nessa função. Outro método é estêncil-e-capa, onde você processa o caminho em um buffer de estêncil e usa a contagem de pares ímpares para determinar se o caminho cobre um pixel.

Em geral, no entanto, a desvantagem é que a renderização raster será mais rápida, mas é mais suscetível ao alias (até mesmo os campos de distância quebram em escalas baixa e alta). Os caminhos de renderização exigem muita configuração, mas em teoria podem ser dimensionados para qualquer resolução.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.