{ 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+}
{ Package: OpenGLCore
Prefix: glc - OpenGL Core
- Beschreibung: diese Unit enthält eine Klassen-Kapselung für OpenGL Frustum und Kamera }
+ Beschreibung: diese Unit enthält eine Klassen-Kapselung für OpenGL Frustum und Kamera
+ Beispiel:
+ var
+ camera: TglcCamera;
+
+ camera := TglcCamera.Create;
+ try
+ camera.Perspective(45, 0.01, 100, 800/600); // define perspective view
+ camera.Move(gluVector(2, 3, -5)); // move 2 right, 3 up and 5 back
+ camera.Tilt(-25); // turn 25 degrees down
+ camera.Turn(-10); // turn 10 degrees left
+ camera.Activate; // activate camera
+
+ // do normal rendering
+
+ finally
+ FreeAndNil(camera);
+ end; }
{$mode objfpc}{$H+}
{ Package: OpenGLCore
Prefix: glc - OpenGL Core
- Beschreibung: diese Unit enthält eine Klassen-Kapselung der OpenGL FrameBufferObjekte }
+ Beschreibung: diese Unit enthält eine Klassen-Kapselung der OpenGL FrameBufferObjekte
+ Beispiel:
+ var
+ fbo: TglcFrameBufferObject;
+ tex: TglcTextureBuffer;
+ buf: TglcRenderBuffer;
+
+ fbo := TglcFrameBufferObject;
+ try
+ ffbo.SetSize(800, 600);
+
+ // creating texture buffer as color buffer
+ tex := TglcTextureBuffer.Create(TglcFormat.fmRGBA, TglcInternalFormat.ifRGBA16F);
+ fbo.AddBuffer(tex, TglcAttachment.atColor0, true);
+
+ // creating render buffer as depth buffer
+ buf := TglcRenderBuffer.Create(TglcInternalFormat.ifDepthComponent);
+ fbo.AddBuffer(buf, TglcAttachment.atDepth, true);
+
+ // render to frame buffer object
+ fbo.Bind;
+ // do normal rendering
+ fbo.Unbind;
+
+ // use texture buffer
+ tex.Bind;
+ // do normal rendering
+ tex.Unbind;
+ finally
+ FreeAndNil(fbo);
+ end; }
{$mode objfpc}{$H+}
{ Package: OpenGLCore
Prefix: glc - OpenGL Core
- Beschreibung: diese Unit enthält eine Klassen-Kapselung der OpenGL Shader Objekte }
+ Beschreibung: diese Unit enthält eine Klassen-Kapselung der OpenGL Shader Objekte
+ Beispiel:
+ var
+ shader: TglcShaderProgram;
+
+ //write log message to console
+ // @param aSender: object that send the message
+ // @param aMsg: message to write to console
+ procedure LogMessage(aSender: TObject; const aMsg: String);
+ begin
+ writeln(Format('[%p]: %s', [aSender, aMsg]);
+ end;
+
+ //load shader object from file and add it to 'shader'
+ // @param aFilename: name of file to load shader code from
+ // @param aType: type of shader object to create
+ procedure LoadShaderObject(const aFilename: String; const aType: TglcShaderType);
+ var
+ sl: TStringList;
+ so: TglcShaderObject;
+ begin
+ sl := TStringList.Create;
+ try
+ sl.LoadFromFile(aFileName);
+ so := TglcShaderObject.Create(aType);
+ shader.add(so);
+ finally
+ FreeAndNil(sl, @LogMessage);
+ end;
+ end;
+
+ shader := TglcShaderProgram.Create(@LogMessage);
+ try
+ // load shader objects
+ LoadShaderObject('./test_shader.vert', TglcShaderType.stVertex);
+ LoadShaderObject('./test_shader.frag', TglcShaderType.stFragment);
+
+ // compile shader
+ shader.Compile;
+
+ // use shader
+ shader.Enable;
+ shader.Uniform1f('uTest', 0.1234);
+ // do normal rendering
+ shader.Disable;
+
+ finally
+ FreeAndNil(shader);
+ end; }
{$mode objfpc}{$H+}