Benutzer:Mori/OGL3 Quickstart: Unterschied zwischen den Versionen
Mori (Diskussion | Beiträge) |
Mori (Diskussion | Beiträge) |
||
Zeile 10: | Zeile 10: | ||
erstellen (laden?) binden | erstellen (laden?) binden | ||
==EABs== | ==EABs== | ||
− | + | Ein Element Array Buffer (im folgenden EAB), "erweitert" die Möglichkeiten Meshes zu Zeichnen. Der Einsatz von EABs bietet sowohl die Möglichkeit Meshes dynamischer zu zeichnen, als auch den Speicherverbrauch (je nach Mesh) drastisch zu reduzieren. Wie der Name schon andeutet, handelt es sich um einen Buffer zum Speichern von Element Array's. Diese Elemente sind in diesem Fall die Indices der einzelnen Mesh-Vertices. In diesem Buffer geben wir daher die Daten nichtmehr direkt an, sondern nur noch einen Index und können erstens Vertices zwischen verschiedenen Faces sharen (zB. bei Ecken in Objekten, welche von mehreren Dreiecken verwendet werden) und zweitens, verschiedene Rendermodes (zB. GL_TRIANGLES, GL_TRIANGLE_STRIP, ...) auf ein und das selbe VBO anwenden, ohne die Reihenfolge der Vertices auf der Grafikkarte verändern zu müssen. | |
+ | Zuerst holen wir uns deshalb, wie schon beim VBO, ein Handle (hier '''hid:GLUInt''') von OpenGL und binden dieses als '''GL_ELEMENT_ARRAY_BUFFER'''. Dieses Handle wird am Ende wieder mit glDeleteBuffers freigegeben: | ||
+ | <source lang="pascal">constructor TGLEAB.Create; | ||
+ | begin | ||
+ | glGenBuffers(1,@hid); | ||
+ | bind(); | ||
+ | end; | ||
+ | |||
+ | destructor TGLEAB.Destroy; | ||
+ | begin | ||
+ | glDeleteBuffers(1,@hid); | ||
+ | inherited; | ||
+ | end; | ||
+ | |||
+ | procedure TGLEAB.bind; | ||
+ | begin | ||
+ | glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,hid); | ||
+ | end; | ||
+ | </source> | ||
+ | |||
+ | Nachdem wir jetzt unser EAB Handle erzeugt haben müssen wir es nur noch mit Daten befüllen. Dazu brauchen wir einen Vertex-'''count''' und die Größe (in Byte) eines einzelnen Vertex um den entsprechenden Speicher reservieren zu können. | ||
+ | <source lang="pascal"> | ||
+ | function TGLEAB.startEdit(valType:Cardinal; count:Cardinal; size: Integer=-1; mode:Cardinal=GL_STATIC_DRAW): Pointer; | ||
+ | begin | ||
+ | self.valType:=valType; | ||
+ | elementsCount:=count; | ||
+ | |||
+ | bind(); | ||
+ | if size>0 then | ||
+ | glBufferData(GL_ELEMENT_ARRAY_BUFFER,size,nil,mode); | ||
+ | |||
+ | Result:=glMapBuffer(GL_ELEMENT_ARRAY_BUFFER,GL_READ_WRITE); | ||
+ | end; | ||
+ | |||
+ | procedure TGLEAB.endEdit; | ||
+ | begin | ||
+ | glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER); | ||
+ | end; | ||
+ | </source> | ||
+ | Hierbei erzeugen wir mit glBufferData einen neuen EAB mit der entsprechenden Größe (bei ''size''=-1 lassen wir ein schon bestehendes EAB in der Größe unverändert). Wie schon beim VBO lassen wir uns danach mit glMapBuffer einen Pointer auf den reservierten Speicherbereich zurückgeben, welchen wir beschreiben können. Wie schon beim erzeugen müssen wir beim Binden wieder '''GL_ELEMENT_ARRAY_BUFFER''' angeben, damit OpenGL unser gebundenes EAB auswählt und nicht ein VBO. | ||
+ | |||
+ | <source lang="pascal"> | ||
+ | glDrawElements(GL_TRIANGLES,indicies.elementsCount*3,indicies.valType,nil); | ||
+ | </source> | ||
==Shader== | ==Shader== | ||
vorrausetzungen (benötigte matrizen + daten vbo mapping) | vorrausetzungen (benötigte matrizen + daten vbo mapping) |
Version vom 24. November 2012, 23:04 Uhr
Inhaltsverzeichnis
OpenGL 3.x Quickstart
Diese Seite ist noch in Bearbeitung/Planung |
Vorwort
warum ogl3 / nachteile /vorteile
Context
erstellung / error handling
VBOs
erstellen (laden?) binden
EABs
Ein Element Array Buffer (im folgenden EAB), "erweitert" die Möglichkeiten Meshes zu Zeichnen. Der Einsatz von EABs bietet sowohl die Möglichkeit Meshes dynamischer zu zeichnen, als auch den Speicherverbrauch (je nach Mesh) drastisch zu reduzieren. Wie der Name schon andeutet, handelt es sich um einen Buffer zum Speichern von Element Array's. Diese Elemente sind in diesem Fall die Indices der einzelnen Mesh-Vertices. In diesem Buffer geben wir daher die Daten nichtmehr direkt an, sondern nur noch einen Index und können erstens Vertices zwischen verschiedenen Faces sharen (zB. bei Ecken in Objekten, welche von mehreren Dreiecken verwendet werden) und zweitens, verschiedene Rendermodes (zB. GL_TRIANGLES, GL_TRIANGLE_STRIP, ...) auf ein und das selbe VBO anwenden, ohne die Reihenfolge der Vertices auf der Grafikkarte verändern zu müssen. Zuerst holen wir uns deshalb, wie schon beim VBO, ein Handle (hier hid:GLUInt) von OpenGL und binden dieses als GL_ELEMENT_ARRAY_BUFFER. Dieses Handle wird am Ende wieder mit glDeleteBuffers freigegeben:
constructor TGLEAB.Create;
begin
glGenBuffers(1,@hid);
bind();
end;
destructor TGLEAB.Destroy;
begin
glDeleteBuffers(1,@hid);
inherited;
end;
procedure TGLEAB.bind;
begin
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,hid);
end;
Nachdem wir jetzt unser EAB Handle erzeugt haben müssen wir es nur noch mit Daten befüllen. Dazu brauchen wir einen Vertex-count und die Größe (in Byte) eines einzelnen Vertex um den entsprechenden Speicher reservieren zu können.
function TGLEAB.startEdit(valType:Cardinal; count:Cardinal; size: Integer=-1; mode:Cardinal=GL_STATIC_DRAW): Pointer;
begin
self.valType:=valType;
elementsCount:=count;
bind();
if size>0 then
glBufferData(GL_ELEMENT_ARRAY_BUFFER,size,nil,mode);
Result:=glMapBuffer(GL_ELEMENT_ARRAY_BUFFER,GL_READ_WRITE);
end;
procedure TGLEAB.endEdit;
begin
glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
end;
Hierbei erzeugen wir mit glBufferData einen neuen EAB mit der entsprechenden Größe (bei size=-1 lassen wir ein schon bestehendes EAB in der Größe unverändert). Wie schon beim VBO lassen wir uns danach mit glMapBuffer einen Pointer auf den reservierten Speicherbereich zurückgeben, welchen wir beschreiben können. Wie schon beim erzeugen müssen wir beim Binden wieder GL_ELEMENT_ARRAY_BUFFER angeben, damit OpenGL unser gebundenes EAB auswählt und nicht ein VBO.
glDrawElements(GL_TRIANGLES,indicies.elementsCount*3,indicies.valType,nil);
Shader
vorrausetzungen (benötigte matrizen + daten vbo mapping) shader arten
Matrizen
kurze! erläuterung. link zu "richtigen" artikeln/tutorials
Zeichnen
eab/vbo/shader binding
Weiterführendes/Aussicht
erläuterungen, weiterführende links