fDisttexD.pas 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. unit fDisttexD;
  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.ExtCtrls,
  12. Vcl.StdCtrls,
  13. GLS.OpenGLTokens,
  14. GLS.Cadencer,
  15. GLS.Texture,
  16. GLS.SceneViewer,
  17. GLS.Scene,
  18. GLS.Objects,
  19. GLS.Context,
  20. GLS.HUDObjects,
  21. GLS.CgShader,
  22. GLS.Material,
  23. GLS.Coordinates,
  24. GLS.BaseClasses,
  25. GLS.RenderContextInfo,
  26. GLS.Utils,
  27. CG.Import,
  28. CG.GL;
  29. type
  30. TForm1 = class(TForm)
  31. GLScene1: TGLScene;
  32. viewer: TGLSceneViewer;
  33. matLib: TGLMaterialLibrary;
  34. GLCamera1: TGLCamera;
  35. GLLightSource1: TGLLightSource;
  36. GLDirectOpenGL1: TGLDirectOpenGL;
  37. GLCadencer1: TGLCadencer;
  38. GLCube1: TGLCube;
  39. filterShader: TCgShader;
  40. GLPlane1: TGLPlane;
  41. backGround: TGLPlane;
  42. procedure FormCreate(Sender: TObject);
  43. procedure GLDirectOpenGL1Render(Sender: TObject; var rci: TGLRenderContextInfo);
  44. procedure GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
  45. procedure filterShaderApplyFP(CgProgram: TCgProgram; Sender: TObject);
  46. procedure filterShaderApplyVP(CgProgram: TCgProgram; Sender: TObject);
  47. procedure viewerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  48. private
  49. end;
  50. var
  51. Form1: TForm1;
  52. refract: TGLTextureHandle;
  53. // ------------------------------------------
  54. implementation
  55. // ------------------------------------------
  56. {$R *.dfm}
  57. procedure TForm1.FormCreate(Sender: TObject);
  58. begin
  59. var Path: TFileName := GetCurrentAssetPath();
  60. SetCurrentDir(Path + '\shader');
  61. // Load the shader
  62. filterShader.VertexProgram.LoadFromFile('filterV.c');
  63. filterShader.FragmentProgram.LoadFromFile('filterF.c');
  64. // Load the texture for the background plane
  65. SetCurrentDir(Path + '\texture');
  66. matLib.Materials[1].Material.Texture.Image.LoadFromFile('parquet.bmp');
  67. end;
  68. (*
  69. Initialize refract texture used for the screen filter. Remember
  70. this is not an ordinary texture used with GL_TEXTURE_2D, we won't
  71. its dimensions to be NPOT (Non Power Of Two)
  72. *)
  73. procedure initialize;
  74. begin
  75. refract := TGLTextureHandle.Create;
  76. // Create the refract texture
  77. glEnable(GL_TEXTURE_RECTANGLE_NV);
  78. refract.AllocateHandle;
  79. glBindTexture(GL_TEXTURE_RECTANGLE_NV, refract.Handle);
  80. glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  81. glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  82. glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  83. glTexParameteri(GL_TEXTURE_RECTANGLE_NV, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  84. (* Important note, if you resize the screen, the size of this texture
  85. must be modified this case so you need to recreate the texture, otherwise
  86. it crashes. I was too lazy for that so that's why you can't resize
  87. the form *)
  88. glCopyTexImage2d(GL_TEXTURE_RECTANGLE_NV, 0, GL_RGBA8, 0, 0, Form1.viewer.ClientWidth,
  89. Form1.viewer.ClientHeight, 0);
  90. end; // initialize
  91. var
  92. initialized: boolean = false;
  93. procedure TForm1.GLDirectOpenGL1Render(Sender: TObject; var rci: TGLRenderContextInfo);
  94. begin
  95. if not initialized then
  96. begin
  97. (* Initializing OpenGL related stuff like textures must be done
  98. in a OpenGL context. Doing this in the formCreate for example
  99. won't work. This is not the nicest solution but hey, it's only
  100. a demo. *)
  101. initialize;
  102. initialized := True;
  103. end;
  104. // Take a snapshot for the refract texture
  105. glBindTexture(GL_TEXTURE_RECTANGLE_NV, refract.Handle);
  106. glCopyTexSubImage2D(GL_TEXTURE_RECTANGLE_NV, 0, 0, 0, 0, 0, viewer.ClientWidth,
  107. viewer.ClientHeight);
  108. glDisable(GL_TEXTURE_RECTANGLE_NV);
  109. end; // Render
  110. procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime, newTime: Double);
  111. begin
  112. GLCube1.PitchAngle := GLCube1.PitchAngle + 0.3;
  113. GLCube1.TurnAngle := GLCube1.TurnAngle + 0.5;
  114. end; // Cadencer progress
  115. // ****************************************************************************//
  116. // ************************* Shader stuff *************************************//
  117. // ****************************************************************************//
  118. var
  119. cursorX, cursorY: single;
  120. procedure TForm1.filterShaderApplyFP(CgProgram: TCgProgram; Sender: TObject);
  121. begin
  122. // Pass parameter values to fragment program
  123. with CgProgram do
  124. begin
  125. paramByName('screenW').SetAsScalar(viewer.ClientWidth);
  126. paramByName('screenH').SetAsScalar(viewer.ClientHeight);
  127. paramByName('refractTex').SetAsTextureRECT(refract.Handle);
  128. paramByName('refractTex').EnableTexture;
  129. // We do a little trick with the cursor position so pass its coordinates
  130. paramByName('cursorX').SetAsScalar(cursorX);
  131. paramByName('cursorY').SetAsScalar(cursorY);
  132. end;
  133. end; // apply Fragment program
  134. procedure TForm1.filterShaderApplyVP(CgProgram: TCgProgram; Sender: TObject);
  135. begin
  136. with CgProgram do
  137. begin
  138. paramByName('MVP').SetAsStateMatrix(CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
  139. end;
  140. end; // apply Vertex program
  141. procedure TForm1.viewerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  142. begin
  143. cursorX := X / viewer.ClientWidth;
  144. cursorY := 1 - (Y / viewer.ClientHeight);
  145. end;
  146. end.