fSkyboxShader.pas 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. unit fSkyboxShader;
  2. interface
  3. uses
  4. System.Classes,
  5. System.SysUtils,
  6. Vcl.Dialogs,
  7. Vcl.Forms,
  8. Vcl.Controls,
  9. GLS.VectorGeometry,
  10. GLS.Cadencer,
  11. GLS.SceneViewer,
  12. GLS.Scene,
  13. GLS.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. GLS.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. procedure LoadCubemap;
  42. procedure InitGLSL;
  43. end;
  44. var
  45. FormSkyboxShader: TFormSkyboxShader;
  46. GLSL_Sky: TGLProgramHandle;
  47. GLSL_Obj: TGLProgramHandle;
  48. CubeMap: TGLTexture;
  49. implementation
  50. {$R *.dfm}
  51. //
  52. // setup
  53. //
  54. procedure TFormSkyboxShader.FormCreate;
  55. begin
  56. LoadCubemap;
  57. Skybox.Radius := Camera.DepthOfView;
  58. Skybox.Material.Texture := Cubemap;
  59. Sphere.Material.Texture := Cubemap;
  60. Thor.Material.Texture := Cubemap;
  61. end;
  62. //
  63. // LoadCubemap
  64. //
  65. procedure TFormSkyboxShader.LoadCubemap;
  66. begin
  67. SetGLSceneMediaDir();
  68. Cubemap := TGLTexture.Create(self);
  69. Cubemap.ImageClassName := 'TGLCompositeImage';
  70. Cubemap.Image.LoadFromFile('Cubemaps/skybox.dds');
  71. Cubemap.TextureWrap := twNone;
  72. Cubemap.FilteringQuality := tfAnisotropic;
  73. Cubemap.Disabled := False;
  74. end;
  75. //
  76. // cadProgress
  77. //
  78. procedure TFormSkyboxShader.CadencerProgress;
  79. begin
  80. DummyCam.Turn(deltaTime * 30);
  81. Thor.Pitch(deltaTime * 50);
  82. Camera.Position.Y := 3 * cos(NewTime / 3);
  83. Skybox.AbsolutePosition := Camera.AbsolutePosition;
  84. end;
  85. //
  86. // doglRender
  87. //
  88. procedure TFormSkyboxShader.DirectOGLRender;
  89. begin
  90. if not Cadencer.Enabled then
  91. initGLSL;
  92. // sky cubemap
  93. GLSL_sky.UseProgramObject;
  94. Skybox.Render(rci);
  95. GLSL_sky.EndUseProgramObject;
  96. // object cubemap
  97. GLSL_obj.UseProgramObject;
  98. GLSL_obj.UniformMatrix4fv['m4'] := Sphere.AbsoluteMatrix;
  99. Sphere.Render(rci);
  100. GLSL_obj.UniformMatrix4fv['m4'] := Thor.AbsoluteMatrix;
  101. Thor.Render(rci);
  102. GLSL_obj.EndUseProgramObject;
  103. end;
  104. //
  105. // initGLSL
  106. //
  107. function Load(vp, fp: String): TGLProgramHandle;
  108. begin
  109. Result := TGLProgramHandle.CreateAndAllocate;
  110. Result.AddShader(TGLVertexShaderHandle, LoadAnsiStringFromFile(vp));
  111. Result.AddShader(TGLFragmentShaderHandle, LoadAnsiStringFromFile(fp));
  112. if not Result.LinkProgram then
  113. raise Exception.Create(Result.InfoLog);
  114. if not Result.ValidateProgram then
  115. raise Exception.Create(Result.InfoLog);
  116. end;
  117. procedure TFormSkyboxShader.InitGLSL;
  118. begin
  119. if not(GL.ARB_shader_objects and GL.ARB_vertex_program and
  120. GL.ARB_vertex_shader and GL.ARB_fragment_shader and GL.ARB_texture_cube_map)
  121. then
  122. begin
  123. ShowMessage('shader not supported by your hardware');
  124. Halt;
  125. end;
  126. Cadencer.Enabled := True;
  127. GLSL_sky := Load('Shaders/sky.vp', 'Shaders/sky.fp');
  128. GLSL_obj := Load('Shaders/obj.vp', 'Shaders/obj.fp');
  129. end;
  130. end.