fPostShader.pas 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. unit fPostShader;
  2. interface
  3. uses
  4. Winapi.OpenGL,
  5. System.SysUtils,
  6. System.Classes,
  7. Vcl.Graphics,
  8. Vcl.Controls,
  9. Vcl.Forms,
  10. Vcl.CheckLst,
  11. Vcl.ExtCtrls,
  12. Vcl.StdCtrls,
  13. Vcl.ComCtrls,
  14. GLS.Texture,
  15. GLS.Cadencer,
  16. GLS.SceneViewer,
  17. GLS.Scene,
  18. GLS.Graph,
  19. GLS.Utils,
  20. GLS.Context,
  21. GLS.VectorGeometry,
  22. GLS.GeomObjects,
  23. GLS.Coordinates,
  24. GLS.Objects,
  25. GLS.VectorFileObjects,
  26. GLS.SimpleNavigation,
  27. GLS.Material,
  28. GLS.BaseClasses,
  29. GLSL.PostShaders,
  30. GLSL.PostEffects,
  31. CG.PostTransformationShader,
  32. GLS.FileMD2,
  33. GLS.FileMS3D,
  34. GLS.File3DS;
  35. type
  36. TPostShaderDemoForm = class(TForm)
  37. Scene: TGLScene;
  38. Viewer: TGLSceneViewer;
  39. Cadencer: TGLCadencer;
  40. Camera: TGLCamera;
  41. Light: TGLLightSource;
  42. LightCube: TGLDummyCube;
  43. GLSphere1: TGLSphere;
  44. GLXYZGrid1: TGLXYZGrid;
  45. GLArrowLine1: TGLArrowLine;
  46. Panel1: TPanel;
  47. LightMovingCheckBox: TCheckBox;
  48. GUICube: TGLDummyCube;
  49. WorldCube: TGLDummyCube;
  50. Fighter: TGLActor;
  51. Teapot: TGLActor;
  52. Sphere_big: TGLActor;
  53. Sphere_little: TGLActor;
  54. MaterialLibrary: TGLMaterialLibrary;
  55. TurnPitchrollCheckBox: TCheckBox;
  56. Panel2: TPanel;
  57. ShaderCheckListBox: TCheckListBox;
  58. Label1: TLabel;
  59. GLSimpleNavigation1: TGLSimpleNavigation;
  60. PostShaderHolder: TGLPostShaderHolder;
  61. Label2: TLabel;
  62. tbBlurValue: TTrackBar;
  63. lblBlurValue: TLabel;
  64. tbThermalThreshold: TTrackBar;
  65. Label3: TLabel;
  66. lblThermalThreshold: TLabel;
  67. tbThermalIntensity: TTrackBar;
  68. Label5: TLabel;
  69. lblThermalIntensity: TLabel;
  70. Label4: TLabel;
  71. tblNightThreshold: TTrackBar;
  72. lblNight: TLabel;
  73. Label6: TLabel;
  74. lblNightAmplification: TLabel;
  75. tbNightAmplification: TTrackBar;
  76. Label7: TLabel;
  77. lblDreamThreshold: TLabel;
  78. tbDreamThreshold: TTrackBar;
  79. Label8: TLabel;
  80. lblPixelateWidth: TLabel;
  81. tbPixelateWidth: TTrackBar;
  82. Label9: TLabel;
  83. lblPixelateHeight: TLabel;
  84. tbPixelateHeight: TTrackBar;
  85. Label10: TLabel;
  86. tbPosterizeGamma: TTrackBar;
  87. lblPosterizeGamma: TLabel;
  88. Label12: TLabel;
  89. tbPosterizeColors: TTrackBar;
  90. lblPosterizeColors: TLabel;
  91. tbFrostRand: TTrackBar;
  92. Label11: TLabel;
  93. lblFrostRand: TLabel;
  94. tbFrostFactor: TTrackBar;
  95. Label14: TLabel;
  96. lblFrostFactor: TLabel;
  97. Label13: TLabel;
  98. lblTroubleWidth: TLabel;
  99. tbTroubleWidth: TTrackBar;
  100. Label16: TLabel;
  101. lblTroubleHeight: TLabel;
  102. tbTroubleHeight: TTrackBar;
  103. Label18: TLabel;
  104. lblTroubleFreq: TLabel;
  105. tbTroubleFreq: TTrackBar;
  106. procedure FormCreate(Sender: TObject);
  107. procedure CadencerProgress(Sender: TObject;
  108. const deltaTime, newTime: double);
  109. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  110. procedure LightCubeProgress(Sender: TObject;
  111. const deltaTime, newTime: double);
  112. procedure ShaderCheckListBoxClick(Sender: TObject);
  113. procedure tbBlurValueChange(Sender: TObject);
  114. procedure tbThermalThresholdChange(Sender: TObject);
  115. procedure tbThermalIntensityChange(Sender: TObject);
  116. procedure tblNightThresholdChange(Sender: TObject);
  117. procedure tbNightAmplificationChange(Sender: TObject);
  118. procedure tbDreamThresholdChange(Sender: TObject);
  119. procedure tbPixelateWidthChange(Sender: TObject);
  120. procedure tbPixelateHeightChange(Sender: TObject);
  121. procedure tbPosterizeGammaChange(Sender: TObject);
  122. procedure tbPosterizeColorsChange(Sender: TObject);
  123. procedure tbFrostRandChange(Sender: TObject);
  124. procedure tbFrostFactorChange(Sender: TObject);
  125. procedure tbTroubleWidthChange(Sender: TObject);
  126. procedure tbTroubleHeightChange(Sender: TObject);
  127. procedure tbTroubleFreqChange(Sender: TObject);
  128. end;
  129. var
  130. PostShaderDemoForm: TPostShaderDemoForm;
  131. //Shaders
  132. BlurShader: TGLSLPostBlurShader;
  133. ThermalVisionShader: TGLSLPostThermalVisionShader;
  134. TransformationShader: TGLCGPostTransformationShader;
  135. DreamVisionShader: TGLSLPostDreamVisionShader;
  136. NightVisionShader: TGLSLPostNightVisionShader;
  137. PosterizeShader: TGLSLPostPosterizeShader;
  138. FrostShader: TGLSLPostFrostShader;
  139. PixelateShader: TGLSLPostPixelateShader;
  140. TroubleShader: TGLSLPostTroubleShader;
  141. implementation
  142. {$R *.dfm}
  143. procedure TPostShaderDemoForm.FormCreate(Sender: TObject);
  144. begin
  145. // First load models.
  146. SetGLSceneMediaDir();
  147. Fighter.LoadFromFile('waste.md2'); // Fighter
  148. Fighter.SwitchToAnimation(0, True);
  149. Fighter.AnimationMode := aamLoop;
  150. Fighter.Scale.Scale(2);
  151. Teapot.LoadFromFile('Teapot.3ds'); // Teapot (no texture coordinates)
  152. Teapot.Scale.Scale(0.8);
  153. Sphere_big.LoadFromFile('Sphere_big.3DS');
  154. Sphere_big.Scale.Scale(70);
  155. Sphere_little.LoadFromFile('Sphere_little.3ds');
  156. Sphere_little.Scale.Scale(4);
  157. // Then load textures.
  158. MaterialLibrary.LibMaterialByName('Earth').Material.Texture.Image.LoadFromFile
  159. ('Earth.jpg');
  160. MaterialLibrary.LibMaterialByName('Fighter')
  161. .Material.Texture.Image.LoadFromFile('Waste.jpg');
  162. MaterialLibrary.LibMaterialByName('Noise').Material.Texture.Image.LoadFromFile
  163. ('Flare1.bmp');
  164. // MaterialLibrary.LibMaterialByName('Noise').Material.Texture.Image.LoadFromFile('wikiNoise.jpg');
  165. MaterialLibrary.LibMaterialByName('Mask').Material.Texture.Image.LoadFromFile
  166. ('wikiMask.jpg');
  167. // Blur Shader
  168. BlurShader := TGLSLPostBlurShader.Create(Self);
  169. BlurShader.Enabled := false;
  170. BlurShader.Threshold := 0.001;
  171. PostShaderHolder.Shaders.Add.Shader := BlurShader;
  172. ShaderCheckListBox.Items.AddObject('Blur Shader', BlurShader);
  173. ShaderCheckListBox.Checked[0] := false;
  174. // ThermalVision Shader
  175. ThermalVisionShader := TGLSLPostThermalVisionShader.Create(Self);
  176. ThermalVisionShader.Enabled := false;
  177. PostShaderHolder.Shaders.Add.Shader := ThermalVisionShader;
  178. ShaderCheckListBox.Items.AddObject('Thermal Vision Shader',
  179. ThermalVisionShader);
  180. ShaderCheckListBox.Checked[1] := false;
  181. // DreamVision Shader
  182. DreamVisionShader := TGLSLPostDreamVisionShader.Create(Self);
  183. DreamVisionShader.Enabled := false;
  184. PostShaderHolder.Shaders.Add.Shader := DreamVisionShader;
  185. ShaderCheckListBox.Items.AddObject('Dream Vision Shader', DreamVisionShader);
  186. ShaderCheckListBox.Checked[2] := false;
  187. // NightVision Shader
  188. NightVisionShader := TGLSLPostNightVisionShader.Create(Self);
  189. NightVisionShader.Enabled := false;
  190. NightVisionShader.MaterialLibrary := MaterialLibrary;
  191. NightVisionShader.NoiseTexName := 'Noise';
  192. NightVisionShader.MaskTexName := 'Mask';
  193. NightVisionShader.UseMask := 1;
  194. PostShaderHolder.Shaders.Add.Shader := NightVisionShader;
  195. ShaderCheckListBox.Items.AddObject('Night Vision Shader', NightVisionShader);
  196. ShaderCheckListBox.Checked[3] := false;
  197. // Pixelate Shader
  198. PixelateShader := TGLSLPostPixelateShader.Create(Self);
  199. PixelateShader.Enabled := false;
  200. PostShaderHolder.Shaders.Add.Shader := PixelateShader;
  201. ShaderCheckListBox.Items.AddObject('Pixelate Shader', PixelateShader);
  202. ShaderCheckListBox.Checked[4] := false;
  203. // Posterize Shader
  204. PosterizeShader := TGLSLPostPosterizeShader.Create(Self);
  205. PosterizeShader.Enabled := false;
  206. PostShaderHolder.Shaders.Add.Shader := PosterizeShader;
  207. ShaderCheckListBox.Items.AddObject('Posterize Shader', PosterizeShader);
  208. ShaderCheckListBox.Checked[5] := false;
  209. // Frost Shader
  210. FrostShader := TGLSLPostFrostShader.Create(Self);
  211. FrostShader.Enabled := false;
  212. PostShaderHolder.Shaders.Add.Shader := FrostShader;
  213. ShaderCheckListBox.Items.AddObject('Frost Shader', FrostShader);
  214. ShaderCheckListBox.Checked[6] := false;
  215. // Trouble Shader
  216. TroubleShader := TGLSLPostTroubleShader.Create(Self);
  217. TroubleShader.Enabled := false;
  218. TroubleShader.MaterialLibrary := MaterialLibrary;
  219. TroubleShader.NoiseTexName := 'Noise';
  220. PostShaderHolder.Shaders.Add.Shader := TroubleShader;
  221. ShaderCheckListBox.Items.AddObject('Trouble Shader', TroubleShader);
  222. ShaderCheckListBox.Checked[7] := false;
  223. // Transformation Shader
  224. TransformationShader := TGLCGPostTransformationShader.Create(Self);
  225. TransformationShader.TransformationTexture :=
  226. MaterialLibrary.LibMaterialByName('Noise').Material.Texture;
  227. PostShaderHolder.Shaders.Add.Shader := TransformationShader;
  228. ShaderCheckListBox.Items.AddObject('Transformation Shader',
  229. TransformationShader);
  230. ShaderCheckListBox.Checked[8] := True;
  231. end;
  232. //-------------------------------------------------------
  233. procedure TPostShaderDemoForm.CadencerProgress(Sender: TObject;
  234. const deltaTime, newTime: double);
  235. begin
  236. Viewer.Invalidate;
  237. if TurnPitchrollCheckBox.Checked then
  238. begin
  239. Fighter.Roll(20 * deltaTime);
  240. Sphere_big.Pitch(40 * deltaTime);
  241. Sphere_big.Turn(40 * deltaTime);
  242. Sphere_little.Roll(40 * deltaTime);
  243. Teapot.Roll(-20 * deltaTime);
  244. end;
  245. if NightVisionShader.Enabled then
  246. NightVisionShader.ElapsedTime := newTime; // 20*deltaTime;
  247. end;
  248. //-------------------------------------------------------
  249. procedure TPostShaderDemoForm.LightCubeProgress(Sender: TObject;
  250. const deltaTime, newTime: double);
  251. begin
  252. if LightMovingCheckBox.Checked then
  253. LightCube.MoveObjectAround(Camera.TargetObject, sin(newTime) * deltaTime *
  254. 10, deltaTime * 20);
  255. end;
  256. //-------------------------------------------------------
  257. procedure TPostShaderDemoForm.ShaderCheckListBoxClick(Sender: TObject);
  258. var
  259. I: Integer;
  260. begin
  261. if ShaderCheckListBox.Items.Count <> 0 then
  262. for I := 0 to ShaderCheckListBox.Items.Count - 1 do
  263. TGLShader(ShaderCheckListBox.Items.Objects[I]).Enabled :=
  264. ShaderCheckListBox.Checked[I];
  265. end;
  266. //-------------------------------------------------------
  267. procedure TPostShaderDemoForm.tbBlurValueChange(Sender: TObject);
  268. begin
  269. BlurShader.Threshold := tbBlurValue.Position / 100;
  270. lblBlurValue.Caption := FloatToStrF(BlurShader.Threshold, ffFixed, 5, 2);
  271. end;
  272. //-------------------------------------------------------
  273. procedure TPostShaderDemoForm.tbDreamThresholdChange(Sender: TObject);
  274. begin
  275. DreamVisionShader.Threshold := tbDreamThreshold.Position / 100;
  276. lblDreamThreshold.Caption := FloatToStrF(DreamVisionShader.Threshold,
  277. ffFixed, 5, 2);
  278. end;
  279. //-------------------------------------------------------
  280. procedure TPostShaderDemoForm.tbFrostFactorChange(Sender: TObject);
  281. begin
  282. FrostShader.RandFactor := tbFrostFactor.Position;
  283. lblFrostFactor.Caption := FloatToStrF(FrostShader.RandFactor, ffFixed, 5, 2);
  284. end;
  285. //-------------------------------------------------------
  286. procedure TPostShaderDemoForm.tbFrostRandChange(Sender: TObject);
  287. begin
  288. FrostShader.RandScale := tbFrostRand.Position;
  289. lblFrostRand.Caption := FloatToStrF(FrostShader.RandScale, ffFixed, 5, 2);
  290. end;
  291. //-------------------------------------------------------
  292. procedure TPostShaderDemoForm.tblNightThresholdChange(Sender: TObject);
  293. begin
  294. NightVisionShader.LuminanceThreshold := tblNightThreshold.Position / 100;
  295. lblNight.Caption := FloatToStrF(NightVisionShader.LuminanceThreshold,
  296. ffFixed, 5, 2);
  297. end;
  298. //-------------------------------------------------------
  299. procedure TPostShaderDemoForm.tbNightAmplificationChange(Sender: TObject);
  300. begin
  301. NightVisionShader.ColorAmplification := tbNightAmplification.Position / 100;
  302. lblNightAmplification.Caption :=
  303. FloatToStrF(NightVisionShader.ColorAmplification, ffFixed, 5, 2);
  304. end;
  305. //-------------------------------------------------------
  306. procedure TPostShaderDemoForm.tbPixelateHeightChange(Sender: TObject);
  307. begin
  308. PixelateShader.PixelHeight := tbPixelateHeight.Position;
  309. lblPixelateHeight.Caption := FloatToStrF(PixelateShader.PixelHeight,
  310. ffFixed, 5, 0);
  311. end;
  312. //-------------------------------------------------------
  313. procedure TPostShaderDemoForm.tbPixelateWidthChange(Sender: TObject);
  314. begin
  315. PixelateShader.PixelWidth := tbPixelateWidth.Position;
  316. lblPixelateWidth.Caption := FloatToStrF(PixelateShader.PixelWidth,
  317. ffFixed, 5, 0);
  318. end;
  319. //-------------------------------------------------------
  320. procedure TPostShaderDemoForm.tbPosterizeColorsChange(Sender: TObject);
  321. begin
  322. PosterizeShader.NumColors := tbPosterizeColors.Position;
  323. lblPosterizeColors.Caption := FloatToStrF(PosterizeShader.NumColors,
  324. ffFixed, 5, 2);
  325. end;
  326. //-------------------------------------------------------
  327. procedure TPostShaderDemoForm.tbPosterizeGammaChange(Sender: TObject);
  328. begin
  329. PosterizeShader.Gamma := tbPosterizeGamma.Position / 100;
  330. lblPosterizeGamma.Caption := FloatToStrF(PosterizeShader.Gamma,
  331. ffFixed, 5, 2);
  332. end;
  333. //-------------------------------------------------------
  334. procedure TPostShaderDemoForm.tbThermalIntensityChange(Sender: TObject);
  335. begin
  336. ThermalVisionShader.Intensity := tbThermalIntensity.Position / 100;
  337. lblThermalIntensity.Caption := FloatToStrF(ThermalVisionShader.Intensity,
  338. ffFixed, 5, 2);
  339. end;
  340. //-------------------------------------------------------
  341. procedure TPostShaderDemoForm.tbThermalThresholdChange(Sender: TObject);
  342. begin
  343. ThermalVisionShader.Threshold := tbThermalThreshold.Position / 100;
  344. lblThermalThreshold.Caption := FloatToStrF(ThermalVisionShader.Threshold,
  345. ffFixed, 5, 2);
  346. end;
  347. //-------------------------------------------------------
  348. procedure TPostShaderDemoForm.tbTroubleFreqChange(Sender: TObject);
  349. begin
  350. TroubleShader.Freq := tbTroubleFreq.Position / 100;
  351. lblTroubleFreq.Caption := FloatToStrF(TroubleShader.Freq, ffFixed, 5, 2);
  352. end;
  353. //-------------------------------------------------------
  354. procedure TPostShaderDemoForm.tbTroubleHeightChange(Sender: TObject);
  355. begin
  356. TroubleShader.PixelY := tbTroubleHeight.Position;
  357. lblTroubleHeight.Caption := FloatToStrF(TroubleShader.PixelY, ffFixed, 5, 2);
  358. end;
  359. //-------------------------------------------------------
  360. procedure TPostShaderDemoForm.tbTroubleWidthChange(Sender: TObject);
  361. begin
  362. TroubleShader.PixelX := tbTroubleWidth.Position;
  363. lblTroubleWidth.Caption := FloatToStrF(TroubleShader.PixelX, ffFixed, 5, 2);
  364. end;
  365. //-------------------------------------------------------
  366. procedure TPostShaderDemoForm.FormClose(Sender: TObject;
  367. var Action: TCloseAction);
  368. begin
  369. Cadencer.Enabled := false;
  370. end;
  371. end.