8 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
9 uglcContext, uglcShader, uglcArrayBuffer, uglcTypes, uglcBitmap, uglcVertexArrayObject;
12 TMainForm = class(TForm)
13 ApplicationProperties: TApplicationProperties;
16 procedure ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean);
17 procedure FormCreate(Sender: TObject);
18 procedure FormDestroy(Sender: TObject);
19 procedure RenderPanelResize(Sender: TObject);
21 fContext: TglcContext;
22 fShader: TglcShaderProgram;
23 fVAO: TglcVertexArrayObject;
24 fTexture: TglcBitmap2D;
25 procedure Log(aSender: TObject; const aMsg: String);
28 { public declarations }
39 dglOpenGL, ugluVector;
42 SHADER_FILE = 'shader.glsl';
43 TEXTURE_FILE = 'data\texture.png';
45 LAYOUT_LOCATION_POS = 0;
46 LAYOUT_LOCATION_TEX = 1;
48 UNIFORM_NAME_TEXTURE = 'uTexture';
51 TVertex = packed record
57 procedure CheckGlError;
62 if (err <> 0) then begin
63 ShowMessage('ERROR: 0x' + IntToHex(err, 16));
68 procedure TMainForm.FormCreate(Sender: TObject);
70 pf: TglcContextPixelFormatSettings;
72 texData: TglcBitmapData;
75 pf := TglcContext.MakePF();
76 fContext := TglcContext.GetPlatformClass.Create(RenderPanel, pf);
77 fContext.BuildContext;
79 Log(self, glGetString(GL_VERSION));
81 fShader := TglcShaderProgram.Create(@Log);
82 fShader.LoadFromFile(ExtractFilePath(Application.ExeName) + SHADER_FILE);
84 fShader.Uniform1i(UNIFORM_NAME_TEXTURE, 0);
86 vbo := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer);
87 vbo.BufferData(4, sizeof(TVertex), TglcBufferUsage.buStaticDraw, nil);
88 p := vbo.MapBuffer(TglcBufferAccess.baWriteOnly);
90 p^.pos := gluVector3f(-0.5, -0.5, 0);
91 p^.tex := gluVector2f( 0.0, 1.0);
94 p^.pos := gluVector3f( 0.5, -0.5, 0);
95 p^.tex := gluVector2f( 1.0, 1.0);
98 p^.pos := gluVector3f( 0.5, 0.5, 0);
99 p^.tex := gluVector2f( 1.0, 0.0);
102 p^.pos := gluVector3f(-0.5, 0.5, 0);
103 p^.tex := gluVector2f( 0.0, 0.0);
109 fVAO := TglcVertexArrayObject.Create;
110 fVAO.BindArrayBuffer(vbo, true);
111 fVAO.VertexAttribPointer(LAYOUT_LOCATION_POS, 3, GL_FLOAT, False, SizeOf(TVertex), GLint(@PVertex(nil)^.pos));
112 fVAO.VertexAttribPointer(LAYOUT_LOCATION_TEX, 2, GL_FLOAT, False, SizeOf(TVertex), GLint(@PVertex(nil)^.tex));
114 fTexture := TglcBitmap2D.Create;
115 texData := TglcBitmapData.Create;
117 texData.LoadFromFile(ExtractFilePath(Application.ExeName) + TEXTURE_FILE);
118 fTexture.UploadData(texData);
124 procedure TMainForm.ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean);
130 procedure TMainForm.FormDestroy(Sender: TObject);
132 FreeAndNil(fTexture);
135 FreeAndNil(fContext);
138 procedure TMainForm.RenderPanelResize(Sender: TObject);
140 if Assigned(fContext) then begin
141 glViewport(0, 0, RenderPanel.ClientWidth, RenderPanel.ClientHeight);
145 procedure TMainForm.Log(aSender: TObject; const aMsg: String);
147 LogLB.Items.Add(aMsg);
150 procedure TMainForm.Render;
154 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
160 glDrawArrays(GL_QUADS, 0, 4);
166 fContext.SwapBuffers;