fSkyboxShaderD.pas 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. unit fSkyboxShaderD;
  2. interface
  3. uses
  4. System.Classes,
  5. System.SysUtils,
  6. Vcl.Dialogs,
  7. Vcl.Forms,
  8. Vcl.Controls,
  9. GLScene.VectorGeometry,
  10. GLS.Cadencer,
  11. GLS.SceneViewer,
  12. GLS.Scene,
  13. GLScene.VectorTypes,
  14. GLS.Objects,
  15. GLS.GeomObjects,
  16. GLS.Texture,
  17. GLS.TextureFormat,
  18. GLS.CompositeImage,
  19. GLS.Material,
  20. GLS.Coordinates,
  21. GLS.BaseClasses,
  22. GLS.Context,
  23. GLS.RenderContextInfo,
  24. GLScene.Utils,
  25. GLS.FileDDS;
  26. type
  27. TFormSkyboxShader = class(TForm)
  28. GLScene1: TGLScene;
  29. Cadencer: TGLCadencer;
  30. SceneViewer: TGLSceneViewer;
  31. Camera: TGLCamera;
  32. DummyCam: TGLDummyCube;
  33. Thor: TGLTorus;
  34. Sphere: TGLSphere;
  35. Skybox: TGLSphere;
  36. DirectOGL: TGLDirectOpenGL;
  37. procedure CadencerProgress(Sender: TObject; const DeltaTime, NewTime: Double);
  38. procedure FormCreate(Sender: TObject);
  39. procedure DirectOGLRender(Sender: TObject; var rci: TGLRenderContextInfo);
  40. public
  41. Path: TFileName;
  42. GLSL_Sky: TGLProgramHandle;
  43. GLSL_Obj: TGLProgramHandle;
  44. CubeMap: TGLTexture;
  45. procedure LoadCubemap;
  46. procedure InitGLSL;
  47. end;
  48. var
  49. FormSkyboxShader: TFormSkyboxShader;
  50. implementation
  51. {$R *.dfm}
  52. procedure TFormSkyboxShader.FormCreate;
  53. begin
  54. Path := GetCurrentAssetPath();
  55. // Loading a cubemap as TGLCompositeImage
  56. SetCurrentDir(Path + '\cubemap');
  57. LoadCubemap;
  58. Skybox.Radius := Camera.DepthOfView;
  59. Skybox.Material.Texture := Cubemap;
  60. Sphere.Material.Texture := Cubemap;
  61. Thor.Material.Texture := Cubemap;
  62. end;
  63. procedure TFormSkyboxShader.LoadCubemap;
  64. begin
  65. Cubemap := TGLTexture.Create(self);
  66. Cubemap.ImageClassName := 'TGLCompositeImage';
  67. Cubemap.Image.LoadFromFile('skybox.dds');
  68. Cubemap.TextureWrap := twNone;
  69. Cubemap.FilteringQuality := tfAnisotropic;
  70. Cubemap.Disabled := False;
  71. end;
  72. procedure TFormSkyboxShader.CadencerProgress;
  73. begin
  74. DummyCam.Turn(deltaTime * 30);
  75. Thor.Pitch(deltaTime * 50);
  76. Camera.Position.Y := 3 * cos(NewTime / 3);
  77. Skybox.AbsolutePosition := Camera.AbsolutePosition;
  78. end;
  79. // Direct OpenGL rendering
  80. //
  81. procedure TFormSkyboxShader.DirectOGLRender;
  82. begin
  83. if not Cadencer.Enabled then
  84. initGLSL;
  85. // sky cubemap
  86. GLSL_sky.UseProgramObject;
  87. Skybox.Render(rci);
  88. GLSL_sky.EndUseProgramObject;
  89. // object cubemap
  90. GLSL_obj.UseProgramObject;
  91. GLSL_obj.UniformMatrix4fv['m4'] := Sphere.AbsoluteMatrix;
  92. Sphere.Render(rci);
  93. GLSL_obj.UniformMatrix4fv['m4'] := Thor.AbsoluteMatrix;
  94. Thor.Render(rci);
  95. GLSL_obj.EndUseProgramObject;
  96. end;
  97. // GLSL Initialization
  98. //
  99. function Load(vp, fp: String): TGLProgramHandle;
  100. begin
  101. Result := TGLProgramHandle.CreateAndAllocate;
  102. Result.AddShader(TGLVertexShaderHandle, LoadAnsiStringFromFile(vp));
  103. Result.AddShader(TGLFragmentShaderHandle, LoadAnsiStringFromFile(fp));
  104. if not Result.LinkProgram then
  105. raise Exception.Create(Result.InfoLog);
  106. if not Result.ValidateProgram then
  107. raise Exception.Create(Result.InfoLog);
  108. end;
  109. procedure TFormSkyboxShader.InitGLSL;
  110. begin
  111. if not(GL.ARB_shader_objects and GL.ARB_vertex_program and
  112. GL.ARB_vertex_shader and GL.ARB_fragment_shader and GL.ARB_texture_cube_map)
  113. then
  114. begin
  115. ShowMessage('shader not supported by your hardware');
  116. Halt;
  117. end;
  118. Cadencer.Enabled := True;
  119. // Loading shaders from asset
  120. SetCurrentDir(Path + '\shader');
  121. GLSL_sky := Load('sky.vp', 'sky.fp');
  122. GLSL_obj := Load('obj.vp', 'obj.fp');
  123. end;
  124. end.