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 {$IFNDEF OPENGL_ES}dglOpenGL{$ELSE}dglOpenGLES{$ENDIF}, 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 function MapBufferRange(const aOffset: GLintptr; const aSize: GLsizeiptr; const aAccess: TglcBufferAccess): Pointer;
107 procedure UnmapBuffer;
110 constructor Create(const aTarget: TglcBufferTarget);
111 destructor Destroy; override;
116 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
117 //TglcArrayBuffer///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
118 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
119 procedure TglcArrayBuffer.BufferData(const aDataCount, aDataSize: Cardinal; const aUsage: TglcBufferUsage; const aData: Pointer);
121 glGetError(); //clear Errors
123 fDataCount := aDataCount;
124 fDataSize := aDataSize;
126 glBufferData(GLenum(fTarget), fDataCount * fDataSize, aData, GLenum(fUsage));
127 glcCheckAndRaiseError;
130 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
131 function TglcArrayBuffer.MapBuffer(const aAccess: TglcBufferAccess): Pointer;
135 if (fDataCount * fDataSize) <= 0 then
138 result := glMapBuffer(GLenum(fTarget), GLenum(aAccess));
140 if GL_OES_mapbuffer then
141 result := glMapBufferOES(GLenum(fTarget), GLenum(aAccess))
143 raise EglcArrayBuffer.Create('map buffer is not supported by video card');
145 glcCheckAndRaiseError;
148 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
149 function TglcArrayBuffer.MapBufferRange(const aOffset: GLintptr; const aSize: GLsizeiptr; const aAccess: TglcBufferAccess): Pointer;
152 if not (GL_ARB_map_buffer_range or GL_VERSION_3_0) then
153 raise EglcArrayBuffer.Create('map buffer range is not supported by video card');
154 result := glMapBufferRange(GLenum(fTarget), aOffset, aSize, GLenum(aAccess));
156 if GL_VERSION_3_0 then
157 result := glMapBufferRange(GLenum(fTarget), aOffset, aSize, GLenum(aAccess))
158 else if GL_EXT_map_buffer_range then
159 result := glMapBufferRangeEXT(GLenum(fTarget), aOffset, aSize, GLenum(aAccess))
161 raise EglcArrayBuffer.Create('map buffer range is not supported by video card');
165 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
166 procedure TglcArrayBuffer.UnmapBuffer;
169 glUnmapBuffer(GLenum(fTarget));
171 if GL_VERSION_3_0 then
172 glUnmapBuffer(GLenum(fTarget))
173 else if GL_OES_mapbuffer then
174 glUnmapBufferOES(GLenum(fTarget))
176 raise EglcArrayBuffer.Create('unmap buffer is not supported by video card');
180 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
181 procedure TglcArrayBuffer.Bind;
183 glBindBuffer(GLenum(fTarget), fID);
186 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
187 procedure TglcArrayBuffer.Unbind;
189 glBindBuffer(GLenum(fTarget), 0);
192 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
193 constructor TglcArrayBuffer.Create(const aTarget: TglcBufferTarget);
196 if not (GL_ARB_Vertex_Buffer_Object or GL_VERSION_2_0) then
197 raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported');
199 if not GL_VERSION_2_0 then
200 raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported');
204 glGenBuffers(1, @fID);
208 glcCheckAndRaiseError;
211 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
212 destructor TglcArrayBuffer.Destroy;
214 glDeleteBuffers(1, @fID);