Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Moinsen! Ich versuche jetzt seit einiger Zeit, herauszufinden, wie die ganzen glAttrib* Funktionen zu nutzen sind. Mein Ziel soll sein, dass ich ein VBO erstelle, in das ich die Daten so hineinladen kann, wie ich will und dass ich im Vertexshader auch darauf zugreifen kann. Die Standard-Formate, wie sie im VBO-Tutorial aufgelistet sind, sind mir viel zu unflexibel.
Also angenommen ich brauch in meinem Vertexshader - 3 floats für gl_Vertex - 3 floats für gl_Normal - 2 floats für gl_MultiTexCoord0 - 2 floats für BoneWeights
Wie kann ich OpenGL jetzt mitteilen, dass ich die Daten in genau diesem Format im VBO habe? Cool wäre außerdem, wenn ich das Format einmal festlegen könnte und es dann immer aktiviert wird, wenn ich den Shader binde.
Danke schonmal im Vorraus!
mrtrain
Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:32, insgesamt 1-mal geändert.
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Wow, danke für die schnelle Antwort! 6 Minuten Reaktionszeit... nicht schlecht! Mit der Methode ist aber noch nicht alles gelöst. Angenommen in meinem Vertexshader-Code steht folgendes:
Code:
attribute vec2 Bones;
Wie würde ich OpenGL davon Größe und Offset klarmachen? Oder wie kann ich OpenGL sagen, wie viel floats ich für die Texturkoordinaten brauche? gl_MultiTexCoord0 ist ja eigentlich ein vec4, idR reichen mir aber 2 floats, weil ich meistens mit 2D-Texturen arbeite.
Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:32, insgesamt 1-mal geändert.
Wie würde ich OpenGL davon Größe und Offset klarmachen?
Das zweite Argument von glVertexAttribPointer legt fest wie groß das Attribut sein soll. Bei Stride musst du angeben wie groß der Vertex insgesamt ist und das letzte Argument dient bei einem gebundenen VBO als Offset am Anfang. Das ganze hat dann aber nichts mehr mit gl_Vertex, gl_Normal & Co zu tun sondern du musst alles selbst definieren.
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Okay, dann muss ich glVertexAttribPointer also jedes mal, bevor ich glDrawElements aufrufe, auch aufrufen, oder? Was ist mit glEnableVertexAttribArray, ersetzt das sozusagen glEnableClientState? Was soll ich da für index angeben? Den Rückgabewert von glGetAttribLocation?
Danke für weitere Hilfe
Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:32, insgesamt 1-mal geändert.
Registriert: Do Mai 20, 2010 10:54 Beiträge: 10
Programmiersprache: C/C++
Du kannst natürlich auch die Erweiterung GL_ARB_explicit_attrib_location nutzen.
Im OpenGL-Hauptprogramm und in den verwendeten Vertex Shadern lassen sich die Vertex Attribute deines Vertexformats dann mithilfe von Semantiken (symbolische Konstanten, z.B. #define ATTR_POSITION 0) identifizieren.
// Die Texturkoordinaten befindet sich an erster Stelle im Attribut-Array. // Der Speicheroffset beträgt somit 0 Bit: glVertexAttribPointer(ATTR_TEXCOORD0, 2, GL_FLOAT, GL_FALSE, 32, (char*)0); glEnableVertexAttribArray(ATTR_TEXCOORD0);
Mitglieder in diesem Forum: 0 Mitglieder und 20 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.