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 not GL_OES_mapbuffer then
141 raise EglcArrayBuffer.Create('map buffer is not supported by video card');
142 result := glMapBufferOES(GLenum(fTarget), GLenum(aAccess));
144 glcCheckAndRaiseError;
147 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
148 function TglcArrayBuffer.MapBufferRange(const aOffset: GLintptr; const aSize: GLsizeiptr; const aAccess: TglcBufferAccess): Pointer;
151 if not (GL_ARB_map_buffer_range or GL_VERSION_3_0) then
152 raise EglcArrayBuffer.Create('map buffer range is not supported by video card');
153 result := glMapBufferRange(GLenum(fTarget), aOffset, aSize, GLenum(aAccess));
155 if not GL_VERSION_3_0 then
156 raise EglcArrayBuffer.Create('map buffer range is not supported by video card');
157 result := glMapBufferRange(GLenum(fTarget), aOffset, aSize, GLenum(aAccess));
161 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
162 procedure TglcArrayBuffer.UnmapBuffer;
165 glUnmapBuffer(GLenum(fTarget));
167 if not (GL_OES_mapbuffer or GL_VERSION_3_0) then
168 raise EglcArrayBuffer.Create('unmap buffer is not supported by video card');
169 glUnmapBuffer(GLenum(fTarget));
173 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
174 procedure TglcArrayBuffer.Bind;
176 glBindBuffer(GLenum(fTarget), fID);
179 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
180 procedure TglcArrayBuffer.Unbind;
182 glBindBuffer(GLenum(fTarget), 0);
185 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
186 constructor TglcArrayBuffer.Create(const aTarget: TglcBufferTarget);
189 if not (GL_ARB_Vertex_Buffer_Object or GL_VERSION_2_0) then
190 raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported');
192 if not GL_VERSION_2_0 then
193 raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported');
196 glGenBuffers(1, @fID);
200 glcCheckAndRaiseError;
203 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
204 destructor TglcArrayBuffer.Destroy;
206 glDeleteBuffers(1, @fID);