- attribute vec2 Bones;
DGL https://delphigl.com/forum/ |
|
[gelöst] Eigenes Vertexformat - wie? https://delphigl.com/forum/viewtopic.php?f=20&t=9379 |
Seite 1 von 1 |
Autor: | mrtrain [ Mo Aug 02, 2010 16:01 ] |
Betreff des Beitrags: | [gelöst] Eigenes Vertexformat - wie? |
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. ![]() - 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 |
Autor: | Bergmann89 [ Mo Aug 02, 2010 16:07 ] |
Betreff des Beitrags: | Re: Eigenes Vertexformat - wie? |
Hey, guck dir ma den Artikel an: http://wiki.delphigl.com/index.php/VBO_ ... avedArrays MfG Bergmann |
Autor: | mrtrain [ Mo Aug 02, 2010 16:30 ] |
Betreff des Beitrags: | Re: Eigenes Vertexformat - wie? |
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:
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. |
Autor: | Coolcat [ Mo Aug 02, 2010 16:38 ] |
Betreff des Beitrags: | Re: Eigenes Vertexformat - wie? |
Zitat: 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. Aber auch glVertexPointer, glTexCoordPointer, ... haben ein size-Argument. |
Autor: | mrtrain [ Mo Aug 02, 2010 17:38 ] |
Betreff des Beitrags: | Re: Eigenes Vertexformat - wie? |
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 ![]() |
Autor: | Coolcat [ Mo Aug 02, 2010 17:55 ] |
Betreff des Beitrags: | Re: Eigenes Vertexformat - wie? |
Zitat: Okay, dann muss ich glVertexAttribPointer also jedes mal, bevor ich glDrawElements aufrufe, auch aufrufen, oder? Ja, also zumindest wenn sich die Attribute ändern. Zitat: glEnableVertexAttribArray, ersetzt das sozusagen glEnableClientState? Ja. Zitat: Was soll ich da für index angeben? Den Rückgabewert von glGetAttribLocation? Das ist eine Möglichkeit, du kannst aber auch mit glBindAttribLocation vor dem linken des Shaders den Index für jedes Attribut selbst festlegen. Hier mal Beispielcode aus meinem WebGL-Tutorial, ist zwar JavaScript, aber es sollte erkennbar sein was passiert: Code: program = gl.createProgram();
gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.bindAttribLocation(program, 0, "aPosition"); gl.bindAttribLocation(program, 1, "aNormal"); gl.bindAttribLocation(program, 2, "aTexCoord"); gl.linkProgram(program); // ... gl.useProgram(program); gl.bindBuffer(gl.ARRAY_BUFFER, vbo); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, ibo); gl.enableVertexAttribArray(0); gl.enableVertexAttribArray(1); gl.enableVertexAttribArray(2); gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 8*4, 0*4); // position gl.vertexAttribPointer(1, 3, gl.FLOAT, false, 8*4, 3*4); // normal gl.vertexAttribPointer(2, 2, gl.FLOAT, false, 8*4, 6*4); // texcoord gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0); |
Autor: | mrtrain [ Mo Aug 02, 2010 18:01 ] |
Betreff des Beitrags: | Re: Eigenes Vertexformat - wie? |
Perfekte Antwort, ich glaub', ich habe erstmal keine Fragen mehr. Danke Coolcat! Werd' jetzt erstmal ein wenig rumprobieren. |
Autor: | AlexMaRu [ Mi Aug 04, 2010 14:56 ] |
Betreff des Beitrags: | Re: [gelöst] Eigenes Vertexformat - wie? |
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. siehe Artikel http://www.spieleprogrammierung.net/2010/07/verwendete-vertexformate-in-den-opengl.html Bsp: Code: // 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); |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |