{ Package: OpenGLCore
Prefix: glc - OpenGL Core
- Beschreibung: diese Unit enthält eine Klassen-Kapselung für OpenGL Array Buffer }
+ Beschreibung: diese Unit enthält eine Klassen-Kapselung für OpenGL Array Buffer
+ Beispiel:
+ type
+ TVertex = packed record
+ pos: TgluVector3f; // vertex position
+ tex: TgluVector2f; // texture coordinates
+ nor: TgluVector3f; // normal
+ end;
+ PVertex = ^TVertex;
+
+ var
+ vBuffer: TglcArrayBuffer;
+ iBuffer: TglcArrayBuffer;
+ p: Pointer;
+
+ vBuffer := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer);
+ iBuffer := TglcArrayBuffer.Create(TglcBufferTarget.btElementArrayBuffer);
+ try
+ // write vertex data to vertex buffer
+ vBuffer.Bind;
+ vBuffer.BufferData(4, SizeOf(TresMeshVertex), TglcBufferUsage.buStaticDraw, nil);
+ p := vBuffer.MapBuffer(TglcBufferAccess.baWriteOnly);
+ try
+ PVertex(p).pos := gluVertex3f(0.0, 0.0, 0.0);
+ PVertex(p).tex := gluVertex2f(0.0, 0.5);
+ PVertex(p).nor := gluVertex3f(0.0, 1.0, 0.0);
+ inc(p, SizeOf(TVertex));
+ // ...
+ finally
+ vBuffer.UnmapBuffer;
+ vBuffer.Unbind;
+ end;
+
+ // write indices to index buffer
+ iBuffer.Bind;
+ iBuffer.BufferData(4, SizeOf(GLuint), TglcBufferUsage.buStaticDraw, nil);
+ p := iBuffer.MapBuffer(TglcBufferAccess.baWriteOnly);
+ try
+ PGLuint(p) := 0;
+ // ...
+ finally
+ iBuffer.UnmapBuffer;
+ iBuffer.Unbind;
+ end;
+
+ // use array buffers to draw primitive
+ vBuffer.Bind;
+ iBuffer.Bind;
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 8, Pointer(0));
+
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, 8, Pointer(3));
+
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glNormalPointer(GL_FLOAT, 8, Pointer(5));
+
+ glEnableClientState(GL_INDEX_ARRAY);
+ glIndexPointer(GL_INT, 0, nil);
+
+ glDrawElements(GL_QUADS, iBuffer.DataCount, GL_UNSIGNED_INT, nil);
+
+ glDisableClientState(GL_INDEX_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ glDisableClientState(GL_NORMAL_ARRAY);
+
+ fIndexBuffer.Unbind;
+ fVertexBuffer.Unbind;
+ finally
+ FreeAndNil(vBuffer);
+ FreeAndNil(iBuffer);
+ end; }
{$mode objfpc}{$H+}