2
0

fPostProcessingD.pas 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. unit fPostProcessingD;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. Winapi.OpenGLext,
  6. System.SysUtils,
  7. System.Variants,
  8. System.Classes,
  9. Vcl.Graphics,
  10. Vcl.Controls,
  11. Vcl.Forms,
  12. Vcl.Dialogs,
  13. Vcl.ComCtrls,
  14. GLS.OpenGLTokens,
  15. GLS.Scene,
  16. GLS.Coordinates,
  17. GLS.Objects,
  18. GLS.GeomObjects,
  19. GLS.Material,
  20. GLS.SimpleNavigation,
  21. GLS.Cadencer,
  22. GLS.SceneViewer,
  23. GLS.BaseClasses,
  24. GLS.FBORenderer,
  25. GLS.HUDObjects,
  26. CUDA.APIComps,
  27. CUDA.Graphics,
  28. CUDA.Compiler,
  29. CUDA.Context,
  30. GLS.State,
  31. GLS.RenderContextInfo,
  32. GLS.Context,
  33. GLSL.CustomShader,
  34. GLSL.Shader,
  35. GLS.Utils,
  36. GLS.Texture;
  37. type
  38. TFormPP = class(TForm)
  39. GLScene1: TGLScene;
  40. GLSceneViewer1: TGLSceneViewer;
  41. GLCadencer1: TGLCadencer;
  42. GLSimpleNavigation1: TGLSimpleNavigation;
  43. GLMaterialLibrary1: TGLMaterialLibrary;
  44. GLCamera1: TGLCamera;
  45. GLTeapot1: TGLTeapot;
  46. GLLightSource1: TGLLightSource;
  47. RenderRoot: TGLDummyCube;
  48. GLCylinder1: TGLCylinder;
  49. RenderToTexture: TGLFBORenderer;
  50. GLCUDADevice1: TGLCUDADevice;
  51. GLCUDA1: TGLCUDA;
  52. GLCUDACompiler1: TGLCUDACompiler;
  53. MainModule: TCUDAModule;
  54. processedTextureMapper: TCUDAImageResource;
  55. CallPostProcess: TGLDirectOpenGL;
  56. GLCapsule1: TGLCapsule;
  57. ResultShader: TGLSLShader;
  58. processedTextureArray: TCUDAMemData;
  59. outputBuffer: TCUDAMemData;
  60. inputBuffer: TCUDAMemData;
  61. CommonShader: TGLSLShader;
  62. GLSphere1: TGLSphere;
  63. TrackBar1: TTrackBar;
  64. GLHUDSprite1: TGLHUDSprite;
  65. cudaProcess: TCUDAFunction;
  66. cudaProcess_k_g_data: TCUDAFuncParam;
  67. cudaProcess_k_g_odata: TCUDAFuncParam;
  68. cudaProcess_k_imgw: TCUDAFuncParam;
  69. cudaProcess_k_imgh: TCUDAFuncParam;
  70. cudaProcess_k_tilew: TCUDAFuncParam;
  71. cudaProcess_k_r: TCUDAFuncParam;
  72. cudaProcess_k_threshold: TCUDAFuncParam;
  73. cudaProcess_k_highlight: TCUDAFuncParam;
  74. procedure FormResize(Sender: TObject);
  75. procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
  76. newTime: Double);
  77. procedure cudaProcessParameterSetup(Sender: TObject);
  78. procedure FormCreate(Sender: TObject);
  79. procedure CallPostProcessRender(Sender: TObject;
  80. var rci: TGLRenderContextInfo);
  81. procedure ResultShaderApply(Shader: TGLCustomGLSLShader);
  82. procedure RenderToTextureBeforeRender(Sender: TObject; var rci: TGLRenderContextInfo);
  83. procedure RenderToTextureAfterRender(Sender: TObject; var rci: TGLRenderContextInfo);
  84. procedure TrackBar1Change(Sender: TObject);
  85. procedure GLCUDA1OpenGLInteropInit(out Context: TGLContext);
  86. private
  87. Path: TFileName;
  88. public
  89. Radius: Integer;
  90. Threshold: Single;
  91. Highlight: SIngle;
  92. end;
  93. var
  94. FormPP: TFormPP;
  95. implementation
  96. {$R *.dfm}
  97. procedure TFormPP.FormCreate(Sender: TObject);
  98. begin
  99. Path := GetCurrentAssetPath();
  100. // Load lena image as texture
  101. SetCurrentDir(Path + '\texture');
  102. Radius := 8;
  103. Threshold := 0.8;
  104. Highlight := 0.4;
  105. with GLMaterialLibrary1.TextureByName('processedTexture') do
  106. begin
  107. TGLBlankImage(Image).ColorFormat := GL_RGB_INTEGER;
  108. Disabled := false;
  109. end;
  110. GLHUDSprite1.Visible := True;
  111. end;
  112. procedure TFormPP.CallPostProcessRender(Sender: TObject;
  113. var rci: TGLRenderContextInfo);
  114. begin
  115. processedTextureMapper.MapResources;
  116. processedTextureMapper.BindArrayToTexture(processedTextureArray, 0, 0);
  117. processedTextureArray.CopyTo(inputBuffer);
  118. cudaProcess.Launch;
  119. outputBuffer.CopyTo(processedTextureArray);
  120. processedTextureMapper.UnMapResources;
  121. end;
  122. procedure TFormPP.cudaProcessParameterSetup(Sender: TObject);
  123. begin
  124. with cudaProcess do
  125. begin
  126. SharedMemorySize :=
  127. (BlockShape.SizeX+(2*Radius))*(BlockShape.SizeY+(2*Radius))*sizeof(Integer);
  128. SetParam(inputBuffer);
  129. SetParam(outputBuffer);
  130. with GLMaterialLibrary1.TextureByName('processedTexture') do
  131. begin
  132. SetParam(TexWidth);
  133. SetParam(TexHeight);
  134. end;
  135. SetParam(BlockShape.SizeX + 2*Radius);
  136. SetParam(Radius);
  137. SetParam(Threshold);
  138. SetParam(Highlight);
  139. end;
  140. end;
  141. procedure TFormPP.FormResize(Sender: TObject);
  142. begin
  143. GLCamera1.SceneScale := GLSceneViewer1.Width / GLSceneViewer1.Height;
  144. end;
  145. procedure TFormPP.GLCadencer1Progress(Sender: TObject; const deltaTime,
  146. newTime: Double);
  147. begin
  148. GLSceneViewer1.Invalidate;
  149. end;
  150. procedure TFormPP.RenderToTextureBeforeRender(Sender: TObject; var rci: TGLRenderContextInfo);
  151. begin
  152. CommonShader.Apply(rci, Self);
  153. end;
  154. procedure TFormPP.GLCUDA1OpenGLInteropInit(out Context: TGLContext);
  155. begin
  156. Context := GLSceneViewer1.Buffer.RenderingContext;
  157. end;
  158. procedure TFormPP.RenderToTextureAfterRender(Sender: TObject; var rci: TGLRenderContextInfo);
  159. begin
  160. CommonShader.UnApply(rci);
  161. end;
  162. procedure TFormPP.ResultShaderApply(Shader: TGLCustomGLSLShader);
  163. begin
  164. with CurrentGLContext.GLStates do
  165. begin
  166. Disable(stDepthTest);
  167. DepthWriteMask := False;
  168. end;
  169. Shader.Param['TexUnit0'].AsTexture[0] :=
  170. GLMaterialLibrary1.TextureByName('processedTexture');
  171. end;
  172. procedure TFormPP.TrackBar1Change(Sender: TObject);
  173. begin
  174. Radius := TrackBar1.Position;
  175. end;
  176. end.