Performances des graphiques vectoriels par rapport aux graphiques bitmap ou raster


20

Parfois, j'utilise des graphiques vectoriels, simplement parce qu'ils sont légèrement plus beaux dans certains cas, et d'autres fois, j'utilise des graphiques bitmap / raster.

Je me demandais, y a-t-il des différences de performances significatives entre ces deux options?


6
En réalité, cela dépend de nombreux facteurs. NVIDIA fournit une accélération matérielle pour les graphiques vectoriels. L'AS tu vu? developer.nvidia.com/nv-path-rendering-videos
TheBuzzSaw

Réponses:


15

Comme l'a dit TheBuzzSaw, cela dépend de beaucoup de choses, y compris les implémentations des graphiques tramés par rapport aux graphiques vectoriels.

Voici quelques méthodes graphiques vectorielles hautes performances qui sont rendues à l'aide de méthodes de tramage traditionnelles.

Loop et Blinn montrent comment rendre une courbe de Bézier quadratique de graphiques vectoriels en rendant un seul triangle et en utilisant les coordonnées de texture dans un pixel shader pour dire si un pixel est au-dessus ou en dessous de la courbe: http: //www.msr-waypoint. net / en-us / um / people / cloop / LoopBlinn05.pdf

L'idée de base est que vous définissez les positions de vos coins triangulaires comme étant les 3 positions des points de contrôle et que vous définissez les coordonnées de texture à chaque coin à (0,0), (0,5,0) et (1,1) respectivement. Dans votre shader, si la coordonnée de texture interpolée (x * xy) est <0, le pixel est sous la courbe, sinon il est au-dessus de la courbe.

Vous pouvez voir une fausse implémentation de celui-ci sur shadertoy ici: https://www.shadertoy.com/view/4tj3Dy

En ce qui concerne la deuxième méthode, voici une méthode de Valve, où les distances à une forme sont stockées dans une texture, au lieu de données de pixels, permettant de dessiner des graphiques vectoriels en utilisant l'échantillonnage de texture. Le décodage est si simple qu'il pourrait être implémenté même sur du matériel à fonction fixe en utilisant uniquement un test alpha! http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

Pour vous donner une idée de l'efficacité de la deuxième technique, cette image de moustache 1024x768 a été générée à partir d'une image source 64x32 qui avait un canal de couleur unique! (alias 2 Ko non compressé)

entrez la description de l'image ici

J'ai également écrit quelques trucs à ce sujet sur mon blog: http://blog.demofox.org/2014/06/30/distance-field-textures/

Voici quelques exemples de code OpenCL pour montrer à quel point c'est simple:

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

Ces deux techniques sont super rapides et brouillent un peu la ligne entre les graphiques vectoriels et tramés. Ils sont rendus à l'aide de techniques de pixellisation, mais ont des propriétés de zoom / mise à l'échelle comme les techniques de graphiques vectoriels.



ouais c'est une technique très cool, c'est la deuxième technique que j'ai mentionnée, et je mets aussi un lien vers le même pdf ci-dessus.
Alan Wolfe

Woops, il a manqué, désolé.
internets sont en catz

1
Une solution adaptative pour l'anti-crénelage de bord des champs de distance peut être trouvée ici: essentialmath.com/blog/?p=151 .
Jim Van Verth

8

Il pourrait y avoir.

Réponse moins technique:

Si vous créez un site Web ou une autre application où vous n'avez rien à voir avec la programmation graphique, la réponse est probablement oui. Les API sous-jacentes essaieront de deviner comment les rendre et les mettre en cache efficacement. Cependant, lorsque votre application s'exécute et que l'API devine parfois de manière incorrecte, il peut être nécessaire de restituer les choses et d'affecter les performances.

Plus technique:

Gardez à l'esprit qu'à moins que vous n'utilisiez l'un des GPU les plus récents et une bibliothèque pour dessiner les chemins vectoriels sur le GPU, toutes les textures bitmap sont rendues par le GPU.

Je considérerai le cas typique où les graphiques vectoriels sont rendus en textures. Ici, les performances dépendent de votre chaîne d'outils, de la création dynamique de textures de votre application à partir des ressources vectorielles et de l'affichage des graphiques à différents niveaux de zoom. Il y a deux problèmes impliqués: les ressources et la génération de texture. Si vous affichez uniquement les graphiques à une taille statique, je dirais qu'il n'y a pas de différence et que votre chaîne d'outils peut convertir les actifs en graphiques bitmap avant l'exécution. Cependant, s'ils sont affichés dans différentes tailles ou dans un monde 3D, vous aurez besoin de textures mappées qui prennent plus de mémoire. Ils prendront beaucoup de mémoire si vous voulez vraiment voir leur fidélité de près avec une texture plus grande.

J'espère que ça aide.


6

Il existe plusieurs façons de rendre des graphiques vectoriels. Comme TheBuzzSaw le mentionne, NVIDIA a une extension qui peut rendre les chemins généraux assez rapidement (mais bien sûr, cela ne fonctionne que sur les GPU NVIDIA). Et Alan Wolfe mentionne les méthodes de surface implicites (Loop-Blinn / champs de distance), qui définissent une fonction qui dit si vous êtes à l'intérieur ou à l'extérieur d'une forme, et colorent les pixels en fonction de cette fonction. Une autre méthode est le pochoir et la couverture, où vous rendez le chemin dans un tampon de pochoir et utilisez le nombre pair-impair pour déterminer si le chemin couvre un pixel.

En général, cependant, le compromis est que le rendu du raster sera plus rapide, mais est plus sensible à l'aliasing (même les champs de distance se décomposent à des échelles basses et hautes). Les chemins de rendu nécessitent beaucoup de configuration, mais en théorie, ils peuvent être mis à l'échelle à n'importe quelle résolution.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.