DGL
https://delphigl.com/forum/

Shader und VBOs?
https://delphigl.com/forum/viewtopic.php?f=20&t=7370
Seite 1 von 1

Autor:  Lord Horazont [ Mo Mär 31, 2008 14:46 ]
Betreff des Beitrags:  Shader und VBOs?

Hi ihr,

Ich frage mich gerade, ob es irgendwie möglich ist, VBOs dazu zu "überreden", auch Vertexattribute zu beeinhalten und richtig zu übergeben. Schließlich möchte man zum Beispiel die Tangente und Bitangente des Vertices übergeben, um Bumpmapping oder sowas zu realisieren.

Es gibt Funktionen wie glVertexAttribPointer, aber die wollen ja einen Pointer auf den Hauptspeicher und damit ist doch der Vorteil der VBOs dahin, oder? Oder bleibt das erneute Transferieren in den GRAM erspart, wenn man den Gemappten Pointer auf einen VBO übergibt?

Fragen über Fragen und ich hoffe, dass ich eine Antwort bekomme :)

Gruß Lord Horazont

Autor:  Sascha Willems [ Mo Mär 31, 2008 15:22 ]
Betreff des Beitrags: 

Für sowas kann man die Texturkoordinaten nehmen, ob da jetzt "echte" Texturkoordinaten drinstehen, oder ob du eigene Parameter dort ablegst ist ja equal, da du diese selbst im Shader interpretierst.

Autor:  Lossy eX [ Mo Mär 31, 2008 15:22 ]
Betreff des Beitrags: 

Die gl*Pointer Funktionen stammen aus der Zeit aus der es nur VertexArrays gab. Früher war das ein Pointer auf einen Speicherbereich. Bei VBOs ist das aber ein Offset innerhalb des VBOs. Oder auch anders gesagt ist das die Position des ersten Elementes.

Wenn du bisher mit glInterleavedArrays gearbeitet hast, dann wirst du das vermutlich ändern müssen, denn glInterleaveArrays ist etwas beschränkt. Wenn du jetzt aber noch 2x3 Floats pro Vertex zusätzlich anhängen möchtest, dann gibt es für glInterleavedArrays kein Schema mehr womit er arbeiten kann. Also musst du das alles per Hand einstellen. Genau so wie, wenn man mehr als eine Texturkoordinate haben möchte. Wenn du mal nach MultiTexturing und VBO schaust solltest du auch was an Code finden.

PS: Wenn das VBO gemapped ist, dann greifst du nicht direkt auf den Grafikkartenspeicher zu. Sondern je nach Flag (READ) beim Mappen wurde der Speicher in den RAM kopiert. Deswegen sollte man, wenn man das komplette VBOs überschreiben will, auch entsprechendes WRITE_ONLY Flag setzen, da sonst erst einmal der gesammte Speicher gelesen werden muss. Und beim Verändern von kleinen bereichen in großen VBOs ist glSubData (oder wie das heißt) sicher auch besser, da dort nichts in den RAM kopiert wird. Sofern die Aufrufe überschaubar bleiben.

Und wenn ich mich nicht vertue, dann ist das VBO für diesen Zeitraum auch auf der Grafikkarte gesperrt. Da bin ich mir aber nicht wirklich sicher. Aber ich meine zu mindest. Alles andere wäre auch spannend was da als Ergebniss entstehen würde.

Autor:  Lord Horazont [ Mo Mär 31, 2008 16:48 ]
Betreff des Beitrags: 

Lossy eX hat geschrieben:
Die gl*Pointer Funktionen stammen aus der Zeit aus der es nur VertexArrays gab. Früher war das ein Pointer auf einen Speicherbereich. Bei VBOs ist das aber ein Offset innerhalb des VBOs. Oder auch anders gesagt ist das die Position des ersten Elementes.


Ok... Die Funktionen wollen aber immernoch einen Pointer als Parameter haben. Soll ich das Offset einfach auf Pointer casten oder gibts da ne alternative?

@Sascha:
Bringt nur leider nichts, da glInterleavedArrays nur eine Texturkoordinate unterstützt :wink:

Gruß Lord Horazont

Autor:  Lossy eX [ Mo Mär 31, 2008 17:15 ]
Betreff des Beitrags: 

Ja einfach auf Pointer casten, denn in C/C++ ist Pointer und Int ziemlich kompatibel deswegen macht das da kaum einen Unterschied.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/