Lazarus - OpenGL 3.3 Tutorial - Vertex-Puffer - Index-Puffer: Unterschied zwischen den Versionen
(→Siehe auch) |
I0n0s (Diskussion | Beiträge) K (→Einleitung) |
||
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt) | |||
Zeile 25: | Zeile 25: | ||
Hier werden die IBO-Daten in den Buffer geladen, dies geschieht ähnlich, wie bei den Vertex-Daten.<br> | Hier werden die IBO-Daten in den Buffer geladen, dies geschieht ähnlich, wie bei den Vertex-Daten.<br> | ||
Der Unterschied ist der zweite Parameter, dieser muss '''GL_ELEMENT_ARRAY_BUFFER''' sein.<br> | Der Unterschied ist der zweite Parameter, dieser muss '''GL_ELEMENT_ARRAY_BUFFER''' sein.<br> | ||
+ | <syntaxhighlight lang="pascal">procedure TForm1.InitScene; | ||
+ | begin | ||
+ | glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe | ||
+ | |||
+ | // --- Daten für das Dreieck | ||
+ | glBindVertexArray(VBTriangle.VAO); | ||
+ | |||
+ | // VBO der Vertex-Koordinaten | ||
+ | glBindBuffer(GL_ARRAY_BUFFER, VBTriangle.VBO); | ||
+ | glBufferData(GL_ARRAY_BUFFER, sizeof(Triangle), @Triangle, GL_STATIC_DRAW); | ||
+ | |||
+ | // IBO binden und mit den Indices-Daten laden | ||
+ | glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBTriangle.IBO); | ||
+ | glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Triangle_Indices), @Triangle_Indices, GL_STATIC_DRAW); | ||
+ | |||
+ | glEnableVertexAttribArray(10); | ||
+ | glVertexAttribPointer(10, 3, GL_FLOAT, False, 0, nil); | ||
+ | |||
+ | // --- Daten für das Quadrat | ||
+ | glBindVertexArray(VBQuad.VAO); | ||
+ | |||
+ | // VBO der Vertex-Koordinaten | ||
+ | glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO); | ||
+ | glBufferData(GL_ARRAY_BUFFER, sizeof(Quad), @Quad, GL_STATIC_DRAW); | ||
+ | |||
+ | // IBO binden und mit den Indices-Daten laden | ||
+ | glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBQuad.IBO); | ||
+ | glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Quad_Indices), @Quad_Indices, GL_STATIC_DRAW); | ||
+ | |||
+ | glEnableVertexAttribArray(10); | ||
+ | glVertexAttribPointer(10, 3, GL_FLOAT, False, 0, nil); | ||
+ | end;</syntaxhighlight> | ||
Da die Indicien im IBO gespeichert sind muss der dritte Paramter bei '''glDrawElements(...''', nil sein.<br> | Da die Indicien im IBO gespeichert sind muss der dritte Paramter bei '''glDrawElements(...''', nil sein.<br> | ||
<syntaxhighlight lang="pascal">procedure TForm1.ogcDrawScene(Sender: TObject); | <syntaxhighlight lang="pascal">procedure TForm1.ogcDrawScene(Sender: TObject); | ||
Zeile 39: | Zeile 71: | ||
glBindVertexArray(VBQuad.VAO); | glBindVertexArray(VBQuad.VAO); | ||
glDrawElements(GL_TRIANGLES, Length(Quad_Indices), GL_UNSIGNED_INT, Nil); // Hier Nil</syntaxhighlight> | glDrawElements(GL_TRIANGLES, Length(Quad_Indices), GL_UNSIGNED_INT, Nil); // Hier Nil</syntaxhighlight> | ||
− | IBO Freigabe ist | + | IBO Freigabe ist gleich wie bei dem VBO.<br> |
<syntaxhighlight lang="pascal">procedure TForm1.FormDestroy(Sender: TObject); | <syntaxhighlight lang="pascal">procedure TForm1.FormDestroy(Sender: TObject); | ||
begin | begin | ||
Zeile 47: | Zeile 79: | ||
glDeleteBuffers(1, @VBQuad.IBO);</syntaxhighlight> | glDeleteBuffers(1, @VBQuad.IBO);</syntaxhighlight> | ||
<br><br> | <br><br> | ||
+ | |||
==Vertex-Shader:== | ==Vertex-Shader:== | ||
<br> | <br> |
Aktuelle Version vom 2. Dezember 2019, 12:10 Uhr
Inhaltsverzeichnis
Vertex-Puffer - Index-Puffer
Einleitung
Die Indicien, kann man auch von Anfang an ins VRAM laden, so müssen die Daten nich jedes mal mit glDrawElements(... neu übegeben werden.
Dafür gibt es den Index Buffer Objects (IBO).
Das Laden geschieht ähnlich wie mit den Vertex-Daten.
Die Deklaration der Vektor-Koordianten und Indicien Konstanten, dies ist gleich wie ohne Buffer.
const
// --- Dreieck
// Vertex-Koordinaten
Triangle: array[0..2] of TVertex3f =
((-0.4, 0.1, 0.0), (0.4, 0.1, 0.0), (0.0, 0.7, 0.0));
// Indicien ( Reihenfolge )
Triangle_Indices: array[0..2] of GLint = (0, 1, 2);
// --- Quadrat
// Vertex-Koordinaten
Quad: array[0..3] of TVertex3f =
((-0.2, -0.6, 0.0), (0.2, -0.6, 0.0), (0.2, -0.1, 0.0), (-0.2, -0.1, 0.0));
// Indicien ( Reihenfolge )
Quad_Indices: array[0..5] of GLint = (0, 1, 2, 0, 2, 3);
Der IBO muss noch deklariert werden.
Das Erzeugen des IBI-Puffer geht gleich wie beim VBO-Puffer.
Hier werden die IBO-Daten in den Buffer geladen, dies geschieht ähnlich, wie bei den Vertex-Daten.
Der Unterschied ist der zweite Parameter, dieser muss GL_ELEMENT_ARRAY_BUFFER sein.
procedure TForm1.InitScene;
begin
glClearColor(0.6, 0.6, 0.4, 1.0); // Hintergrundfarbe
// --- Daten für das Dreieck
glBindVertexArray(VBTriangle.VAO);
// VBO der Vertex-Koordinaten
glBindBuffer(GL_ARRAY_BUFFER, VBTriangle.VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Triangle), @Triangle, GL_STATIC_DRAW);
// IBO binden und mit den Indices-Daten laden
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBTriangle.IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Triangle_Indices), @Triangle_Indices, GL_STATIC_DRAW);
glEnableVertexAttribArray(10);
glVertexAttribPointer(10, 3, GL_FLOAT, False, 0, nil);
// --- Daten für das Quadrat
glBindVertexArray(VBQuad.VAO);
// VBO der Vertex-Koordinaten
glBindBuffer(GL_ARRAY_BUFFER, VBQuad.VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Quad), @Quad, GL_STATIC_DRAW);
// IBO binden und mit den Indices-Daten laden
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VBQuad.IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Quad_Indices), @Quad_Indices, GL_STATIC_DRAW);
glEnableVertexAttribArray(10);
glVertexAttribPointer(10, 3, GL_FLOAT, False, 0, nil);
end;
Da die Indicien im IBO gespeichert sind muss der dritte Paramter bei glDrawElements(..., nil sein.
procedure TForm1.ogcDrawScene(Sender: TObject);
begin
glClear(GL_COLOR_BUFFER_BIT);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // Linien
Shader.UseProgram;
// Zeichne Dreieck
glBindVertexArray(VBTriangle.VAO);
glDrawElements(GL_TRIANGLES, Length(Triangle_Indices), GL_UNSIGNED_INT, Nil); // Hier Nil
// Zeichne Quadrat
glBindVertexArray(VBQuad.VAO);
glDrawElements(GL_TRIANGLES, Length(Quad_Indices), GL_UNSIGNED_INT, Nil); // Hier Nil
IBO Freigabe ist gleich wie bei dem VBO.
procedure TForm1.FormDestroy(Sender: TObject);
begin
Shader.Free;
glDeleteBuffers(1, @VBTriangle.IBO); // Indices-Buffer freigeben.
glDeleteBuffers(1, @VBQuad.IBO);
Vertex-Shader:
#version 330
layout (location = 10) in vec3 inPos; // Vertex-Koordinaten
void main(void)
{
gl_Position = vec4(inPos, 1.0);
}
Fragment-Shader:
#version 330
out vec4 outColor; // ausgegebene Farbe
void main(void)
{
vec3 col = vec3(0.0, 1.0, 1.0); // Mint
outColor = vec4(col, 1.0);
}
Autor: Mathias
Siehe auch
- Übersichtseite Lazarus - OpenGL 3.3 Tutorial