IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

[ Jogl ] Particle System & displayList


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut [ Jogl ] Particle System & displayList
    Bonjour,

    Je développe un moteur de particule. et bosse actuellement sur qq optimisations. Pour l'instant j'arrive a gerer 10.000 particules avec un frameRate de 30 sec environs. Je ne sais pas si c'est un bon score ou non...

    Bref, a l'heure actuelle je n'utilise aucunes display list pour afficher les particules. J'ai tenter la chose suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    public void drawObjet(GL gl, float counter) {
     
    		if (!getGroupe().isThereParticleAlive()) {
    			return;
    		}
     
    		// On gere les transformations pour le groupe de particule
    		// sauvegarde de la matrice pour la translation au centre
    		gl.glPushMatrix();
    		// on effectue la translation pour placer le solide au centre du repere
    		gl.glTranslated(-position.getX(), -position.getY(), -position.getZ());
     
    		for (Particle particle : getGroupe().getParticules()) {
    			// particule encore en vie
    			if (!particle.isAlive()) {
    				continue;
    			}
     
    			// if (displayList.isCreated()) {
    			// displayList.callList(gl);
    			// continue;
    			// }
    			//
    			// displayList.initNumList(gl);
     
    			// On gere les transformations de la particule en question
    			gl.glPushMatrix();
     
    			gl.glTranslated(-particle.getPosition().getX(), -particle.getPosition().getY(), -particle
    					.getPosition().getZ());
     
    			// dessine la particule
    			basicRenderer.display(particle, gl);
     
    			// on restaure la matrice
    			gl.glPopMatrix();
    		}
     
    		// on restaure la matrice
    		gl.glPopMatrix();
    	}
    L'idée serait d'associer au mm numéro de liste les différentes particules. Ensuite je suis perdu avec les transformations et les déplacements individuelles de mes particules.

    Suis je sur la bonne voie ?
    Avez vous des conseils pour améliorer mon idée ???


    D'avance merci

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut
    PS : le basicRender.display(...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		gl.glColor3f(1, 0, 0);
    		gl.glRectf(-SIZE, -SIZE, SIZE, SIZE);
    		gl.glColor3f(0.0f, 0.0f, 0.0f);

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Par défaut
    Moi, ce que je proposerai, c'est de creer un vertex array qui contient absolument tous les sommets de ton systeme de particules. En gros, tu aurais toutes tes particules regroupées en un seul mesh, ce qui eviterait de spammer le driver de petites commandes de dessin. Ca veut par contre dire que tu dois créer et remplir le tableau toi meme: il te faut un tableau de 4*nbParticles*3 floats (4 parce que tu as 4 points par particule, et 3 parce que tu es en 3D), mais surtout, il faut que tu fasses en sorte que les 4 sommets créent un plan parallele a la camera (pour ca, tu peux utiliser la view matrix qui te donnent les vecteurs horizontaux et verticaux).
    Sinon, quelques conseils generaux:
    -penses a trier tes particules par distance relative a la camera si tu veux gerer la transparence proprement: les objets lointains doivent etre dessinés les premiers.
    -evite les allocations memoires a tout prix. Il vaut mieux créer un tableau de particules trop large une fois plutot que de créer des tableaux parfaits a chaque frame.

  4. #4
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut
    Ok pour les infos,
    il faut que je me renseigne sur la notion de "mesh" et vertexarray
    Je pensais que les vertex array et vbo était plus utile pour des structures plus complexes (avec beaucoup de polygones...)

    A l'heure actuel je gere ça à l'anciene.
    Monidée est de gerer le systeme dans son ensemble pour déplacer, orienter... l'ensemble de particule.
    A l'interieur de ce systeme, j'ai encore la possibilité d'animer chaque particule individuellement.
    L'animation "se contente" de mettre à jour la position de la particule.
    A la fin il ne mereste qu'a dessiner la particule. Je peux ainsi decider du style de réprésentation de la particule. Ici je dessine un rectangle, car je ne vois rien avec des points... (ca reste un mystere, probleme d'échelle ???)

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Par défaut
    Ben au final, tu auras beaucoup de polygones, vu que chaque particule est en fait un rectangle, et que l'ensemble de ton systeme de particules est une liste de particule. L'interet de tout regrouper en seul mesh, c'est que la carte graphique peut faire son boulot de son coté une bonne fois pour toute (il faut savoir que ce qui est lent, c'est toujours le transfert application-driver et driver-carte graphique). Le desavantage, c'est que toutes les particules d'un systeme auront les memes proprietés (meme shader, meme texture, meme parametres de transparence, de zbuffer...), mais d'un autre coté, dans 90% des cas, c'est ce qu'on veut.

    Sinon, l'idée est bonne, il faut bien decomposer en systemes de particules (genre un systeme pour la fumee, un pour la pluie etc.) et ensuite gerer les deplacements, apparitions/disparitions, la coloration et tout en interne.
    Et pour ton probleme de points, je sais pas trop, normalement les points sont dessinés en pixels, et que donc leur taille est constante (et donc vraisemblablement visible). Mais si tu veux juste des points au lieu de rectangles, tu peux toujours utiliser les vertex arrays, il suffit juste de dire que tu veux le dessiner en points, et de reduire la taille de ton tableau par 4.

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut
    je prends le risque de me faire taper sur les doigts :
    as tu un lien pour les mesh ???

  7. #7
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Citation Envoyé par gladek Voir le message
    Pour l'instant j'arrive a gerer 10.000 particules avec un frameRate de 30 sec environs. Je ne sais pas si c'est un bon score ou non...
    Dans l'absolue non en faisant un peu de GPU Computing tu atteindra le million de particules à 400fps mais si c'est un de tes premiers moteur de particules alors c'est très respectable il faut bien passer par là pour apprendre !
    Petite amélioration que tu peux faire facilement : bannir le mode immédiat et les display list et passer aux VBO
    Pour aller plus loin, utiliser le transform feedback pour mettre à jour tes particules directement avec un vertex shader et stocker le résultat dans un 2° VBO et ainsi de suite.

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2009
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 114
    Par défaut
    @Math_Lab : merci pour le lien je viens de jeter un coup d'oeil et je pense avoir compris le truc.

    @oxyde356 : suis d'accord avec toi pour les display_list et VBO.
    Dans un premier temps je commence avec qq chose de simple pour avoir un premier rendu. J'ai deja augmenter mes perf en virant des traces log4j.
    J'ai ainsi 10 000part avec un framerate de 50-60...

Discussions similaires

  1. particle system smoke
    Par laziolb dans le forum OpenGL
    Réponses: 2
    Dernier message: 17/12/2008, 13h43
  2. [VB6] [Système] Récupérer le contenu d'une fenêtre DOS
    Par Nounours666 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 18/11/2004, 16h38
  3. [VB6] [Système] Icones du systray qui veulent pas partir
    Par Ctof dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/10/2002, 09h41
  4. [TP7]systeme d'exploitation
    Par numeror dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 15/08/2002, 08h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo