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 :

[C# - TAOFramework] - Utilisation de VBO


Sujet :

OpenGL

  1. #1
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut [C# - TAOFramework] - Utilisation de VBO
    Bonjour,

    Je suis en train de faire de l'affichage 3D de pièces.
    Après avoir affiché cette dite-piece de façon brute.
    Ensuite, l'ai réussi à l'afficher via l'optimisation VBO

    Le probleme est que quand je perds le focus de la fenetre sans forcement la mettre derriere une autre fenetre, le driver de la carte graphique ne réponds plus pendant quelques secondes avant de revenir.

    Pourriez vous m'aider ?
    Merci.
    Flow

    Mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void LoadVBO()
            {
                Gl.glGenBuffersARB(1, out VBOObject.VBOid);
                Gl.glBindBufferARB(Gl.GL_ARRAY_BUFFER, VBOObject.count);
     
                Gl.glBufferDataARB(Gl.GL_ARRAY_BUFFER_ARB, (IntPtr)(VBOObject.count * 3 * sizeof(float)), VBOObject.xyz, Gl.GL_STATIC_DRAW_ARB);
            }
    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
                Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY);
     
                LoadVBO();
     
                Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);						// Black Background
                Gl.glClearDepth(1.0f);										// Depth Buffer Setup
                Gl.glDepthFunc(Gl.GL_LEQUAL);									// The Type Of Depth Testing (Less Or Equal)
                Gl.glEnable(Gl.GL_DEPTH_TEST);									// Enable Depth Testing
                Gl.glShadeModel(Gl.GL_SMOOTH);									// Select Smooth Shading
                Gl.glHint(Gl.GL_PERSPECTIVE_CORRECTION_HINT, Gl.GL_NICEST);			// Set Perspective Calculations To Most Accurate
                Gl.glEnable(Gl.GL_TEXTURE_2D);									// Enable Textures
                Gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);						// Set The Color To White
     
     
                Gl.glBindBufferARB(Gl.GL_ARRAY_BUFFER_ARB, VBOObject.count);
                Gl.glVertexPointer(3, Gl.GL_FLOAT, 0, null);
     
     
                while (!toquit)
                {
                    DrawGLScene();// Loop That Runs While done = false
                    Application.DoEvents();                                         // Process Events
                    bool res = Gdi.SwapBuffers(hDC);
                }
     
                Gl.glDisableClientState(Gl.GL_VERTEX_ARRAY);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
           private void DrawGLScene()
            {
                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
                Gl.glLoadIdentity();
     
                Glu.gluLookAt(212, 60, 194, 186, 55, 171, 0, 1, 0);	
     
                Gl.glRotatef(xv, 1f, 0f, 0f);
                Gl.glRotatef(yv, 0f, 1f, 0f);
                Gl.glRotatef(zv, 0f, 0f, 1f);
     
                Gl.glDrawArrays(Gl.GL_LINES, 0, VBOObject.count);
            }

  2. #2
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    Après quelques recherches, j'ai pris comme exemple d'utilisation VBO, le code du OpenTK framework.

    Donc, j'ai fais:

    Dans le Form Load:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                LectureFichier();
                VBOObject.LoadVBO(Profiles);
     
                LoadVBO();
    Le loadVBO:

    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
     
           static void LoadVBO()
            {
                Gl.glGenBuffers(1, out VBOObject.VBOid);
                Gl.glBindBuffer(Gl.GL_ARRAY_BUFFER, VBOObject.VBOid);
     
                int size = VBOObject.count * sizeof(float)*3;
     
                IntPtr psize = new IntPtr(size);
                IntPtr poffset = new IntPtr(0);
     
     
                Gl.glBufferData(Gl.GL_ARRAY_BUFFER, psize, VBOObject.xyz, Gl.GL_STATIC_DRAW);
     
     
                int i;
                Gl.glGetBufferParameteriv(Gl.GL_ARRAY_BUFFER, Gl.GL_BUFFER_SIZE, out i);
     
                Gl.glBindBuffer(Gl.GL_ARRAY_BUFFER, 0);
            }
    Le code du DrawGLScene:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            static private void DrawGLScene()
            {
                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Glu.gluLookAt(212, 60, 194, 186, 55, 171, 0, 1, 0);
                Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY);
                Gl.glBindBuffer(Gl.GL_ARRAY_BUFFER, VBOObject.VBOid);
    //          Gl.glTranslatef(-ycentre, -xcentre, -zcentre);
                Gl.glBindBuffer(Gl.GL_ARRAY_BUFFER, VBOObject.VBOid);      
                Gl.glVertexAttribPointer(0, 3, Gl.GL_FLOAT, Gl.GL_FALSE, 3 * sizeof(float), null);
                Gl.glDrawArrays(Gl.GL_LINES, 0, VBOObject.count);
            }
    A la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Gl.glDrawArrays(Gl.GL_LINES, 0, VBOObject.count);
    J'ai l'exception suivante:
    "Une exception non gérée du type 'System.AccessViolationException' s'est produite dans Tao.OpenGl.dll
    Informations supplémentaires : Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée."

    Auriez vous une idée du probleme ?
    Merci.
    Flow

  3. #3
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    reBonjour,

    J'ai essayé d'utiliser le programme de test fourni par TaoFramework pour afficher quelques objets via les VBO (essai.cs)
    Celui marche.

    Ensuite, j'ai voulu l'adapter à mon "problème". Et rien ne s'affiche (mais ne crashe pas). (display.cs)


    En faite, je ne sais plus quoi faire

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Pour le débogage, vous pouvez tester plusieurs choses :
    • appeler glGetError() à chaque commande OpenGL (peut être que le framework que vous utilisez le fait déjà) ;
    • utiliser un débogueur externe, du style de gDEBugger ;
    • utiliser l'extension de débogage KHR_Debug.


    La première erreur, je pense que vous avez un souci que vous faites un blocage de votre carte graphique, mais je ne suis pas sur. Est-ce que le FPS est bas ?
    Dans le deuxième cas je pense que le stride doit être à 0 et du coup, vous dépassiez de votre mémoire allouée.
    Dans le trois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     private static void Display()
            {
                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
                Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY);
                Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
                Glu.gluLookAt(212, 60, 194, 186, 55, 171, 0, 1, 0);
                Gl.glDrawArrays(Gl.GL_QUADS, 0, VBOObject.count/2);
     
     
           //     Glut.glutSwapBuffers();
            }
    On n'active pas le tampon (le VBO) ?

    Désolé pour les réponses tardives et de vous avoir laissé déprimé .
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    bordel, merci infiniment,
    J'ai trouvé mon probleme, il venait du LoadVertexPointer, le premier élement n'etait pas correct (j'avais mis le nombre de vertex totale au lieu du nombre d'élément par vertex (ce qui etait totalement incorrect).
    je l'ai vu via le glGetError...!

    Maintenant, ca s'affiche parfaitement !

    Encore merci de ton aide LittleWhite.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin de précision sur l'utilisation des VBO
    Par niarkyzator dans le forum OpenGL
    Réponses: 3
    Dernier message: 31/07/2015, 09h48
  2. Utilisation des VBO avec JOGL
    Par choko83 dans le forum OpenGL
    Réponses: 4
    Dernier message: 23/11/2010, 16h30
  3. Utilisation des VBO et IBO
    Par Aladore dans le forum OpenGL
    Réponses: 0
    Dernier message: 07/05/2009, 20h46
  4. Crash lors de l'utilisation des VBO
    Par Julien Bodin dans le forum OpenGL
    Réponses: 0
    Dernier message: 03/03/2009, 21h54
  5. Problème avec l'utilisation des VBO
    Par Ekinoks dans le forum OpenGL
    Réponses: 12
    Dernier message: 09/07/2006, 18h42

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