fdSkyShader.pas 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. unit fdSkyShader;
  2. interface
  3. uses
  4. System.Classes,
  5. System.SysUtils,
  6. Vcl.Dialogs,
  7. Vcl.Forms,
  8. Vcl.Controls,
  9. Stage.VectorGeometry,
  10. GLS.Cadencer,
  11. GLS.SceneViewer,
  12. GLS.Scene,
  13. Stage.VectorTypes,
  14. GLS.Objects,
  15. GLS.GeomObjects,
  16. GLS.Texture,
  17. Stage.TextureFormat,
  18. GLS.CompositeImage,
  19. GLS.Material,
  20. GLS.Coordinates,
  21. GLS.BaseClasses,
  22. GLS.Context,
  23. GLS.RenderContextInfo,
  24. Stage.Utils,
  25. GLS.FileDDS;
  26. type
  27. TFormSkyShader = class(TForm)
  28. GLScene1: TGLScene;
  29. Cadencer: TGLCadencer;
  30. SceneViewer: TGLSceneViewer;
  31. Camera: TGLCamera;
  32. DummyCam: TGLDummyCube;
  33. Thor: TGLTorus;
  34. Sphere: TGLSphere;
  35. Sky: 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. FormSkyShader: TFormSkyShader;
  50. implementation //============================================================
  51. {$R *.dfm}
  52. procedure TFormSkyShader.FormCreate;
  53. begin
  54. Path := GetCurrentAssetPath();
  55. SetCurrentDir(Path + '\cubemap');
  56. LoadCubemap;
  57. Sky.Radius := Camera.DepthOfView;
  58. Sky.Material.Texture := Cubemap;
  59. Sphere.Material.Texture := Cubemap;
  60. Thor.Material.Texture := Cubemap;
  61. end;
  62. procedure TFormSkyShader.LoadCubemap();
  63. begin
  64. Cubemap := TGLTexture.Create(self);
  65. // Loading a cubemap as TGLCompositeImage
  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 TFormSkyShader.CadencerProgress;
  73. begin
  74. DummyCam.Turn(deltaTime * 30);
  75. Thor.Pitch(deltaTime * 50);
  76. Camera.Position.Y := 3 * cos(NewTime / 3);
  77. Sky.AbsolutePosition := Camera.AbsolutePosition;
  78. end;
  79. // Direct OpenGL rendering
  80. //
  81. procedure TFormSkyShader.DirectOGLRender;
  82. begin
  83. if not Cadencer.Enabled then
  84. initGLSL;
  85. // sky cubemap
  86. GLSL_sky.UseProgramObject;
  87. Sky.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 TFormSkyShader.InitGLSL;
  110. begin
  111. Cadencer.Enabled := True;
  112. // Loading shaders from asset
  113. SetCurrentDir(Path + '\shader');
  114. GLSL_sky := Load('sky.vp', 'sky.fp');
  115. GLSL_obj := Load('obj.vp', 'obj.fp');
  116. end;
  117. end.