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 :

Difference entre "glSubDataBuffer" et "glMapBuffer"


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut Difference entre "glSubDataBuffer" et "glMapBuffer"
    Bonjour,

    J'utilise les VBO pour afficher mes objets colorés.

    Souhaitant mettre à jour les couleurs suivants des variables qui changent à la volé, j'avais commencé à utiliser la methode 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
    42
    43
    44
    45
     
                GL.BindBuffer(BufferTarget.ArrayBuffer, VBOid1);
     
                int j = 0;
                for (int i = 0; i < xyz.Length; i += 3)
                {
                    if (xyz[i + 2] < 0.3f)
                    {
                        if (zdiff[i / 3] > Z)
                        {
                            xyzcolor[j++]= OpenTK.Graphics.Color4.Red.R;
                            xyzcolor[j++] = OpenTK.Graphics.Color4.Transparent.G;
                            xyzcolor[j++] = OpenTK.Graphics.Color4.Transparent.B;
                            xyzcolor[j++] = OpenTK.Graphics.Color4.Transparent.A;
                        }
                        else
                        {
                            xyzcolor[j++] = OpenTK.Graphics.Color4.Transparent.R;
                            xyzcolor[j++] = OpenTK.Graphics.Color4.Green.G;
                            xyzcolor[j++] = OpenTK.Graphics.Color4.Transparent.B;
                            xyzcolor[j++] = OpenTK.Graphics.Color4.Transparent.A;
                        }
     
                        continue;
                    }
     
                    if (zdiff[i / 3] > Z)
                    {
                        xyzcolor[j++] = OpenTK.Graphics.Color4.Red.R;
                        xyzcolor[j++] = OpenTK.Graphics.Color4.Red.G;
                        xyzcolor[j++] = OpenTK.Graphics.Color4.Red.B;
                        xyzcolor[j++] = OpenTK.Graphics.Color4.Red.A;
                    }
                    else
                    {
                        xyzcolor[j++] = OpenTK.Graphics.Color4.Green.R;
                        xyzcolor[j++] = OpenTK.Graphics.Color4.Green.G;
                        xyzcolor[j++] = OpenTK.Graphics.Color4.Green.B;
                        xyzcolor[j++] = OpenTK.Graphics.Color4.Green.A;
                    }
                }
     
                GL.BufferSubData(BufferTarget.ArrayBuffer, new IntPtr(countv), countc, xyzcolor);
                GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
            }
    Qui marchait.
    Ensuite, je me suis mis à mettre:

    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
    42
    43
    44
    45
    46
                GL.BindBuffer(BufferTarget.ArrayBuffer, VBOid1);
     
                float* ptr = (float*)GL.MapBuffer(BufferTarget.ArrayBuffer, BufferAccess.ReadWrite).ToPointer();
     
                int j = 0;
                for (int i = 0; i < xyz.Length; i += 3)
                {
                    if (xyz[i + 2] < 0.3f)
                    {
                        if (zdiff[i / 3] > Z)
                        {
                            ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Red.R;
                            ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Transparent.G;
                            ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Transparent.B;
                            ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Transparent.A;
                        }
                        else
                        {
                            ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Transparent.R;
                            ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Green.G;
                            ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Transparent.B;
                            ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Transparent.A;
                        }
     
                        continue;
                    }
     
                    if (zdiff[i / 3] > Z)
                    {
                        ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Red.R;
                        ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Red.G;
                        ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Red.B;
                        ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Red.A;
                    }
                    else
                    {
                        ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Green.R;
                        ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Green.G;
                        ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Green.B;
                        ptr[xyz.Length + j++] = OpenTK.Graphics.Color4.Green.A;
                    }
                }
     
                GL.UnmapBuffer(BufferTarget.ArrayBuffer);
                GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
            }
    Sachant que pour la deuxieme methode, j'appelle Invalidate pour faire un redraw de la scene mais la couleur n'est pas mise à jour..Mais cette methode doit etre mieux coté code.

    Merci.

    quelle methode il faut utiliser

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 141
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Les implémentations OpenGL ont souvent eu des soucis avec la gestion de glSubDataBuffer (voir : http://jeux.developpez.com/tutoriels...vancees/#LIV-A )
    Le but de la fonction est de mettre à jour une sous partie d'un très grand tampon, afin que le GPU utilisent les nouvelles données. Par contre, il faut éviter de faire mille appel dessus, car derrière, c'est un transfert CPU -> GPU. Les transferts CPU -> GPU sont à regroupper afin de tout pouvoir transferrer en un lot.
    J'espère être assez clair.

    Le glMapBuffer() permet d'accéder à la mémoire GPU, à partir du CPU (donc du programme) afin d'en faire la copie. Le transfert, je crois, se fait sur le glUnmapBuffer(). La copie du tampon/données est donc à faire à la main (une boucle quoi ).

    Le fait que la couleur ne change pas, je pense qu'il faudra vérifier les données envoyées au GPU (avec gDebugger). Je pense aussi qu'il faut refaire le glDrawArrays(), mais il doit être provoqué par votre Invalidate(). Donc dur à dire. Vérifiez avec des débogueurs les données
    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.

Discussions similaires

  1. Difference entre [Simple quote] & [Double quote]
    Par Invité dans le forum SQL
    Réponses: 3
    Dernier message: 24/07/2013, 12h24
  2. [VBO] difference entre glMapBuffer et glBufferSubData
    Par bachir006 dans le forum OpenGL
    Réponses: 3
    Dernier message: 30/01/2009, 14h41

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