[OGL] VBOs eckig? glNormalPointer-Sortierung?



  • Hallo,

    Ich versuche gerade, ein paar VBOs zu ereugen und darzustellen. Leider scheinen die Vertices nicht mehr "rund" zu sein, sondern viel eher integer-like.

    // Generate VBO on gfx-mem!
      glGenBuffersARB(1, &vbo_vertices);
      glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo_vertices);
      glBufferDataARB(GL_ARRAY_BUFFER_ARB,
                      w*h*18*sizeof(float),  //18, da w*h*6Vertices (für Triangles) *3floats (x,y,z)
                      blubb,                 // Da sind die Daten drin: [x1,y1,z1,x2,y2,...]
                      GL_STATIC_DRAW_ARB  );
    
      // Set Pointers To Our Data
      glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo_vertices);
      glVertexPointer(3, GL_FLOAT, 0, (char *) NULL);
    

    Welcher Parameter ist falsch? Die Daten sind korrekt, wenn sie in "blubb" stehen, werden danach aber i-wie gerundet... 😕

    Wenn ich jetzt noch Normalen dazupacken möchte (2.array), wie muss ich die im array packen? [x1,y1,z1,x2,y2,...]? Wie viele müssen rein? 1(also x,y,z) pro Vertex? 1 pro Triangle?

    P.s.: Diesmal hab ich auch länger nachgedacht... :xmas1:



  • Hier nochmal 2 Bilder von der Szene:
    So sollte es aussehen:
    http://img3.imagebanana.com/img/coa3gv9a/level1_korrekt.png

    Und so sieht es mit VBO's aus:
    http://img3.imagebanana.com/img/s7j2tmkg/level_1.png



  • Dein Screenshot sieht so aus als waeren die Normalen nicht sinnvoll.
    Bzgl Vertexbufferaufbau schau mal hier rein.



  • hellihjb schrieb:

    Dein Screenshot sieht so aus als waeren die Normalen nicht sinnvoll.

    😃 Deshalb frag ich nach der Sortierung

    Mich wundert es halt, das die VBOs das ganze so eckig machen, kleine Unebenheiten fallen einfach weg...

    Im Moment sortier ich die Vertices [x1,y1,z1,x2,y2,...] und die Normalen genauso, auch genausoviele, so habe ich das Redbook interpretiert... 🤡



  • langeweile schrieb:

    hellihjb schrieb:

    Dein Screenshot sieht so aus als waeren die Normalen nicht sinnvoll.

    😃 Deshalb frag ich nach der Sortierung

    Mich wundert es halt, das die VBOs das ganze so eckig machen, kleine Unebenheiten fallen einfach weg...

    Im Moment sortier ich die Vertices [x1,y1,z1,x2,y2,...] und die Normalen genauso, auch genausoviele, so habe ich das Redbook interpretiert... 🤡

    Sollte so eigentlich richtig sein.
    Es sieht allerdings so aus, als ob die Richtung der Normalen bei jeweils einem der Dreiecke pro Viereck falsch herum wären. Haste da irgendwo nen Minus eingebaut wo keins hingehört?
    (Ist nämlich komisch, dass immer ein Dreieck hell und eins dunkel ist pro Viereck)

    Nen bisl komisch finde ich das

    glVertexPointer(3, GL_FLOAT, 0, (char *) NULL);
    

    glVertexPointer(size : TGLint; _type : TGLenum; stride : TGLsizei; const _pointer : PGLvoid);

    _pointer: Zeiger auf das erste Vertex der Reihe.

    Du zeigst da auf (char 😉 NULL.
    Warum char?
    Warum NULL?

    Irgendwie komisch.
    Mich wundert, dass überhaupt was gezeichnet wird.



  • Im Moment sortier ich die Vertices [x1,y1,z1,x2,y2,...] und die Normalen genauso

    Offensichtlich nicht.

    Du zeigst da auf (char 😉 NULL.
    Warum NULL?

    Sieht die VBO-Extensions so vor.



  • Also ich habe mich jetzt mit VBOs beschäftigt.

    Zuerst habe ich ein Modell geladen und es mit Vertex Array gezeichnet.
    Dann habe ich versucht dies mit VBOs darzustellen.

    Und WTF genau der selbe Fehler wie bei "langeweile". 😮 😮

    Ich bin mir (genau wie er) sicher die Sortierung richtig gemacht zu haben, da es mit Vertex Arrays gezeichnet wird.

    Ich werd mal versuchen rauszubekommen, warum es nicht funzt und meld mich dann wieder.

    (Es sei denn Jemand anderes hat eine Vermutung woran es liegen könnte)
    Hat wer?



  • Funktioniert (WinXP, Geforce 8800 GTS, ForceWare 175.19):

    struct Vector
    {
      float x,y,z;
    };
    
    struct Vertex
    {
       Vector position;
       Vector normal;
       float u,v;
    };
    
    unsigned int vertexBuffer;
    
    // vertexbuffer anlegen
    glGenBuffersARB(1, &vertexBuffer);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexBuffer);
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, numTriangles*3*sizeof(Vertex), NULL, GL_STATIC_DRAW_ARB);
    
    // vertexbuffer fuellen
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexBuffer);
    volatile Vertex *vtx= glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY);
    // vtx[...]= ...
    glUnmapBufferARB(GL_ARRAY_BUFFER_ARB );
    
    // rendern
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexBuffer);
    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), NULL);
    
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexBuffer);
    glNormalPointer(GL_FLOAT, sizeof(Vertex), (GLvoid*)sizeof(Vector));
    
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vertexBuffer);
    glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), (GLvoid*)(2*sizeof(Vector)));
    
    glDrawArrays(GL_TRIANGLES, 0, numTriangles*3);
    
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    

Anmelden zum Antworten