Verständnisfrage: glBufferData vs glXXXPointer



  • Servus Kollegen..
    Ich hab da so ein paar Kopfschmerzen mit Vertexlisten, etc..
    Mal ganz abgesehen davon, dass ich es partout nicht hinbekommen habe einen Vertexbuffer mit Indice zu erstellen und darzustellen..
    Hier mal der Code dazu, vielleicht kanns mir ja wer erklären warum hier nix zu sehen ist...

    GLuint vbuf;
            GLuint tbuf;
            // erzeuge buffer mit vertexdaten
            glGenBuffers(1, &vbuf);
            // erzeuge buffer mit indexdaten
            glGenBuffers(1, &tbuf);
    
            // lade Vertexdaten in Vertexbuffer
            glBindBuffer(GL_ARRAY_BUFFER, vbuf);
            glBufferData(GL_ARRAY_BUFFER, this->vertice.size() * sizeof(GLfloat), &(this->vertice[0]), GL_STATIC_DRAW);
            std::cout << " loaded " << this->vertice.size() <<" vertice:" << glGetError() ;
    
            // lade Dreiecksdaten in Dreiecksbuffer
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, tbuf);
            glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->indice.size() * sizeof(GLuint), &(this->indice[0]), GL_STATIC_DRAW);
            std::cout << " loaded " << this->indice.size() << " indice: " << glGetError() ;
    
            glDrawElements(GL_TRIANGLES, this->indice.size(), GL_UNSIGNED_INT, 0);
    

    Meine eigentliche Frage ist der Unterschied zur offenkundig einfacher zu handhabenden Variante mittels VertexPointer und direkter Übergabe der Indize?

    Das hier funktionierte zumindest

    glEnableClientState(GL_VERTEX_ARRAY);
            glEnableClientState(GL_COLOR_ARRAY);
    
            glColorPointer(4,GL_UNSIGNED_SHORT,4*sizeof(GLushort),&(this->colors[0]));
            glVertexPointer(3, GL_FLOAT, 3 *sizeof(float), &(vertice[0]));
            glDrawElements(GL_TRIANGLES, this->indice.size(), GL_UNSIGNED_INT,  &(this->indice[0]));
    
            glDisableClientState(GL_COLOR_ARRAY);
            glDisableClientState(GL_VERTEX_ARRAY);
    

    Meine Vermutung ist, dass es auf diese Weise dann nicht über den Grafikkartenspeicher läuft. Ist dies korrekt? Wenn ja, wie äußert sich das in der Performance?

    Die Grafik ist bei mir aktuell nur Mittel zum Zweck, es kommt nicht sonderlich auf Schönheit oder Performance an- auf der anderen Seite bin ich, was Ressourcen angeht, eher knausrig..

    BTW: Tut das not, dass fast alle Tutorials zum Thema der VertexArrays in ihrem Source code noch ewig shadern, etc. obwohl das laut Beschreibung gar nicht notwendig ist? Mich persönlich lenkt das immer etwas vom eigentlichen Thema ab..



  • DocJunioR schrieb:

    Hier mal der Code dazu, vielleicht kanns mir ja wer erklären warum hier nix zu sehen ist...

    schaut ok aus, wie sind die daten?

    Das hier funktionierte zumindest

    glEnableClientState(GL_VERTEX_ARRAY);
            glEnableClientState(GL_COLOR_ARRAY);
    
            glColorPointer(4,GL_UNSIGNED_SHORT,4*sizeof(GLushort),&(this->colors[0]));
            glVertexPointer(3, GL_FLOAT, 3 *sizeof(float), &(vertice[0]));
            glDrawElements(GL_TRIANGLES, this->indice.size(), GL_UNSIGNED_INT,  &(this->indice[0]));
    
            glDisableClientState(GL_COLOR_ARRAY);
            glDisableClientState(GL_VERTEX_ARRAY);
    

    rufst du glEnableClientState, glColorPointer usw. bei den VBOs nicht auf aus irgendeinen grund? oder hast du oben nur die verkuertze fassung?

    Meine Vermutung ist, dass es auf diese Weise dann nicht über den Grafikkartenspeicher läuft. Ist dies korrekt?

    du vermutest die buffer mit denen du auf der CPU per pointer verweist sind nicht auf der Graka? 🤡

    Wenn ja, wie äußert sich das in der Performance?

    performance = Grafikkartenspeicherbandbreite/Hauptspeicherbandbreite;

    BTW: Tut das not, dass fast alle Tutorials zum Thema der VertexArrays in ihrem Source code noch ewig shadern, etc. obwohl das laut Beschreibung gar nicht notwendig ist? Mich persönlich lenkt das immer etwas vom eigentlichen Thema ab..

    Korrekt, VBOs sind aus GeForce256 zeiten, da gab es noch lange keine shader, entsprechend funzt das auch so. Die tutorials benutzen shader, weil heute allte Grakas nur noch mit shadern laufen, ist im allgemeinen trivialer, aber natuerlich zum lernen erstmal mehr.



  • rapso schrieb:

    schaut ok aus, wie sind die daten?

    this->vertice = {
                    0.5f,  0.5f, 0.0f,   // top right
                    0.5f, -0.5f, 0.0f,   // bottom right
                   -0.5f, -0.5f, 0.0f,   // bottom left
                   -0.5f,  0.5f, 0.0f,   // top left
            };
    
            // create index list
            this->indice = {
                    0, 1, 3,
                    1, 2, 3
            };
    
            this->colors = {
                    0xff,0xff,0xff,0xff,
                    0xff,0xaf,0xff,0xff,
                    0xff,0x00,0xff,0xff,
                    0xff,0xff,0xa0,0xff
            };
    

    Das hier funktionierte zumindest
    ..
    rufst du glEnableClientState, glColorPointer usw. bei den VBOs nicht auf aus irgendeinen grund? oder hast du oben nur die verkuertze fassung?

    müsste ich denn? hab ich so nirgends gefunden?

    Korrekt, VBOs sind aus GeForce256 zeiten, da gab es noch lange keine shader, entsprechend funzt das auch so. Die tutorials benutzen shader, weil heute allte Grakas nur noch mit shadern laufen, ist im allgemeinen trivialer, aber natuerlich zum lernen erstmal mehr.

    irgendwie find ich die online-tutorials zumeist eher suboptimal aber vielleicht sollte ich auch einfach vergessen, dass ich das vor >10 jahren schon mal gemacht habe und einfach mal von vorne anfangen...



  • DocJunioR schrieb:

    müsste ich denn? hab ich so nirgends gefunden?

    macht das irgendein tutorial nicht? welche nutzt du denn gerade?



  • machen tun das etliche tutorials aber keines sagt, warum. notwendig für das verständnis der vertexlisten ist das offensichtlich nicht.



  • DocJunioR schrieb:

    machen tun das etliche tutorials aber keines sagt, warum. notwendig für das verständnis der vertexlisten ist das offensichtlich nicht.

    VBOs bauen auf diesem vorwissen auf.