[opengl] alles in einen buffer?



  • Hallo
    ich arbeite mich grade etwas in opengl rein und da habe ich mal eine frage.
    mit

    glGenBuffersARB(...);
    glBindBufferARB(...);
    glBufferDataARB(..., buffer);
    

    kann man ja einen buffer füllen, der dann auf den grafikkaten-speicher liegt. kann man da irgendwie im selben buffer vertexe + normale + farben speichern und dann zeichnen lassen?

    zZ mache ich es ja so, das ich für vertexe und für normale 2 buffer erzeuge und

    glBindBufferARB(vertex_buffer);
    glVertexPointer(...);
    glBindBufferARB(normale_buffer);
    glNormalPointer(...);
    // ...
    glDrawArrays(...);
    

    so dann das objekt zeichne.
    meine frage ist nun ob es möglich ist vertexe und normale im selben buffer zu haben?


  • Mod

    ein vertex kann positionen, normalen, texturecoordinates... haben. dein stichwort dürfte "interleaved buffer" sein.

    wobei ich nicht weiß ob das mit bufferobjects funzt, aber der nvidia extension konnte ich das mal testen wenn ich mich recht entsinne.

    rapso->greets();



  • Hi!
    Ja, man kann in einem VertexBufferObject Position, Normalvektor, Farbe, Texturkoordinaten usw. von den einzelnen Vertices speichern. Du bindest den Buffer einmal ein, und nutzt dann z. B. glVertexPointer, glColorPointer, glNormalPointer usw. um OpenGL zu sagen, wie sie abgespeichert sind.

    Bei den Texturkoordinaten ist zu sagen, das es kein befehl für Multitetxurkoordinaten gibt. Du musst also für jede Textureunit einzeln glTexCoordPointer aufrufen.

    Für Triangles gibt es einen ElementBuffer in dem die Indizes der Vertices drinne stehen.

    Ich pers. habe die Erfahrung gemacht, das bei dyn. Objekten es sich gut macht, für Position, Normal, Farbe usw.. einzelne Buffer anzulegen und nicht alles in einen hinein zu quetschen. Denn Buffer zu aktualisieren ist sau lahm. Es nimmt sich nicht viel, nur einen Teilbereich eines Buffers zu aktualisieren, oder den gesamten. Deswegen sollten es besser mehrere kleinere Buffer sein, als ein großer.(Daher ist es auch sinnlos, Attribute hintereinander stehen zu lassen, statts die Vertices hintereinander stehen zu lassen. Die Offsetberechung ist sowiso bei der 2. Variante angenehmer)
    Weiterhin kann ich von Buffer-Mapping abraten. Also Daten mit glMapBuffer in den Buffer zu schrieben/lesen war um einiges lahmer bei mir, als die Daten mit glBufferData zu übertragen. Aber wie gesgat, alles nur pers. Erfahrungen die ich mit meiner Engine gemacht habe.

    mfg olli


Anmelden zum Antworten