Je fais donc du développement DirectX, en utilisant SharpDX sous .NET pour être exact (mais les solutions API DirectX / C ++ sont applicables). Je recherche le moyen le plus rapide de rendre les lignes dans une projection orthogonale (par exemple, simuler un dessin au trait 2D pour des applications scientifiques) à l'aide de DirectX.
Voici une capture d'écran des types de tracés que j'essaie de rendre:
Il n'est pas rare que ces types de tracés aient des lignes avec des millions de segments, d'épaisseur variable, avec ou sans anticrénelage par ligne (ou en plein écran AA activé / désactivé). J'ai besoin de mettre à jour les sommets des lignes très fréquemment (par exemple 20 fois / seconde) et de décharger autant que possible sur le GPU.
Jusqu'à présent, j'ai essayé:
- Rendu logiciel, par exemple GDI + en fait pas de mauvaises performances mais est évidemment lourd sur le CPU
- API Direct2D - plus lente que GDI, en particulier avec l'anticrénelage activé
- Direct3D10 utilisant cette méthode pour émuler AA en utilisant les couleurs de sommet et la pavage côté CPU. Aussi lent (je l'ai profilé et 80% du temps est consacré au calcul des positions des sommets)
Pour la 3ème méthode, j'utilise des tampons Vertex pour envoyer une bande triangulaire au GPU et la mise à jour toutes les 200 ms avec de nouveaux sommets. J'obtiens un taux de rafraîchissement d'environ 5 images par seconde pour 100 000 segments de ligne. J'ai besoin de millions idéalement!
Maintenant, je pense que le moyen le plus rapide serait de faire la tessellation sur le GPU, par exemple dans un Geometry Shader. Je pourrais envoyer les sommets sous forme de liste de lignes ou regrouper dans une texture et décompresser dans un Geometry Shader pour créer les quads. Ou, envoyez simplement des points bruts à un pixel shader et implémentez le dessin Bresenham Line entièrement dans un pixel shader. Mon HLSL est rouillé, shader model 2 de 2006, donc je ne sais pas ce que les GPU modernes peuvent faire de fou.
La question est donc: - quelqu'un a-t-il déjà fait cela, et avez-vous des suggestions à essayer? - Avez-vous des suggestions pour améliorer les performances avec une mise à jour rapide de la géométrie (par exemple une nouvelle liste de sommets toutes les 20 ms)?
MISE À JOUR 21 janvier
J'ai depuis implémenté la méthode (3) ci-dessus en utilisant des shaders de géométrie en utilisant LineStrip et Dynamic Vertex Buffers. Maintenant, j'obtiens 100FPS à 100k points et 10FPS à 1000000 points. C'est une énorme amélioration, mais maintenant je suis à taux de remplissage et à calcul limité, j'ai donc pensé à d'autres techniques / idées.
- Qu'en est-il de l'instanciation matérielle d'une géométrie de segment de ligne?
- Qu'en est-il de Sprite Batch?
- Qu'en est-il des autres méthodes orientées (Pixel shader)?
- Puis-je éliminer efficacement le GPU ou le CPU?
Vos commentaires et suggestions très appréciés!