fPostProcessingD.pas 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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.Texture;
  36. type
  37. TFormPP = class(TForm)
  38. GLScene1: TGLScene;
  39. GLSceneViewer1: TGLSceneViewer;
  40. GLCadencer1: TGLCadencer;
  41. GLSimpleNavigation1: TGLSimpleNavigation;
  42. GLMaterialLibrary1: TGLMaterialLibrary;
  43. GLCamera1: TGLCamera;
  44. GLTeapot1: TGLTeapot;
  45. GLLightSource1: TGLLightSource;
  46. RenderRoot: TGLDummyCube;
  47. GLCylinder1: TGLCylinder;
  48. RenderToTexture: TGLFBORenderer;
  49. GLCUDADevice1: TGLCUDADevice;
  50. GLCUDA1: TGLCUDA;
  51. GLCUDACompiler1: TGLCUDACompiler;
  52. MainModule: TCUDAModule;
  53. processedTextureMapper: TCUDAImageResource;
  54. CallPostProcess: TGLDirectOpenGL;
  55. GLCapsule1: TGLCapsule;
  56. ResultShader: TGLSLShader;
  57. processedTextureArray: TCUDAMemData;
  58. outputBuffer: TCUDAMemData;
  59. inputBuffer: TCUDAMemData;
  60. CommonShader: TGLSLShader;
  61. GLSphere1: TGLSphere;
  62. TrackBar1: TTrackBar;
  63. GLHUDSprite1: TGLHUDSprite;
  64. cudaProcess: TCUDAFunction;
  65. cudaProcess_k_g_data: TCUDAFuncParam;
  66. cudaProcess_k_g_odata: TCUDAFuncParam;
  67. cudaProcess_k_imgw: TCUDAFuncParam;
  68. cudaProcess_k_imgh: TCUDAFuncParam;
  69. cudaProcess_k_tilew: TCUDAFuncParam;
  70. cudaProcess_k_r: TCUDAFuncParam;
  71. cudaProcess_k_threshold: TCUDAFuncParam;
  72. cudaProcess_k_highlight: TCUDAFuncParam;
  73. procedure FormResize(Sender: TObject);
  74. procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
  75. newTime: Double);
  76. procedure cudaProcessParameterSetup(Sender: TObject);
  77. procedure FormCreate(Sender: TObject);
  78. procedure CallPostProcessRender(Sender: TObject;
  79. var rci: TGLRenderContextInfo);
  80. procedure ResultShaderApply(Shader: TGLCustomGLSLShader);
  81. procedure RenderToTextureBeforeRender(Sender: TObject; var rci: TGLRenderContextInfo);
  82. procedure RenderToTextureAfterRender(Sender: TObject; var rci: TGLRenderContextInfo);
  83. procedure TrackBar1Change(Sender: TObject);
  84. procedure GLCUDA1OpenGLInteropInit(out Context: TGLContext);
  85. private
  86. public
  87. Radius: Integer;
  88. Threshold: Single;
  89. Highlight: SIngle;
  90. end;
  91. var
  92. FormPP: TFormPP;
  93. implementation
  94. {$R *.dfm}
  95. procedure TFormPP.FormCreate(Sender: TObject);
  96. begin
  97. Radius := 8;
  98. Threshold := 0.8;
  99. Highlight := 0.4;
  100. with GLMaterialLibrary1.TextureByName('processedTexture') do
  101. begin
  102. TGLBlankImage(Image).ColorFormat := GL_RGB_INTEGER;
  103. Disabled := false;
  104. end;
  105. GLHUDSprite1.Visible := True;
  106. end;
  107. procedure TFormPP.CallPostProcessRender(Sender: TObject;
  108. var rci: TGLRenderContextInfo);
  109. begin
  110. processedTextureMapper.MapResources;
  111. processedTextureMapper.BindArrayToTexture(processedTextureArray, 0, 0);
  112. processedTextureArray.CopyTo(inputBuffer);
  113. cudaProcess.Launch;
  114. outputBuffer.CopyTo(processedTextureArray);
  115. processedTextureMapper.UnMapResources;
  116. end;
  117. procedure TFormPP.cudaProcessParameterSetup(Sender: TObject);
  118. begin
  119. with cudaProcess do
  120. begin
  121. SharedMemorySize :=
  122. (BlockShape.SizeX+(2*Radius))*(BlockShape.SizeY+(2*Radius))*sizeof(Integer);
  123. SetParam(inputBuffer);
  124. SetParam(outputBuffer);
  125. with GLMaterialLibrary1.TextureByName('processedTexture') do
  126. begin
  127. SetParam(TexWidth);
  128. SetParam(TexHeight);
  129. end;
  130. SetParam(BlockShape.SizeX + 2*Radius);
  131. SetParam(Radius);
  132. SetParam(Threshold);
  133. SetParam(Highlight);
  134. end;
  135. end;
  136. procedure TFormPP.FormResize(Sender: TObject);
  137. begin
  138. GLCamera1.SceneScale := GLSceneViewer1.Width / GLSceneViewer1.Height;
  139. end;
  140. procedure TFormPP.GLCadencer1Progress(Sender: TObject; const deltaTime,
  141. newTime: Double);
  142. begin
  143. GLSceneViewer1.Invalidate;
  144. end;
  145. procedure TFormPP.RenderToTextureBeforeRender(Sender: TObject; var rci: TGLRenderContextInfo);
  146. begin
  147. CommonShader.Apply(rci, Self);
  148. end;
  149. procedure TFormPP.GLCUDA1OpenGLInteropInit(out Context: TGLContext);
  150. begin
  151. Context := GLSceneViewer1.Buffer.RenderingContext;
  152. end;
  153. procedure TFormPP.RenderToTextureAfterRender(Sender: TObject; var rci: TGLRenderContextInfo);
  154. begin
  155. CommonShader.UnApply(rci);
  156. end;
  157. procedure TFormPP.ResultShaderApply(Shader: TGLCustomGLSLShader);
  158. begin
  159. with CurrentGLContext.GLStates do
  160. begin
  161. Disable(stDepthTest);
  162. DepthWriteMask := False;
  163. end;
  164. Shader.Param['TexUnit0'].AsTexture[0] :=
  165. GLMaterialLibrary1.TextureByName('processedTexture');
  166. end;
  167. procedure TFormPP.TrackBar1Change(Sender: TObject);
  168. begin
  169. Radius := TrackBar1.Position;
  170. end;
  171. end.