fOcean.pas 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. unit fOcean;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. Winapi.OpenGLext,
  6. System.SysUtils,
  7. System.Classes,
  8. Vcl.Graphics,
  9. Vcl.Controls,
  10. Vcl.Forms,
  11. Vcl.Dialogs,
  12. Vcl.ExtCtrls,
  13. Vcl.ComCtrls,
  14. GLS.OpenGLTokens,
  15. GLS.SceneViewer,
  16. GLS.Scene,
  17. GLS.Texture,
  18. GLS.Objects,
  19. GLS.Context,
  20. GLS.VectorGeometry,
  21. GLS.GeomObjects,
  22. GLS.Cadencer,
  23. GLSL.UserShader,
  24. GLS.Utils,
  25. GLS.Graph,
  26. GLS.VectorTypes,
  27. GLS.SkyDome,
  28. GLS.VectorLists,
  29. GLS.Material,
  30. GLS.Coordinates,
  31. GLS.BaseClasses,
  32. GLS.RenderContextInfo,
  33. GLS.SimpleNavigation,
  34. GLS.TextureFormat,
  35. GLS.Color;
  36. type
  37. TForm1 = class(TForm)
  38. GLScene1: TGLScene;
  39. GLSceneViewer1: TGLSceneViewer;
  40. GLCamera: TGLCamera;
  41. MatLib: TGLMaterialLibrary;
  42. GLLightSource1: TGLLightSource;
  43. GLCadencer1: TGLCadencer;
  44. GLSphere1: TGLSphere;
  45. DOInitialize: TGLDirectOpenGL;
  46. GLUserShader1: TGLUserShader;
  47. GLHeightField1: TGLHeightField;
  48. GLMemoryViewer1: TGLMemoryViewer;
  49. GLScene2: TGLScene;
  50. CameraCubeMap: TGLCamera;
  51. GLEarthSkyDome1: TGLEarthSkyDome;
  52. GLSphere2: TGLSphere;
  53. DOOceanPlane: TGLDirectOpenGL;
  54. GLSimpleNavigation1: TGLSimpleNavigation;
  55. procedure FormCreate(Sender: TObject);
  56. procedure DOInitializeRender(Sender: TObject;
  57. var rci: TGLRenderContextInfo);
  58. procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  59. X, Y: Integer);
  60. procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
  61. newTime: Double);
  62. procedure GLUserShader1DoApply(Sender: TObject;
  63. var rci: TGLRenderContextInfo);
  64. procedure GLUserShader1DoUnApply(Sender: TObject; Pass: Integer;
  65. var rci: TGLRenderContextInfo; var Continue: Boolean);
  66. procedure GLHeightField1GetHeight(const x, y: Single; var z: Single;
  67. var color: TVector4f; var texPoint: TTexPoint);
  68. procedure DOOceanPlaneRender(Sender: TObject;
  69. var rci: TGLRenderContextInfo);
  70. procedure GLMemoryViewer1BeforeRender(Sender: TObject);
  71. public
  72. mx, my, dmx, dmy: Integer;
  73. programObject: TGLProgramHandle;
  74. end;
  75. var
  76. Form1: TForm1;
  77. PathCM: TFileName;
  78. CubeMap: TGLTexture;
  79. implementation
  80. {$R *.dfm}
  81. procedure TForm1.FormCreate(Sender: TObject);
  82. begin
  83. SetGLSceneMediaDir();
  84. CubeMap := TGLTexture.Create(Self);
  85. // Load the cube map which is used both for environment and as reflection texture
  86. MatLib.LibMaterialByName('water').Material.Texture.Image.LoadFromFile('noise.bmp');
  87. PathCM := GetCurrentDir() + '\Cubemaps';
  88. SetCurrentDir(PathCM);
  89. // Cubemap.ImageClassName := 'TGLCompositeImage';
  90. // Cubemap.Image.LoadFromFile('Cubemaps/Skybox.dds');
  91. Cubemap.TextureWrap := twNone;
  92. Cubemap.FilteringQuality := tfAnisotropic;
  93. Cubemap.Disabled := False;
  94. with MatLib.LibMaterialByName('cubeMap').Material.Texture do
  95. begin
  96. ImageClassName := TGLCubeMapImage.ClassName;
  97. with Image as TGLCubeMapImage do
  98. with Cubemap do
  99. begin
  100. // Load all 6 texture map components of the cube map
  101. // The 'PX', 'NX', etc. refer to 'positive X', 'negative X', etc.
  102. // and follow the RenderMan specs/conventions
  103. Picture[cmtPX].LoadFromFile('cm_left.jpg');
  104. Picture[cmtNX].LoadFromFile('cm_right.jpg');
  105. Picture[cmtPY].LoadFromFile('cm_top.jpg');
  106. Picture[cmtNY].LoadFromFile('cm_bottom.jpg');
  107. Picture[cmtPZ].LoadFromFile('cm_back.jpg');
  108. Picture[cmtNZ].LoadFromFile('cm_front.jpg');
  109. end;
  110. end;
  111. SetGLSceneMediaDir();
  112. end;
  113. procedure TForm1.DoInitializeRender(Sender: TObject;
  114. var rci: TGLRenderContextInfo);
  115. begin
  116. if not (GL.ARB_shader_objects and
  117. GL.ARB_vertex_program and GL.ARB_vertex_shader
  118. and GL.ARB_fragment_shader) then
  119. begin
  120. ShowMessage('Your hardware/driver doesn''t support GLSL and can''t execute this demo!');
  121. Halt;
  122. end;
  123. if DOInitialize.Tag <> 0 then
  124. Exit;
  125. DOInitialize.Tag := 1;
  126. GLSceneViewer1.Buffer.RenderingContext.Deactivate;
  127. GLMemoryViewer1.RenderCubeMapTextures(matLib.LibMaterialByName('cubeMap').Material.Texture);
  128. GLSceneViewer1.Buffer.RenderingContext.Activate;
  129. programObject := TGLProgramHandle.CreateAndAllocate;
  130. programObject.AddShader(TGLVertexShaderHandle, String(LoadAnsiStringFromFile('Shaders\ocean_vp.glsl')), True);
  131. programObject.AddShader(TGLFragmentShaderHandle, String(LoadAnsiStringFromFile('Shaders\ocean_fp.glsl')), True);
  132. if not programObject.LinkProgram then
  133. raise Exception.Create(programObject.InfoLog);
  134. programObject.UseProgramObject;
  135. programObject.Uniform1i['NormalMap'] := 0;
  136. programObject.Uniform1i['EnvironmentMap'] := 1;
  137. programObject.EndUseProgramObject;
  138. // initialize the heightmap
  139. with MatLib.LibMaterialByName('water') do
  140. rci.GLStates.TextureBinding[0, ttTexture2D] := Material.Texture.Handle;
  141. // initialize the heightmap
  142. with MatLib.LibMaterialByName('cubeMap') do
  143. rci.GLStates.TextureBinding[1, ttTextureCube] := Material.Texture.Handle;
  144. if not programObject.ValidateProgram then
  145. raise Exception.Create(programObject.InfoLog);
  146. end;
  147. procedure TForm1.GLUserShader1DoApply(Sender: TObject;
  148. var rci: TGLRenderContextInfo);
  149. var
  150. camPos: TGLVector;
  151. begin
  152. programObject.UseProgramObject;
  153. programObject.Uniform1f['Time'] := GLCadencer1.CurrentTime * 0.05;
  154. camPos := GLCamera.AbsolutePosition;
  155. programObject.Uniform4f['EyePos'] := camPos;
  156. end;
  157. procedure TForm1.GLUserShader1DoUnApply(Sender: TObject; Pass: Integer;
  158. var rci: TGLRenderContextInfo; var Continue: Boolean);
  159. begin
  160. programObject.EndUseProgramObject;
  161. end;
  162. procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject;
  163. Shift: TShiftState; X, Y: Integer);
  164. begin
  165. if ssLeft in Shift then
  166. begin
  167. Inc(dmx, mx - x);
  168. Inc(dmy, my - y);
  169. end;
  170. mx := x;
  171. my := y;
  172. end;
  173. procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime,
  174. newTime: Double);
  175. begin
  176. if (dmx <> 0) or (dmy <> 0) then
  177. begin
  178. GLCamera.MoveAroundTarget(dmy * 0.3, dmx * 0.3);
  179. dmx := 0;
  180. dmy := 0;
  181. end;
  182. GLSceneViewer1.Invalidate;
  183. end;
  184. procedure TForm1.GLHeightField1GetHeight(const x, y: Single; var z: Single;
  185. var color: TVector4f; var texPoint: TTexPoint);
  186. begin
  187. z := 0;
  188. end;
  189. const
  190. cExtent = 200;
  191. var
  192. vbo: TGLVBOArrayBufferHandle;
  193. nbVerts: Integer;
  194. procedure TForm1.DOOceanPlaneRender(Sender: TObject;
  195. var rci: TGLRenderContextInfo);
  196. var
  197. x, y: Integer;
  198. v: TTexPointList;
  199. cont: Boolean;
  200. begin
  201. GLUserShader1DoApply(Self, rci);
  202. gl.EnableClientState(GL_VERTEX_ARRAY);
  203. if not Assigned(vbo) then
  204. begin
  205. v := TTexPointList.Create;
  206. v.Capacity := Sqr(cExtent + 1);
  207. y := -cExtent;
  208. while y < cExtent do
  209. begin
  210. x := -cExtent;
  211. while x <= cExtent do
  212. begin
  213. v.Add(y, x);
  214. v.Add(y + 2, x);
  215. Inc(x, 2);
  216. end;
  217. Inc(y, 2);
  218. v.Add(y, cExtent);
  219. v.Add(y, -cExtent);
  220. end;
  221. vbo := TGLVBOArrayBufferHandle.CreateAndAllocate();
  222. vbo.Bind;
  223. vbo.BufferData(v.List, v.DataSize, GL_STATIC_DRAW_ARB);
  224. nbVerts := v.Count;
  225. gl.VertexPointer(2, GL_FLOAT, 0, nil);
  226. gl.DrawArrays(GL_QUAD_STRIP, 0, nbVerts);
  227. vbo.UnBind;
  228. v.Free;
  229. end
  230. else
  231. begin
  232. vbo.Bind;
  233. gl.VertexPointer(2, GL_FLOAT, 0, nil);
  234. gl.DrawArrays(GL_TRIANGLE_STRIP, 0, nbVerts);
  235. vbo.UnBind;
  236. end;
  237. gl.DisableClientState(GL_VERTEX_ARRAY);
  238. GLUserShader1DoUnApply(Self, 0, rci, cont);
  239. end;
  240. procedure TForm1.GLMemoryViewer1BeforeRender(Sender: TObject);
  241. begin
  242. GLMemoryViewer1.Buffer.RenderingContext.ShareLists(GLSceneViewer1.Buffer.RenderingContext);
  243. GLMemoryViewer1.BeforeRender := nil;
  244. end;
  245. end.