Génération de terrain sur GPU

9

Dans mon moteur, je crée un terrain infini en utilisant l'algorithme de bruit Perlin calculé sur CPU.

La création d'un terrain se déroule comme suit:

  • Si la caméra est proche d'un patch non chargé, créez-le
  • Calculer un réseau de bruit 513x513 avec des limites données
  • Calcul des normales, tangentes, binormales, indices
  • Passer des données à vbo

Avantages:

  • Ne doit être rendu qu'en cas de besoin
  • Collision facile à réaliser

Con

  • 64 correctifs 513x513 lents sont créés en 3,1s (un thread). Pour chaque tuile ~ 20ms de création de bruit, ~ 25ms sommets, normaux, tangents, bitangents, indices. Lorsque la caméra se déplace rapidement, l'utilisateur peut remarquer un chargement de tuiles.
  • consommant de la mémoire ???

Maintenant, je me demandais comment accélérer cela en générant du terrain complètement sur GPU Mais il y a quelques doutes:

  • Si les shaders exécutent chaque trame, cette perte de puissance de calcul n'est-elle pas pour calculer le bruit encore et encore? Cela peut être évité en écrivant le résultat dans la texture RBGA et utilisé plus tard dans le vertex shader pour le déplacement, mais augmente l'utilisation de la mémoire. Par contre si la création est super rapide, seules les tuiles visibles doivent rester en mémoire. Cependant, le détachement du tampon provoque une synchronisation gpu-cpu qui peut ralentir l'application (ai-je raison?)
  • Si le terrain n'est qu'une grille plate déplacée par un vertex shader, le même travail doit être effectué sur le CPU pour calculer la hauteur et la normale à un point donné pour la collision.
  • Ce n'est qu'un concept, mais pour accélérer le tout, je pensais à projeter la grille sur la fenêtre de façon à n'utiliser qu'une quantité minimale de sommets. Pensez-vous que cela fonctionnerait?

Ma dernière question est:

Quelle est la meilleure technique / la plus rapide / la plus largement utilisée pour créer un terrain infini sur GPU?

user1075940
la source
8
Notez simplement que la création d'un terrain sur le GPU rendra difficile la détection de collision, la détection de sélection ou à peu près tout type d'interaction avec le terrain.
MichaelHouse
1
Un shader de calcul (DX10 ou 11) peut être utilisé pour générer le terrain sur le GPU. Mais comme l'a déclaré Byte56, vous devrez retirer les valeurs du GPU pour interagir avec lui. msdn.microsoft.com/en-us/library/windows/desktop/…
UnderscoreZero
créer du terrain sur un GPU ressemble à une mauvaise idée pour moi. Cela pourrait fonctionner, mais je pense que cela fonctionnerait probablement un peu mieux si vous générez simplement le terrain du côté du processeur et envoyez les éléments de dessin standard au GPU.
Benjamin Danger Johnson
Juste mon expérience; En fait, je l'ai fait juste avec aparapi et j'ai réussi à faire ce putain de truc; mais en fait, cela a fini par être plus lent que le simple fait que le processeur fasse le travail. Je pense à cause de la surcharge d'envoi de données vers / depuis le GPU. Si je me souviens bien, le GPU ne fonctionne vraiment que si le calcul est grand par rapport à la taille des données (et aussi grand en termes absolus)
Richard Tingle
Cet article pourrait vous donner quelques idées http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Jeremiah Leslie

Réponses:

2

Eh bien, si je devais essayer d'utiliser le GPU pour une telle chose, je pense que j'irais pour compute / opencl / cuda.

Cependant, indépendamment de l'utilisation du GPU ou du CPU (ce que je fais réellement), je le ferais de manière asynchrone, décidant que vous avez besoin d'un nouveau terrain pour la trame actuelle est probablement trop tard (par exemple, considérez 1000ms / 60 = 16.666ms, et le cadre entier veut s'insérer dans cela).

Commencez à générer (ou à charger à partir de fichiers compressés) un terrain sur un thread de travail, et à le rendre disponible pour le reste du jeu et à le rendre une fois que ce travailleur a terminé, généralement ce sera la prochaine image, ou peut-être l'image suivante, donc le l'utilisateur ne remarquera pas vraiment la différence, mais cela rend les choses plus fluides.

Volonté
la source