Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 28, 2024 21:34

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Aug 02, 2010 16:01 
Offline
DGL Member

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.

: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


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:32, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eigenes Vertexformat - wie?
BeitragVerfasst: Mo Aug 02, 2010 16:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

guck dir ma den Artikel an: http://wiki.delphigl.com/index.php/VBO_ ... avedArrays

MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eigenes Vertexformat - wie?
BeitragVerfasst: Mo Aug 02, 2010 16:30 
Offline
DGL Member

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


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:32, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eigenes Vertexformat - wie?
BeitragVerfasst: Mo Aug 02, 2010 16:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eigenes Vertexformat - wie?
BeitragVerfasst: Mo Aug 02, 2010 17:38 
Offline
DGL Member

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.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eigenes Vertexformat - wie?
BeitragVerfasst: Mo Aug 02, 2010 17:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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);

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eigenes Vertexformat - wie?
BeitragVerfasst: Mo Aug 02, 2010 18:01 
Offline
DGL Member

Registriert: Di Okt 13, 2009 17:25
Beiträge: 365
Programmiersprache: C++
Perfekte Antwort, ich glaub', ich habe erstmal keine Fragen mehr. Danke Coolcat! Werd' jetzt erstmal ein wenig rumprobieren.


Zuletzt geändert von mrtrain am Mi Aug 31, 2011 19:32, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 04, 2010 14:56 
Offline
DGL Member

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.

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);


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.079s | 15 Queries | GZIP : On ]