4 Prefix: glc - OpenGL Core
5 Beschreibung: diese Unit enthält eine Klassen-Kapselung für OpenGL Array Buffer
8 TVertex = packed record
9 pos: TgluVector3f; // vertex position
10 tex: TgluVector2f; // texture coordinates
11 nor: TgluVector3f; // normal
16 vBuffer: TglcArrayBuffer;
17 iBuffer: TglcArrayBuffer;
20 vBuffer := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer);
21 iBuffer := TglcArrayBuffer.Create(TglcBufferTarget.btElementArrayBuffer);
23 // write vertex data to vertex buffer
25 vBuffer.BufferData(4, SizeOf(TresMeshVertex), TglcBufferUsage.buStaticDraw, nil);
26 p := vBuffer.MapBuffer(TglcBufferAccess.baWriteOnly);
28 PVertex(p).pos := gluVertex3f(0.0, 0.0, 0.0);
29 PVertex(p).tex := gluVertex2f(0.0, 0.5);
30 PVertex(p).nor := gluVertex3f(0.0, 1.0, 0.0);
31 inc(p, SizeOf(TVertex));
38 // write indices to index buffer
40 iBuffer.BufferData(4, SizeOf(GLuint), TglcBufferUsage.buStaticDraw, nil);
41 p := iBuffer.MapBuffer(TglcBufferAccess.baWriteOnly);
50 // use array buffers to draw primitive
54 glEnableClientState(GL_VERTEX_ARRAY);
55 glVertexPointer(3, GL_FLOAT, 8, Pointer(0));
57 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
58 glTexCoordPointer(2, GL_FLOAT, 8, Pointer(3));
60 glEnableClientState(GL_NORMAL_ARRAY);
61 glNormalPointer(GL_FLOAT, 8, Pointer(5));
63 glEnableClientState(GL_INDEX_ARRAY);
64 glIndexPointer(GL_INT, 0, nil);
66 glDrawElements(GL_QUADS, iBuffer.DataCount, GL_UNSIGNED_INT, nil);
68 glDisableClientState(GL_INDEX_ARRAY);
69 glDisableClientState(GL_VERTEX_ARRAY);
70 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
71 glDisableClientState(GL_NORMAL_ARRAY);
85 dglOpenGL, sysutils, uglcTypes;
88 EglcArrayBuffer = class(Exception);
89 TglcArrayBuffer = class(TObject)
92 fTarget: TglcBufferTarget;
93 fUsage: TglcBufferUsage;
98 property ID: gluInt read fID;
99 property Target: TglcBufferTarget read fTarget;
100 property Usage: TglcBufferUsage read fUsage;
101 property DataCount: Integer read fDataCount;
102 property DataSize: Integer read fDataSize;
104 procedure BufferData(const aDataCount, aDataSize: Cardinal; const aUsage: TglcBufferUsage; const aData: Pointer);
105 function MapBuffer(const aAccess: TglcBufferAccess): Pointer;
106 procedure UnmapBuffer;
109 constructor Create(const aTarget: TglcBufferTarget);
110 destructor Destroy; override;
115 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
116 //TglcArrayBuffer///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
117 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
118 procedure TglcArrayBuffer.BufferData(const aDataCount, aDataSize: Cardinal; const aUsage: TglcBufferUsage; const aData: Pointer);
120 glGetError(); //clear Errors
122 fDataCount := aDataCount;
123 fDataSize := aDataSize;
125 glBufferData(GLenum(fTarget), fDataCount * fDataSize, aData, GLenum(fUsage));
126 glcCheckAndRaiseError;
129 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
130 function TglcArrayBuffer.MapBuffer(const aAccess: TglcBufferAccess): Pointer;
134 if (fDataCount * fDataSize) <= 0 then
136 result := glMapBuffer(GLenum(fTarget), GLenum(aAccess));
137 glcCheckAndRaiseError;
140 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
141 procedure TglcArrayBuffer.UnmapBuffer;
143 glUnmapBuffer(GLenum(fTarget));
146 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
147 procedure TglcArrayBuffer.Bind;
149 glBindBuffer(GLenum(fTarget), fID);
152 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
153 procedure TglcArrayBuffer.Unbind;
155 glBindBuffer(GLenum(fTarget), 0);
158 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
159 constructor TglcArrayBuffer.Create(const aTarget: TglcBufferTarget);
161 if not GL_ARB_Vertex_Buffer_Object then
162 raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported');
164 glGenBuffers(1, @fID);
170 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
171 destructor TglcArrayBuffer.Destroy;
173 glDeleteBuffers(1, @fID);