* implemented vertex array objects * added examplesmaster
| @@ -0,0 +1,82 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <CONFIG> | |||
| <ProjectOptions> | |||
| <Version Value="9"/> | |||
| <PathDelim Value="\"/> | |||
| <General> | |||
| <SessionStorage Value="InProjectDir"/> | |||
| <MainUnit Value="0"/> | |||
| <Title Value="project1"/> | |||
| <ResourceType Value="res"/> | |||
| <UseXPManifest Value="True"/> | |||
| </General> | |||
| <i18n> | |||
| <EnableI18N LFM="False"/> | |||
| </i18n> | |||
| <VersionInfo> | |||
| <StringTable ProductVersion=""/> | |||
| </VersionInfo> | |||
| <BuildModes Count="1"> | |||
| <Item1 Name="Default" Default="True"/> | |||
| </BuildModes> | |||
| <PublishOptions> | |||
| <Version Value="2"/> | |||
| </PublishOptions> | |||
| <RunParams> | |||
| <local> | |||
| <FormatVersion Value="1"/> | |||
| </local> | |||
| </RunParams> | |||
| <RequiredPackages Count="1"> | |||
| <Item1> | |||
| <PackageName Value="LCL"/> | |||
| </Item1> | |||
| </RequiredPackages> | |||
| <Units Count="2"> | |||
| <Unit0> | |||
| <Filename Value="project1.lpr"/> | |||
| <IsPartOfProject Value="True"/> | |||
| </Unit0> | |||
| <Unit1> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <ComponentName Value="MainForm"/> | |||
| <HasResources Value="True"/> | |||
| <ResourceBaseClass Value="Form"/> | |||
| <UnitName Value="uMainForm"/> | |||
| </Unit1> | |||
| </Units> | |||
| </ProjectOptions> | |||
| <CompilerOptions> | |||
| <Version Value="11"/> | |||
| <PathDelim Value="\"/> | |||
| <Target> | |||
| <Filename Value="project1"/> | |||
| </Target> | |||
| <SearchPaths> | |||
| <IncludeFiles Value="$(ProjOutDir);..\.."/> | |||
| <OtherUnitFiles Value="..\.."/> | |||
| <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> | |||
| </SearchPaths> | |||
| <Linking> | |||
| <Options> | |||
| <Win32> | |||
| <GraphicApplication Value="True"/> | |||
| </Win32> | |||
| </Options> | |||
| </Linking> | |||
| </CompilerOptions> | |||
| <Debugging> | |||
| <Exceptions Count="3"> | |||
| <Item1> | |||
| <Name Value="EAbort"/> | |||
| </Item1> | |||
| <Item2> | |||
| <Name Value="ECodetoolError"/> | |||
| </Item2> | |||
| <Item3> | |||
| <Name Value="EFOpenError"/> | |||
| </Item3> | |||
| </Exceptions> | |||
| </Debugging> | |||
| </CONFIG> | |||
| @@ -0,0 +1,21 @@ | |||
| program project1; | |||
| {$mode objfpc}{$H+} | |||
| uses | |||
| {$IFDEF UNIX}{$IFDEF UseCThreads} | |||
| cthreads, | |||
| {$ENDIF}{$ENDIF} | |||
| Interfaces, // this includes the LCL widgetset | |||
| Forms, uMainForm | |||
| { you can add units after this }; | |||
| {$R *.res} | |||
| begin | |||
| RequireDerivedFormResource := True; | |||
| Application.Initialize; | |||
| Application.CreateForm(TMainForm, MainForm); | |||
| Application.Run; | |||
| end. | |||
| @@ -0,0 +1,19 @@ | |||
| /* ShaderObject: GL_VERTEX_SHADER */ | |||
| #version 330 | |||
| uniform mat4 uModelViewProjMat; | |||
| layout(location = 0) in vec3 inPos; | |||
| void main(void) | |||
| { | |||
| gl_Position = vec4(inPos, 1.0); | |||
| } | |||
| /* ShaderObject: GL_FRAGMENT_SHADER */ | |||
| #version 330 | |||
| out vec4 outColor; // ausgegebene Farbe | |||
| void main(void) | |||
| { | |||
| outColor = vec4(1.0, 0.0, 0.0, 1.0); | |||
| } | |||
| @@ -0,0 +1,35 @@ | |||
| object MainForm: TMainForm | |||
| Left = 465 | |||
| Height = 451 | |||
| Top = 217 | |||
| Width = 411 | |||
| Caption = 'MainForm' | |||
| ClientHeight = 451 | |||
| ClientWidth = 411 | |||
| OnCreate = FormCreate | |||
| OnDestroy = FormDestroy | |||
| LCLVersion = '1.3' | |||
| object RenderPanel: TPanel | |||
| Left = 0 | |||
| Height = 371 | |||
| Top = 0 | |||
| Width = 411 | |||
| Align = alClient | |||
| TabOrder = 0 | |||
| OnResize = RenderPanelResize | |||
| end | |||
| object LogLB: TListBox | |||
| Left = 0 | |||
| Height = 80 | |||
| Top = 371 | |||
| Width = 411 | |||
| Align = alBottom | |||
| ItemHeight = 0 | |||
| TabOrder = 1 | |||
| end | |||
| object ApplicationProperties: TApplicationProperties | |||
| OnIdle = ApplicationPropertiesIdle | |||
| left = 64 | |||
| top = 24 | |||
| end | |||
| end | |||
| @@ -0,0 +1,122 @@ | |||
| unit uMainForm; | |||
| {$mode objfpc}{$H+} | |||
| interface | |||
| uses | |||
| Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, | |||
| uglcContext, uglcShader, uglcArrayBuffer, uglcTypes; | |||
| type | |||
| TMainForm = class(TForm) | |||
| ApplicationProperties: TApplicationProperties; | |||
| LogLB: TListBox; | |||
| RenderPanel: TPanel; | |||
| procedure ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean); | |||
| procedure FormCreate(Sender: TObject); | |||
| procedure FormDestroy(Sender: TObject); | |||
| procedure RenderPanelResize(Sender: TObject); | |||
| private | |||
| fContext: TglcContext; | |||
| fShader: TglcShaderProgram; | |||
| fVBO: TglcArrayBuffer; | |||
| procedure Log(aSender: TObject; const aMsg: String); | |||
| procedure Render; | |||
| public | |||
| { public declarations } | |||
| end; | |||
| var | |||
| MainForm: TMainForm; | |||
| implementation | |||
| {$R *.lfm} | |||
| uses | |||
| dglOpenGL, ugluVector; | |||
| const | |||
| SHADER_FILE = 'shader.glsl'; | |||
| LAYOUT_LOCATION_POS = 0; | |||
| procedure TMainForm.FormCreate(Sender: TObject); | |||
| type | |||
| TVertex = packed record | |||
| pos: TgluVector3f; | |||
| end; | |||
| PVertex = ^TVertex; | |||
| var | |||
| pf: TglcContextPixelFormatSettings; | |||
| p: PVertex; | |||
| begin | |||
| pf := TglcContext.MakePF(); | |||
| fContext := TglcContext.GetPlatformClass.Create(RenderPanel, pf); | |||
| fContext.BuildContext; | |||
| fShader := TglcShaderProgram.Create(@Log); | |||
| fShader.LoadFromFile(ExtractFilePath(Application.ExeName) + SHADER_FILE); | |||
| fShader.Compile; | |||
| fVBO := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer); | |||
| fVBO.BufferData(4, sizeof(TVertex), TglcBufferUsage.buStaticDraw, nil); | |||
| p := fVBO.MapBuffer(TglcBufferAccess.baWriteOnly); | |||
| try | |||
| p^.pos := gluVector3f(-0.5, -0.5, 0); inc(p); | |||
| p^.pos := gluVector3f( 0.5, -0.5, 0); inc(p); | |||
| p^.pos := gluVector3f( 0.5, 0.5, 0); inc(p); | |||
| p^.pos := gluVector3f(-0.5, 0.5, 0); inc(p); | |||
| finally | |||
| fVBO.UnmapBuffer; | |||
| end; | |||
| end; | |||
| procedure TMainForm.ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean); | |||
| begin | |||
| Render; | |||
| Done := false; | |||
| end; | |||
| procedure TMainForm.FormDestroy(Sender: TObject); | |||
| begin | |||
| FreeAndNil(fVBO); | |||
| FreeAndNil(fShader); | |||
| FreeAndNil(fContext); | |||
| end; | |||
| procedure TMainForm.RenderPanelResize(Sender: TObject); | |||
| begin | |||
| if Assigned(fContext) then begin | |||
| glViewport(0, 0, RenderPanel.ClientWidth, RenderPanel.ClientHeight); | |||
| end; | |||
| end; | |||
| procedure TMainForm.Log(aSender: TObject; const aMsg: String); | |||
| begin | |||
| LogLB.Items.Add(aMsg); | |||
| end; | |||
| procedure TMainForm.Render; | |||
| begin | |||
| glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); | |||
| fVBO.Bind; | |||
| fShader.Enable; | |||
| glEnableVertexAttribArray(LAYOUT_LOCATION_POS); | |||
| glVertexAttribPointer(LAYOUT_LOCATION_POS, 3, GL_FLOAT, False, 0, nil); | |||
| glDrawArrays(GL_QUADS, 0, fVBO.DataCount); | |||
| glDisableVertexAttribArray(LAYOUT_LOCATION_POS); | |||
| fShader.Disable; | |||
| fVBO.Unbind; | |||
| fContext.SwapBuffers; | |||
| end; | |||
| end. | |||
| @@ -0,0 +1,82 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <CONFIG> | |||
| <ProjectOptions> | |||
| <Version Value="9"/> | |||
| <PathDelim Value="\"/> | |||
| <General> | |||
| <SessionStorage Value="InProjectDir"/> | |||
| <MainUnit Value="0"/> | |||
| <Title Value="project1"/> | |||
| <ResourceType Value="res"/> | |||
| <UseXPManifest Value="True"/> | |||
| </General> | |||
| <i18n> | |||
| <EnableI18N LFM="False"/> | |||
| </i18n> | |||
| <VersionInfo> | |||
| <StringTable ProductVersion=""/> | |||
| </VersionInfo> | |||
| <BuildModes Count="1"> | |||
| <Item1 Name="Default" Default="True"/> | |||
| </BuildModes> | |||
| <PublishOptions> | |||
| <Version Value="2"/> | |||
| </PublishOptions> | |||
| <RunParams> | |||
| <local> | |||
| <FormatVersion Value="1"/> | |||
| </local> | |||
| </RunParams> | |||
| <RequiredPackages Count="1"> | |||
| <Item1> | |||
| <PackageName Value="LCL"/> | |||
| </Item1> | |||
| </RequiredPackages> | |||
| <Units Count="2"> | |||
| <Unit0> | |||
| <Filename Value="project1.lpr"/> | |||
| <IsPartOfProject Value="True"/> | |||
| </Unit0> | |||
| <Unit1> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <ComponentName Value="MainForm"/> | |||
| <HasResources Value="True"/> | |||
| <ResourceBaseClass Value="Form"/> | |||
| <UnitName Value="uMainForm"/> | |||
| </Unit1> | |||
| </Units> | |||
| </ProjectOptions> | |||
| <CompilerOptions> | |||
| <Version Value="11"/> | |||
| <PathDelim Value="\"/> | |||
| <Target> | |||
| <Filename Value="project1"/> | |||
| </Target> | |||
| <SearchPaths> | |||
| <IncludeFiles Value="$(ProjOutDir);..\.."/> | |||
| <OtherUnitFiles Value="..\.."/> | |||
| <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> | |||
| </SearchPaths> | |||
| <Linking> | |||
| <Options> | |||
| <Win32> | |||
| <GraphicApplication Value="True"/> | |||
| </Win32> | |||
| </Options> | |||
| </Linking> | |||
| </CompilerOptions> | |||
| <Debugging> | |||
| <Exceptions Count="3"> | |||
| <Item1> | |||
| <Name Value="EAbort"/> | |||
| </Item1> | |||
| <Item2> | |||
| <Name Value="ECodetoolError"/> | |||
| </Item2> | |||
| <Item3> | |||
| <Name Value="EFOpenError"/> | |||
| </Item3> | |||
| </Exceptions> | |||
| </Debugging> | |||
| </CONFIG> | |||
| @@ -0,0 +1,21 @@ | |||
| program project1; | |||
| {$mode objfpc}{$H+} | |||
| uses | |||
| {$IFDEF UNIX}{$IFDEF UseCThreads} | |||
| cthreads, | |||
| {$ENDIF}{$ENDIF} | |||
| Interfaces, // this includes the LCL widgetset | |||
| Forms, uMainForm | |||
| { you can add units after this }; | |||
| {$R *.res} | |||
| begin | |||
| RequireDerivedFormResource := True; | |||
| Application.Initialize; | |||
| Application.CreateForm(TMainForm, MainForm); | |||
| Application.Run; | |||
| end. | |||
| @@ -0,0 +1,23 @@ | |||
| /* ShaderObject: GL_VERTEX_SHADER */ | |||
| #version 330 | |||
| uniform mat4 uModelViewProjMat; | |||
| layout(location = 0) in vec3 inPos; | |||
| layout(location = 1) in vec2 inTexCoord; | |||
| out vec2 vTexCoord; | |||
| void main(void) | |||
| { | |||
| gl_Position = vec4(inPos, 1.0); | |||
| vTexCoord = inTexCoord; | |||
| } | |||
| /* ShaderObject: GL_FRAGMENT_SHADER */ | |||
| #version 330 | |||
| uniform sampler2D uTexture; | |||
| in vec2 vTexCoord; | |||
| out vec4 outColor; | |||
| void main(void) | |||
| { | |||
| outColor = texture(uTexture, vTexCoord); | |||
| } | |||
| @@ -0,0 +1,35 @@ | |||
| object MainForm: TMainForm | |||
| Left = 465 | |||
| Height = 451 | |||
| Top = 217 | |||
| Width = 411 | |||
| Caption = 'MainForm' | |||
| ClientHeight = 451 | |||
| ClientWidth = 411 | |||
| OnCreate = FormCreate | |||
| OnDestroy = FormDestroy | |||
| LCLVersion = '1.3' | |||
| object RenderPanel: TPanel | |||
| Left = 0 | |||
| Height = 371 | |||
| Top = 0 | |||
| Width = 411 | |||
| Align = alClient | |||
| TabOrder = 0 | |||
| OnResize = RenderPanelResize | |||
| end | |||
| object LogLB: TListBox | |||
| Left = 0 | |||
| Height = 80 | |||
| Top = 371 | |||
| Width = 411 | |||
| Align = alBottom | |||
| ItemHeight = 0 | |||
| TabOrder = 1 | |||
| end | |||
| object ApplicationProperties: TApplicationProperties | |||
| OnIdle = ApplicationPropertiesIdle | |||
| left = 64 | |||
| top = 24 | |||
| end | |||
| end | |||
| @@ -0,0 +1,156 @@ | |||
| unit uMainForm; | |||
| {$mode objfpc}{$H+} | |||
| interface | |||
| uses | |||
| Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, | |||
| uglcContext, uglcShader, uglcArrayBuffer, uglcTypes, uglcBitmap; | |||
| type | |||
| TMainForm = class(TForm) | |||
| ApplicationProperties: TApplicationProperties; | |||
| LogLB: TListBox; | |||
| RenderPanel: TPanel; | |||
| procedure ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean); | |||
| procedure FormCreate(Sender: TObject); | |||
| procedure FormDestroy(Sender: TObject); | |||
| procedure RenderPanelResize(Sender: TObject); | |||
| private | |||
| fContext: TglcContext; | |||
| fShader: TglcShaderProgram; | |||
| fVBO: TglcArrayBuffer; | |||
| fTexture: TglcBitmap2D; | |||
| procedure Log(aSender: TObject; const aMsg: String); | |||
| procedure Render; | |||
| public | |||
| { public declarations } | |||
| end; | |||
| var | |||
| MainForm: TMainForm; | |||
| implementation | |||
| {$R *.lfm} | |||
| uses | |||
| dglOpenGL, ugluVector; | |||
| const | |||
| SHADER_FILE = 'shader.glsl'; | |||
| TEXTURE_FILE = 'data\texture.png'; | |||
| LAYOUT_LOCATION_POS = 0; | |||
| LAYOUT_LOCATION_TEX = 1; | |||
| UNIFORM_NAME_TEXTURE = 'uTexture'; | |||
| type | |||
| TVertex = packed record | |||
| pos: TgluVector3f; | |||
| tex: TgluVector2f; | |||
| end; | |||
| PVertex = ^TVertex; | |||
| procedure TMainForm.FormCreate(Sender: TObject); | |||
| var | |||
| pf: TglcContextPixelFormatSettings; | |||
| p: PVertex; | |||
| texData: TglcBitmapData; | |||
| begin | |||
| pf := TglcContext.MakePF(); | |||
| fContext := TglcContext.GetPlatformClass.Create(RenderPanel, pf); | |||
| fContext.BuildContext; | |||
| fShader := TglcShaderProgram.Create(@Log); | |||
| fShader.LoadFromFile(ExtractFilePath(Application.ExeName) + SHADER_FILE); | |||
| fShader.Compile; | |||
| fShader.Uniform1i(UNIFORM_NAME_TEXTURE, 0); | |||
| fVBO := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer); | |||
| fVBO.BufferData(4, sizeof(TVertex), TglcBufferUsage.buStaticDraw, nil); | |||
| p := fVBO.MapBuffer(TglcBufferAccess.baWriteOnly); | |||
| try | |||
| p^.pos := gluVector3f(-0.5, -0.5, 0); | |||
| p^.tex := gluVector2f( 0.0, 1.0); | |||
| inc(p); | |||
| p^.pos := gluVector3f( 0.5, -0.5, 0); | |||
| p^.tex := gluVector2f( 1.0, 1.0); | |||
| inc(p); | |||
| p^.pos := gluVector3f( 0.5, 0.5, 0); | |||
| p^.tex := gluVector2f( 1.0, 0.0); | |||
| inc(p); | |||
| p^.pos := gluVector3f(-0.5, 0.5, 0); | |||
| p^.tex := gluVector2f( 0.0, 0.0); | |||
| inc(p); | |||
| finally | |||
| fVBO.UnmapBuffer; | |||
| end; | |||
| fTexture := TglcBitmap2D.Create; | |||
| texData := TglcBitmapData.Create; | |||
| try | |||
| texData.LoadFromFile(ExtractFilePath(Application.ExeName) + TEXTURE_FILE); | |||
| fTexture.UploadData(texData); | |||
| finally | |||
| FreeAndNil(texData); | |||
| end; | |||
| end; | |||
| procedure TMainForm.ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean); | |||
| begin | |||
| Render; | |||
| Done := false; | |||
| end; | |||
| procedure TMainForm.FormDestroy(Sender: TObject); | |||
| begin | |||
| FreeAndNil(fVBO); | |||
| FreeAndNil(fShader); | |||
| FreeAndNil(fContext); | |||
| end; | |||
| procedure TMainForm.RenderPanelResize(Sender: TObject); | |||
| begin | |||
| if Assigned(fContext) then begin | |||
| glViewport(0, 0, RenderPanel.ClientWidth, RenderPanel.ClientHeight); | |||
| end; | |||
| end; | |||
| procedure TMainForm.Log(aSender: TObject; const aMsg: String); | |||
| begin | |||
| LogLB.Items.Add(aMsg); | |||
| end; | |||
| procedure TMainForm.Render; | |||
| begin | |||
| glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); | |||
| fVBO.Bind; | |||
| fTexture.Bind; | |||
| fShader.Enable; | |||
| glEnableVertexAttribArray(LAYOUT_LOCATION_POS); | |||
| glVertexAttribPointer(LAYOUT_LOCATION_POS, 3, GL_FLOAT, False, SizeOf(TVertex), @PVertex(nil)^.pos); | |||
| glEnableVertexAttribArray(LAYOUT_LOCATION_TEX); | |||
| glVertexAttribPointer(LAYOUT_LOCATION_TEX, 2, GL_FLOAT, False, SizeOf(TVertex), @PVertex(nil)^.tex); | |||
| glDrawArrays(GL_QUADS, 0, fVBO.DataCount); | |||
| glDisableVertexAttribArray(LAYOUT_LOCATION_POS); | |||
| glDisableVertexAttribArray(LAYOUT_LOCATION_TEX); | |||
| fShader.Disable; | |||
| fTexture.Unbind; | |||
| fVBO.Unbind; | |||
| fContext.SwapBuffers; | |||
| end; | |||
| end. | |||
| @@ -0,0 +1,91 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <CONFIG> | |||
| <ProjectOptions> | |||
| <Version Value="9"/> | |||
| <PathDelim Value="\"/> | |||
| <General> | |||
| <SessionStorage Value="InProjectDir"/> | |||
| <MainUnit Value="0"/> | |||
| <Title Value="project1"/> | |||
| <ResourceType Value="res"/> | |||
| <UseXPManifest Value="True"/> | |||
| </General> | |||
| <i18n> | |||
| <EnableI18N LFM="False"/> | |||
| </i18n> | |||
| <VersionInfo> | |||
| <StringTable ProductVersion=""/> | |||
| </VersionInfo> | |||
| <BuildModes Count="1"> | |||
| <Item1 Name="Default" Default="True"/> | |||
| </BuildModes> | |||
| <PublishOptions> | |||
| <Version Value="2"/> | |||
| </PublishOptions> | |||
| <RunParams> | |||
| <local> | |||
| <FormatVersion Value="1"/> | |||
| </local> | |||
| </RunParams> | |||
| <RequiredPackages Count="1"> | |||
| <Item1> | |||
| <PackageName Value="LCL"/> | |||
| </Item1> | |||
| </RequiredPackages> | |||
| <Units Count="3"> | |||
| <Unit0> | |||
| <Filename Value="project1.lpr"/> | |||
| <IsPartOfProject Value="True"/> | |||
| </Unit0> | |||
| <Unit1> | |||
| <Filename Value="uMainForm.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <ComponentName Value="MainForm"/> | |||
| <HasResources Value="True"/> | |||
| <ResourceBaseClass Value="Form"/> | |||
| <UnitName Value="uMainForm"/> | |||
| </Unit1> | |||
| <Unit2> | |||
| <Filename Value="..\..\uglcVertexArrayObject.pas"/> | |||
| <IsPartOfProject Value="True"/> | |||
| <UnitName Value="uglcVertexArrayObject"/> | |||
| </Unit2> | |||
| </Units> | |||
| </ProjectOptions> | |||
| <CompilerOptions> | |||
| <Version Value="11"/> | |||
| <PathDelim Value="\"/> | |||
| <Target> | |||
| <Filename Value="project1"/> | |||
| </Target> | |||
| <SearchPaths> | |||
| <IncludeFiles Value="$(ProjOutDir);..\.."/> | |||
| <OtherUnitFiles Value="..\.."/> | |||
| <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> | |||
| </SearchPaths> | |||
| <Linking> | |||
| <Debugging> | |||
| <UseHeaptrc Value="True"/> | |||
| <UseExternalDbgSyms Value="True"/> | |||
| </Debugging> | |||
| <Options> | |||
| <Win32> | |||
| <GraphicApplication Value="True"/> | |||
| </Win32> | |||
| </Options> | |||
| </Linking> | |||
| </CompilerOptions> | |||
| <Debugging> | |||
| <Exceptions Count="3"> | |||
| <Item1> | |||
| <Name Value="EAbort"/> | |||
| </Item1> | |||
| <Item2> | |||
| <Name Value="ECodetoolError"/> | |||
| </Item2> | |||
| <Item3> | |||
| <Name Value="EFOpenError"/> | |||
| </Item3> | |||
| </Exceptions> | |||
| </Debugging> | |||
| </CONFIG> | |||
| @@ -0,0 +1,21 @@ | |||
| program project1; | |||
| {$mode objfpc}{$H+} | |||
| uses | |||
| {$IFDEF UNIX}{$IFDEF UseCThreads} | |||
| cthreads, | |||
| {$ENDIF}{$ENDIF} | |||
| Interfaces, // this includes the LCL widgetset | |||
| Forms, uMainForm, uglcVertexArrayObject | |||
| { you can add units after this }; | |||
| {$R *.res} | |||
| begin | |||
| RequireDerivedFormResource := True; | |||
| Application.Initialize; | |||
| Application.CreateForm(TMainForm, MainForm); | |||
| Application.Run; | |||
| end. | |||
| @@ -0,0 +1,23 @@ | |||
| /* ShaderObject: GL_VERTEX_SHADER */ | |||
| #version 330 | |||
| uniform mat4 uModelViewProjMat; | |||
| layout(location = 0) in vec3 inPos; | |||
| layout(location = 1) in vec2 inTexCoord; | |||
| out vec2 vTexCoord; | |||
| void main(void) | |||
| { | |||
| gl_Position = vec4(inPos, 1.0); | |||
| vTexCoord = inTexCoord; | |||
| } | |||
| /* ShaderObject: GL_FRAGMENT_SHADER */ | |||
| #version 330 | |||
| uniform sampler2D uTexture; | |||
| in vec2 vTexCoord; | |||
| out vec4 outColor; | |||
| void main(void) | |||
| { | |||
| outColor = texture(uTexture, vTexCoord); | |||
| } | |||
| @@ -0,0 +1,35 @@ | |||
| object MainForm: TMainForm | |||
| Left = 465 | |||
| Height = 451 | |||
| Top = 217 | |||
| Width = 411 | |||
| Caption = 'MainForm' | |||
| ClientHeight = 451 | |||
| ClientWidth = 411 | |||
| OnCreate = FormCreate | |||
| OnDestroy = FormDestroy | |||
| LCLVersion = '1.3' | |||
| object RenderPanel: TPanel | |||
| Left = 0 | |||
| Height = 371 | |||
| Top = 0 | |||
| Width = 411 | |||
| Align = alClient | |||
| TabOrder = 0 | |||
| OnResize = RenderPanelResize | |||
| end | |||
| object LogLB: TListBox | |||
| Left = 0 | |||
| Height = 80 | |||
| Top = 371 | |||
| Width = 411 | |||
| Align = alBottom | |||
| ItemHeight = 0 | |||
| TabOrder = 1 | |||
| end | |||
| object ApplicationProperties: TApplicationProperties | |||
| OnIdle = ApplicationPropertiesIdle | |||
| left = 64 | |||
| top = 24 | |||
| end | |||
| end | |||
| @@ -0,0 +1,170 @@ | |||
| unit uMainForm; | |||
| {$mode objfpc}{$H+} | |||
| interface | |||
| uses | |||
| Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, | |||
| uglcContext, uglcShader, uglcArrayBuffer, uglcTypes, uglcBitmap, uglcVertexArrayObject; | |||
| type | |||
| TMainForm = class(TForm) | |||
| ApplicationProperties: TApplicationProperties; | |||
| LogLB: TListBox; | |||
| RenderPanel: TPanel; | |||
| procedure ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean); | |||
| procedure FormCreate(Sender: TObject); | |||
| procedure FormDestroy(Sender: TObject); | |||
| procedure RenderPanelResize(Sender: TObject); | |||
| private | |||
| fContext: TglcContext; | |||
| fShader: TglcShaderProgram; | |||
| fVAO: TglcVertexArrayObject; | |||
| fTexture: TglcBitmap2D; | |||
| procedure Log(aSender: TObject; const aMsg: String); | |||
| procedure Render; | |||
| public | |||
| { public declarations } | |||
| end; | |||
| var | |||
| MainForm: TMainForm; | |||
| implementation | |||
| {$R *.lfm} | |||
| uses | |||
| dglOpenGL, ugluVector; | |||
| const | |||
| SHADER_FILE = 'shader.glsl'; | |||
| TEXTURE_FILE = 'data\texture.png'; | |||
| LAYOUT_LOCATION_POS = 0; | |||
| LAYOUT_LOCATION_TEX = 1; | |||
| UNIFORM_NAME_TEXTURE = 'uTexture'; | |||
| type | |||
| TVertex = packed record | |||
| pos: TgluVector3f; | |||
| tex: TgluVector2f; | |||
| end; | |||
| PVertex = ^TVertex; | |||
| procedure CheckGlError; | |||
| var | |||
| err: GLenum; | |||
| begin | |||
| err := glGetError(); | |||
| if (err <> 0) then begin | |||
| ShowMessage('ERROR: 0x' + IntToHex(err, 16)); | |||
| halt; | |||
| end; | |||
| end; | |||
| procedure TMainForm.FormCreate(Sender: TObject); | |||
| var | |||
| pf: TglcContextPixelFormatSettings; | |||
| p: PVertex; | |||
| texData: TglcBitmapData; | |||
| vbo: TglcArrayBuffer; | |||
| begin | |||
| pf := TglcContext.MakePF(); | |||
| fContext := TglcContext.GetPlatformClass.Create(RenderPanel, pf); | |||
| fContext.BuildContext; | |||
| Log(self, glGetString(GL_VERSION)); | |||
| fShader := TglcShaderProgram.Create(@Log); | |||
| fShader.LoadFromFile(ExtractFilePath(Application.ExeName) + SHADER_FILE); | |||
| fShader.Compile; | |||
| fShader.Uniform1i(UNIFORM_NAME_TEXTURE, 0); | |||
| vbo := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer); | |||
| vbo.BufferData(4, sizeof(TVertex), TglcBufferUsage.buStaticDraw, nil); | |||
| p := vbo.MapBuffer(TglcBufferAccess.baWriteOnly); | |||
| try | |||
| p^.pos := gluVector3f(-0.5, -0.5, 0); | |||
| p^.tex := gluVector2f( 0.0, 1.0); | |||
| inc(p); | |||
| p^.pos := gluVector3f( 0.5, -0.5, 0); | |||
| p^.tex := gluVector2f( 1.0, 1.0); | |||
| inc(p); | |||
| p^.pos := gluVector3f( 0.5, 0.5, 0); | |||
| p^.tex := gluVector2f( 1.0, 0.0); | |||
| inc(p); | |||
| p^.pos := gluVector3f(-0.5, 0.5, 0); | |||
| p^.tex := gluVector2f( 0.0, 0.0); | |||
| inc(p); | |||
| finally | |||
| vbo.UnmapBuffer; | |||
| end; | |||
| fVAO := TglcVertexArrayObject.Create; | |||
| fVAO.BindArrayBuffer(vbo, true); | |||
| fVAO.VertexAttribPointer(LAYOUT_LOCATION_POS, 3, GL_FLOAT, False, SizeOf(TVertex), GLint(@PVertex(nil)^.pos)); | |||
| fVAO.VertexAttribPointer(LAYOUT_LOCATION_TEX, 2, GL_FLOAT, False, SizeOf(TVertex), GLint(@PVertex(nil)^.tex)); | |||
| fTexture := TglcBitmap2D.Create; | |||
| texData := TglcBitmapData.Create; | |||
| try | |||
| texData.LoadFromFile(ExtractFilePath(Application.ExeName) + TEXTURE_FILE); | |||
| fTexture.UploadData(texData); | |||
| finally | |||
| FreeAndNil(texData); | |||
| end; | |||
| end; | |||
| procedure TMainForm.ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean); | |||
| begin | |||
| Render; | |||
| Done := false; | |||
| end; | |||
| procedure TMainForm.FormDestroy(Sender: TObject); | |||
| begin | |||
| FreeAndNil(fTexture); | |||
| FreeAndNil(fVAO); | |||
| FreeAndNil(fShader); | |||
| FreeAndNil(fContext); | |||
| end; | |||
| procedure TMainForm.RenderPanelResize(Sender: TObject); | |||
| begin | |||
| if Assigned(fContext) then begin | |||
| glViewport(0, 0, RenderPanel.ClientWidth, RenderPanel.ClientHeight); | |||
| end; | |||
| end; | |||
| procedure TMainForm.Log(aSender: TObject; const aMsg: String); | |||
| begin | |||
| LogLB.Items.Add(aMsg); | |||
| end; | |||
| procedure TMainForm.Render; | |||
| begin | |||
| CheckGlError; | |||
| glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); | |||
| fTexture.Bind; | |||
| fShader.Enable; | |||
| fVAO.Bind; | |||
| glDrawArrays(GL_QUADS, 0, 4); | |||
| fVAO.Unbind; | |||
| fShader.Disable; | |||
| fTexture.Unbind; | |||
| fContext.SwapBuffers; | |||
| end; | |||
| end. | |||
| @@ -0,0 +1,61 @@ | |||
| { this is the default configuration file of the glBitmap.pas | |||
| please uncomment you preferences below, rename this file to glBitmapConf.inc | |||
| and make it available to your compilers include paths } | |||
| // enable support for OpenGL ES 1.1 | |||
| {.$DEFINE OPENGL_ES_1_1} | |||
| // enable support for OpenGL ES 2.0 | |||
| {.$DEFINE OPENGL_ES_2_0} | |||
| // enable support for OpenGL ES 3.0 | |||
| {.$DEFINE OPENGL_ES_3_0} | |||
| // enable support for all OpenGL ES extensions | |||
| {.$DEFINE OPENGL_ES_EXT} | |||
| // activate to enable the support for SDL_surfaces | |||
| {.$DEFINE GLB_SDL} | |||
| // activate to enable the support for Delphi (including support for Delphi's (not Lazarus') TBitmap) | |||
| {.$DEFINE GLB_DELPHI} | |||
| // activate to enable the support for TLazIntfImage from Lazarus | |||
| {$DEFINE GLB_LAZARUS} | |||
| // activate to enable the support of SDL_image to load files. (READ ONLY) | |||
| // If you enable SDL_image all other libraries will be ignored! | |||
| {.$DEFINE GLB_SDL_IMAGE} | |||
| // activate to enable Lazarus TPortableNetworkGraphic support | |||
| // if you enable this pngImage and libPNG will be ignored | |||
| {$DEFINE GLB_LAZ_PNG} | |||
| // activate to enable png support with the unit pngimage -> http://pngdelphi.sourceforge.net/ | |||
| // if you enable pngimage the libPNG will be ignored | |||
| {.$DEFINE GLB_PNGIMAGE} | |||
| // activate to use the libPNG -> http://www.libpng.org/ | |||
| // You will need an aditional header -> http://www.opengl24.de/index.php?cat=header&file=libpng | |||
| {.$DEFINE GLB_LIB_PNG} | |||
| // activate to enable Lazarus TJPEGImage support | |||
| // if you enable this delphi jpegs and libJPEG will be ignored | |||
| {$DEFINE GLB_LAZ_JPEG} | |||
| // if you enable delphi jpegs the libJPEG will be ignored | |||
| {.$DEFINE GLB_DELPHI_JPEG} | |||
| // activate to use the libJPEG -> http://www.ijg.org/ | |||
| // You will need an aditional header -> http://www.opengl24.de/index.php?cat=header&file=libjpeg | |||
| {.$DEFINE GLB_LIB_JPEG} | |||
| @@ -22,7 +22,7 @@ | |||
| - download texture data from video card | |||
| - manipulate texture data (e.g. add alpha, remove alpha, convert to other format, switch RGB, ...) } | |||
| unit glBitmap; | |||
| unit uglcBitmap; | |||
| {$I glBitmapConf.inc} | |||
| @@ -1207,6 +1207,7 @@ type | |||
| TglcBitmapFormat = TglBitmapFormat; | |||
| TglcBitmap2D = TglBitmap2D; | |||
| TglcBitmapData = TglBitmapData; | |||
| {$IF NOT DEFINED(OPENGL_ES)} | |||
| TglcBitmap1D = TglBitmap1D; | |||
| TglcBitmapCubeMap = TglBitmapCubeMap; | |||
| @@ -8164,14 +8165,14 @@ begin | |||
| aBuildWithGlu := false; | |||
| if (MipMap = mmMipmap) then begin | |||
| if (GL_VERSION_1_4 or GL_SGIS_generate_mipmap) then | |||
| glTexParameteri(Target, GL_GENERATE_MIPMAP, GL_TRUE) | |||
| glTexParameteri(Target, GL_GENERATE_MIPMAP, GLint(GL_TRUE)) | |||
| else | |||
| aBuildWithGlu := true; | |||
| end else if (MipMap = mmMipmapGlu) then | |||
| aBuildWithGlu := true; | |||
| {$ELSE} | |||
| if (MipMap = mmMipmap) then | |||
| glTexParameteri(Target, GL_GENERATE_MIPMAP, GL_TRUE); | |||
| glTexParameteri(Target, GL_GENERATE_MIPMAP, GLint(GL_TRUE)); | |||
| {$ENDIF} | |||
| end; | |||
| @@ -0,0 +1,84 @@ | |||
| unit uglcVertexArrayObject; | |||
| {$mode objfpc}{$H+} | |||
| interface | |||
| uses | |||
| Classes, SysUtils, contnrs, dglOpenGL, uglcArrayBuffer; | |||
| type | |||
| EglcVertexArrayObject = class(Exception); | |||
| TglcVertexArrayObject = class(TObject) | |||
| private | |||
| fID: GLuint; | |||
| fArrayBuffers: TObjectList; | |||
| public | |||
| property ID: GLuint read fID; | |||
| procedure BindArrayBuffer(const aBuffer: TglcArrayBuffer; const aOwnsObject: Boolean); | |||
| procedure VertexAttribPointer(const aIndex: GLuint; const aSize: GLint; const aType: GLenum; | |||
| const aNormalized: GLboolean; const aStride: GLsizei; const aOffset: GLint); | |||
| procedure Bind; | |||
| procedure Unbind; | |||
| constructor Create; | |||
| destructor Destroy; override; | |||
| end; | |||
| implementation | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| //TglcVertexArrayObject////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TglcVertexArrayObject.BindArrayBuffer(const aBuffer: TglcArrayBuffer; const aOwnsObject: Boolean); | |||
| begin | |||
| Bind; | |||
| aBuffer.Bind; | |||
| if aOwnsObject and (fArrayBuffers.IndexOf(aBuffer) < 0) then | |||
| fArrayBuffers.Add(aBuffer); | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TglcVertexArrayObject.VertexAttribPointer(const aIndex: GLuint; const aSize: GLint; const aType: GLenum; | |||
| const aNormalized: GLboolean; const aStride: GLsizei; const aOffset: GLint); | |||
| begin | |||
| Bind; | |||
| glEnableVertexAttribArray(aIndex); | |||
| glVertexAttribPointer(aIndex, aSize, aType, aNormalized, aStride, Pointer(aOffset)); | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TglcVertexArrayObject.Bind; | |||
| begin | |||
| glBindVertexArray(fID); | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| procedure TglcVertexArrayObject.Unbind; | |||
| begin | |||
| glBindVertexArray(0); | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| constructor TglcVertexArrayObject.Create; | |||
| begin | |||
| inherited Create; | |||
| if not GL_VERSION_3_0 and | |||
| not GL_ARB_vertex_array_object then | |||
| raise EglcVertexArrayObject.Create('vertex array objects are not supported by video vard'); | |||
| glGenVertexArrays(1, @fID); | |||
| fArrayBuffers := TObjectList.Create(true); | |||
| end; | |||
| ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||
| destructor TglcVertexArrayObject.Destroy; | |||
| begin | |||
| glDeleteVertexArrays(1, @fID); | |||
| FreeAndNil(fArrayBuffers); | |||
| inherited Destroy; | |||
| end; | |||
| end. | |||