123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- unit fSkyboxShader;
- interface
- uses
- System.Classes,
- System.SysUtils,
- Vcl.Dialogs,
- Vcl.Forms,
- Vcl.Controls,
- GLS.VectorGeometry,
- GLS.Cadencer,
- GLS.SceneViewer,
- GLS.Scene,
- GLS.VectorTypes,
- GLS.Objects,
- GLS.GeomObjects,
- GLS.Texture,
- GLS.TextureFormat,
- GLS.CompositeImage,
- GLS.Material,
- GLS.Coordinates,
- GLS.BaseClasses,
- GLS.Context,
- GLS.RenderContextInfo,
- GLS.Utils,
- GLS.FileDDS;
- type
- TFormSkyboxShader = class(TForm)
- GLScene1: TGLScene;
- Cadencer: TGLCadencer;
- SceneViewer: TGLSceneViewer;
- Camera: TGLCamera;
- DummyCam: TGLDummyCube;
- Thor: TGLTorus;
- Sphere: TGLSphere;
- Skybox: TGLSphere;
- DirectOGL: TGLDirectOpenGL;
- procedure CadencerProgress(Sender: TObject; const DeltaTime, NewTime: Double);
- procedure FormCreate(Sender: TObject);
- procedure DirectOGLRender(Sender: TObject; var rci: TGLRenderContextInfo);
- public
- procedure LoadCubemap;
- procedure InitGLSL;
- end;
- var
- FormSkyboxShader: TFormSkyboxShader;
- GLSL_Sky: TGLProgramHandle;
- GLSL_Obj: TGLProgramHandle;
- CubeMap: TGLTexture;
- implementation
- {$R *.dfm}
- //
- // setup
- //
- procedure TFormSkyboxShader.FormCreate;
- begin
- LoadCubemap;
- Skybox.Radius := Camera.DepthOfView;
- Skybox.Material.Texture := Cubemap;
- Sphere.Material.Texture := Cubemap;
- Thor.Material.Texture := Cubemap;
- end;
- //
- // LoadCubemap
- //
- procedure TFormSkyboxShader.LoadCubemap;
- begin
- SetGLSceneMediaDir();
- Cubemap := TGLTexture.Create(self);
- Cubemap.ImageClassName := 'TGLCompositeImage';
- Cubemap.Image.LoadFromFile('Cubemaps/skybox.dds');
- Cubemap.TextureWrap := twNone;
- Cubemap.FilteringQuality := tfAnisotropic;
- Cubemap.Disabled := False;
- end;
- //
- // cadProgress
- //
- procedure TFormSkyboxShader.CadencerProgress;
- begin
- DummyCam.Turn(deltaTime * 30);
- Thor.Pitch(deltaTime * 50);
- Camera.Position.Y := 3 * cos(NewTime / 3);
- Skybox.AbsolutePosition := Camera.AbsolutePosition;
- end;
- //
- // doglRender
- //
- procedure TFormSkyboxShader.DirectOGLRender;
- begin
- if not Cadencer.Enabled then
- initGLSL;
- // sky cubemap
- GLSL_sky.UseProgramObject;
- Skybox.Render(rci);
- GLSL_sky.EndUseProgramObject;
- // object cubemap
- GLSL_obj.UseProgramObject;
- GLSL_obj.UniformMatrix4fv['m4'] := Sphere.AbsoluteMatrix;
- Sphere.Render(rci);
- GLSL_obj.UniformMatrix4fv['m4'] := Thor.AbsoluteMatrix;
- Thor.Render(rci);
- GLSL_obj.EndUseProgramObject;
- end;
- //
- // initGLSL
- //
- function Load(vp, fp: String): TGLProgramHandle;
- begin
- Result := TGLProgramHandle.CreateAndAllocate;
- Result.AddShader(TGLVertexShaderHandle, LoadAnsiStringFromFile(vp));
- Result.AddShader(TGLFragmentShaderHandle, LoadAnsiStringFromFile(fp));
- if not Result.LinkProgram then
- raise Exception.Create(Result.InfoLog);
- if not Result.ValidateProgram then
- raise Exception.Create(Result.InfoLog);
- end;
- procedure TFormSkyboxShader.InitGLSL;
- begin
- if not(GL.ARB_shader_objects and GL.ARB_vertex_program and
- GL.ARB_vertex_shader and GL.ARB_fragment_shader and GL.ARB_texture_cube_map)
- then
- begin
- ShowMessage('shader not supported by your hardware');
- Halt;
- end;
- Cadencer.Enabled := True;
- GLSL_sky := Load('Shaders/sky.vp', 'Shaders/sky.fp');
- GLSL_obj := Load('Shaders/obj.vp', 'Shaders/obj.fp');
- end;
- end.
|