Essentiellement, je veux supprimer la nécessité de générer un bruit cohérent du CPU vers le GPU. De là, je veux aussi générer le terrain pour un monde en trois dimensions en utilisant ce bruit comme densités en points de voxel. Après cela, je veux prendre ces densités et les polygoniser (générer des sommets) représentant le terrain du monde.
C'est bien et tout. Mais, je veux aussi déformer dynamiquement le monde en temps réel. Une fois arrivé à ce point, j'ai un problème à essayer de récupérer les sommets vers le CPU pour faire des choses comme la détection de collision et tous les calculs de jeu que je veux impliquer sur le CPU et non sur le GPU.
Donc, la question est: comment puis-je récupérer un sous-ensemble des sommets vers le CPU pour gérer les collisions, entre autres?
Et encore une question: existe-t-il un moyen facile de prendre un ensemble de sommets et d'en générer des indices sur le GPU?
Je ne sais pas trop quels types de shaders je devrais utiliser pour ces différentes choses. J'entends parler de personnes utilisant un pixel shader pour rassembler les densités, puis utilisant un geometry shader pour gérer la génération de terrain à partir des sommets, puis incorporant en quelque sorte un vertex shader pour effectuer les déformations dynamiques.
J'utilise C # 4.0, .NET 4.0 et XNA Game Studio 4.0.
Réponses:
Étant donné que XNA ne prend pas en charge les shaders de géométrie, je vais y répondre comme si vous utilisiez DX 10. Vous avez essentiellement trois options.
Shaders de géométrie Les shaders de géométrie peuvent réellement modifier et ajouter des sommets à un tampon de vertex. Vous pouvez lire ceci dans le CPU. Je ne l'ai pas examiné, mais c'est certainement possible.
Utilisez simplement le CPU Deuxièmement, pourquoi ne pas simplement le calculer sur le CPU? Le fait qu'il s'exécute sur le GPU dans les shaders suggère que votre algorithme de déformation est localisable, c'est-à-dire que vous pouvez facilement générer uniquement les parties pertinentes pour votre vérification de collision.
Par exemple, j'ai fait un jeu de voile il y a quelque temps. L'océan a utilisé les vertex et les shaders de géométrie pour déformer l'eau avec des vagues. J'ai utilisé le même algorithme calculé sur le CPU sur seulement quelques points sous le bateau pour le mouvement du bateau dans les vagues. Je suis sûr que vous pourriez faire quelque chose de similaire pour votre carte de voxels.
Pixel shaders La dernière option, vous l'avez également mentionnée dans votre question: générer les densités dans le pixel shader et l'écrire dans une texture 3D. Vous pouvez y accéder à partir du CPU et des shaders sans danger. Le pixel shader est parfait pour cette tâche, mais cette méthode a beaucoup de frais généraux. Rendu de la texture du volume, ainsi que l'échantillonnage de l'intérieur dans le sommet et la géo. shaders, et avoir à lire la texture sur le CPU.
Je ne connais pas les détails de votre projet, mais j'utiliserais toujours le CPU pour cela. Par tous les moyens, calculez également les densités sur les shaders, mais restez à utiliser la carte graphique pour le rendu.
la source