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.

:arrow: 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

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:
  1. 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.

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/