Sfoglia il codice sorgente

* added small example code snippets

master
Bergmann89 9 anni fa
parent
commit
d5957a5e72
4 ha cambiato i file con 172 aggiunte e 4 eliminazioni
  1. +74
    -1
      uglcArrayBuffer.pas
  2. +18
    -1
      uglcCamera.pas
  3. +31
    -1
      uglcFrameBufferObject.pas
  4. +49
    -1
      uglcShader.pas

+ 74
- 1
uglcArrayBuffer.pas Vedi File

@@ -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+}



+ 18
- 1
uglcCamera.pas Vedi File

@@ -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+}



+ 31
- 1
uglcFrameBufferObject.pas Vedi File

@@ -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+}



+ 49
- 1
uglcShader.pas Vedi File

@@ -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+}



Caricamento…
Annulla
Salva