OpenGL-Texturen: verwalten und optimieren



  • Fuer 1000 Quads ist es relativ Wurscht ob man VBOs nimmt oder nicht, vor allem wenn sich deren Positionen staendig aendern.
    Relevant waere dass Du nicht fuer jedes Quad blind glBindTexture aufrufst, sondern irgendwie sortierst.



  • Danke für den Hinweis. Meine Texturen sind "sortiert". Ich lege sie einmal in der Reihenfolge meiner Items an, diese ändert sich nicht mehr.
    Beim zeichnen gehe ich in der selben Reihenfolge vor. Ich ändere lediglich die Positionen der Items in der Szene, aber nicht in der Liste.

    So wie es aussieht ist da also nich mehr viel zu optimieren oder hat jemand noch nen Vorschlag?

    P.S.: Unabhängig davon würde ich trotzdem gerne wissen, wie ich das mit den VBOs hinbekomme...



  • error: `glGenBuffers' was not declared in this scope

    Die OpenGL-Header im Platform-SDK sind von 1996 und repraesentieren V1.1.
    Du musst Dir also alle darueber hinausgehenden Funktionen per Extensions laden:

    PFNGLGENBUFFERSARBPROC glGenBuffers= (PFNGLGENBUFFERSARBPROC) wglGetProcAddress("glGenBuffersARB");
    

    Die notwendigen Deklarationen findest Du hier (bzw systemspezifische Erweiterungen hier).
    Alternativen sind glew oder glee.



  • Ich habs jetz hinbekommen mit den VBOs. Aber nur unter Benutzung der GLee - Library! Damit aber sehr einfach, nur die .h einbinden und mit der lib linken und schon funktionierts.



  • Hab nochmal ne Frage zum VBO. Und zwar funktioniert es ja nun, in meinem Beispielprogramm hab ich nur ein Quad.

    Wenn ich jetz da ne Textur drauflegen möchte, funktioniert das nich. Das Quad wird nur einfarbig gemalt... Ich habe natürlich die Textur geladen und wenn ich nur Vertex Arrays benutze, funktionierts sofort, aber das wär ja dann nicht im graka-speicher, oder?!

    Kann ich eine Textur überhaupt gleichzeitig benutzen, wenn ich die Vertices als VBOs habe?

    Mein Versuch war:

    GLdouble textures[] = { 0, 1, 0, 0, 1, 0, 1, 1};
    
    ...
    
     glEnableClientState(GL_TEXTURE_COORD_ARRAY);
     glTexCoordPointer(2, GL_DOUBLE, 0, textures);
    


  • Du musst fuer das Texture_Coord_Array auch ein VBO binden.
    Das kann entweder ein separater Buffer sein wo dann pro Vertex eben (u,v) abgelegt ist,
    oder, wenn Du eine interleaved Struktur hast, der gleiche wie beim Vertex-Array; dann musst Du die Groesse und den Offset innerhalb der Struktur angeben.

    Meines Wissens nach kann keine Grafikkarte nativ Doubles verarbeiten.



  • hey, das hatte ich eigentlich probiert und einen weiteren buffer angelegt. Allerdings wusste ich da nich, wie ich den aufbaue (GL_ARRAY_BUFFER) und dann mit dem texture-pointer verbinde???

    2. Heisst das ich sollte floats als Datentyp benutzen? Für die Vertices benutze ich auch doubles, da funktionierts auf jeden fall...



  • Für die Vertices benutze ich auch doubles, da funktionierts auf jeden fall...

    Geht auch, wird nach dem Schreiben in den VBO aber nochmal unsinnig konvertiert.

    wie ich den aufbaue (GL_ARRAY_BUFFER) und dann mit dem texture-pointer verbinde?

    Guckst Du hier.



  • YEAH! Funktioniert:

    glBindBuffer( GL_ARRAY_BUFFER, buffers[2] );
    	glBufferData(GL_ARRAY_BUFFER, sizeof(textures), textures, GL_STATIC_DRAW);
    
    	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    	glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
    

    Ich glaub, es lag wirklich am GL_DOUBLE, denn nun habe ich das array und den Aufurf in glTexCoordPointer auf GL_FLOAT geändert und nun läuft es!

    Besten Dank!!



  • Und machen VBOs hier einen signifikanten Geschwindigkeitsunterschied?


Anmelden zum Antworten