| @@ -2,7 +2,80 @@ unit uglcArrayBuffer; | |||||
| { Package: OpenGLCore | { Package: OpenGLCore | ||||
| Prefix: glc - OpenGL Core | 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+} | {$mode objfpc}{$H+} | ||||
| @@ -2,7 +2,24 @@ unit uglcCamera; | |||||
| { Package: OpenGLCore | { Package: OpenGLCore | ||||
| Prefix: glc - OpenGL Core | 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+} | {$mode objfpc}{$H+} | ||||
| @@ -2,7 +2,37 @@ unit uglcFrameBufferObject; | |||||
| { Package: OpenGLCore | { Package: OpenGLCore | ||||
| Prefix: glc - OpenGL Core | 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+} | {$mode objfpc}{$H+} | ||||
| @@ -2,7 +2,55 @@ unit uglcShader; | |||||
| { Package: OpenGLCore | { Package: OpenGLCore | ||||
| Prefix: glc - OpenGL Core | 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+} | {$mode objfpc}{$H+} | ||||