| @@ -2,7 +2,80 @@ unit uglcArrayBuffer; | |||
| { 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+} | |||
| @@ -2,7 +2,24 @@ unit uglcCamera; | |||
| { 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+} | |||
| @@ -2,7 +2,37 @@ unit uglcFrameBufferObject; | |||
| { 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+} | |||
| @@ -2,7 +2,55 @@ unit uglcShader; | |||
| { 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+} | |||