fBumpMapD.pas 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. unit fBumpMapD;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. Winapi.Messages,
  6. System.SysUtils,
  7. System.Variants,
  8. System.Classes,
  9. Vcl.Graphics,
  10. Vcl.Controls,
  11. Vcl.Forms,
  12. Vcl.Dialogs,
  13. Vcl.StdCtrls,
  14. Vcl.ComCtrls,
  15. Vcl.Imaging.Jpeg,
  16. //GLScene
  17. GLS.VectorTypes,
  18. GLS.SceneViewer,
  19. GLS.Cadencer,
  20. GLS.Scene,
  21. Cg.GL,
  22. GLS.Texture,
  23. CG.Shader,
  24. GLS.Objects,
  25. GLS.AsyncTimer,
  26. GLS.Material,
  27. GLS.Coordinates,
  28. GLS.BaseClasses,
  29. Scenario.TextureFormat,
  30. GLS.Utils, GLS.SimpleNavigation;
  31. type
  32. TBumpDemo_frm = class(TForm)
  33. Scene: TGLScene;
  34. Cadencer: TGLCadencer;
  35. SceneViewer: TGLSceneViewer;
  36. Shaders_ctrl: TPageControl;
  37. ts_Fragment_Program: TTabSheet;
  38. ts_Vertex_Program: TTabSheet;
  39. FP_Memo: TMemo;
  40. VP_Memo: TMemo;
  41. VP_btn: TButton;
  42. FP_btn: TButton;
  43. FP_cb: TCheckBox;
  44. VP_cb: TCheckBox;
  45. CgShader: TCgShader;
  46. MaterialLibrary: TGLMaterialLibrary;
  47. Camera: TGLCamera;
  48. LightSource: TGLLightSource;
  49. Light_Sphere: TGLSphere;
  50. Dummy: TGLDummyCube;
  51. Cube_2: TGLCube;
  52. Timer: TGLAsyncTimer;
  53. GLSphere1: TGLSphere;
  54. GLSimpleNavigation1: TGLSimpleNavigation;
  55. procedure VP_cbClick(Sender: TObject);
  56. procedure FP_cbClick(Sender: TObject);
  57. procedure FP_btnClick(Sender: TObject);
  58. procedure VP_btnClick(Sender: TObject);
  59. procedure FormCreate(Sender: TObject);
  60. procedure VP_MemoChange(Sender: TObject);
  61. procedure FP_MemoChange(Sender: TObject);
  62. procedure SceneViewerMouseMove(Sender: TObject; Shift: TShiftState; X,
  63. Y: Integer);
  64. procedure CadencerProgress(Sender: TObject; const deltaTime,
  65. newTime: Double);
  66. procedure CgShaderApplyFP(CgProgram: TCgProgram; Sender: TObject);
  67. procedure CgShaderApplyVP(CgProgram: TCgProgram; Sender: TObject);
  68. procedure TimerTimer(Sender: TObject);
  69. private
  70. public
  71. OldX, OldY: Integer;
  72. end;
  73. var
  74. BumpDemo_frm: TBumpDemo_frm;
  75. implementation
  76. {$R *.dfm}
  77. procedure TBumpDemo_frm.VP_cbClick(Sender: TObject);
  78. begin
  79. CgShader.VertexProgram.Enabled := VP_cb.Checked;
  80. if CgShader.VertexProgram.Enabled = True then VP_btn.Click;
  81. end;
  82. procedure TBumpDemo_frm.FP_cbClick(Sender: TObject);
  83. begin
  84. CgShader.FragmentProgram.Enabled := FP_cb.Checked;
  85. if CgShader.FragmentProgram.Enabled = True then FP_btn.Click;
  86. end;
  87. procedure TBumpDemo_frm.FP_btnClick(Sender: TObject);
  88. begin
  89. CgShader.FragmentProgram.Code := FP_Memo.Lines;
  90. FP_btn.Enabled := False;
  91. end;
  92. procedure TBumpDemo_frm.VP_btnClick(Sender: TObject);
  93. begin
  94. CgShader.VertexProgram.Code := VP_Memo.Lines;
  95. VP_btn.Enabled := False;
  96. end;
  97. procedure TBumpDemo_frm.FormCreate(Sender: TObject);
  98. begin
  99. var Path: TFileName := GetCurrentAssetPath();
  100. SetCurrentDir(Path + '\shader');
  101. FP_Memo.Lines.LoadFromFile('BumpMapping_fp.cg');
  102. VP_Memo.Lines.LoadFromFile('BumpMapping_vp.cg');
  103. with MaterialLibrary do
  104. begin
  105. SetCurrentDir(Path + '\map');
  106. AddTextureMaterial('c_tex','earth.jpg');
  107. SetCurrentDir(Path + '\texture');
  108. AddTextureMaterial('c_normal','earthnormals.jpg');
  109. AddTextureMaterial('c2_tex','walkway.jpg');
  110. AddTextureMaterial('c2_normal','walkwaynorm.jpg');
  111. Materials[0].Material.Texture.FilteringQuality := tfAnisotropic;
  112. Materials[1].Material.Texture.FilteringQuality := tfAnisotropic;
  113. Materials[2].Material.Texture.FilteringQuality := tfAnisotropic;
  114. Materials[3].Material.Texture.FilteringQuality := tfAnisotropic;
  115. Materials[0].Texture2Name := 'c_normal';
  116. Materials[0].Shader := CgShader;
  117. Materials[2].Texture2Name := 'c2_normal';
  118. Materials[2].Shader := CgShader;
  119. Materials[1].Material.Texture.TextureFormat := tfNormalMap;
  120. Materials[3].Material.Texture.TextureFormat := tfNormalMap;
  121. Materials[1].Material.Texture.NormalMapScale := 0.005;
  122. Materials[3].Material.Texture.NormalMapScale := 0.005;
  123. end;
  124. Cube_2.Material.MaterialLibrary := MaterialLibrary;
  125. GLSphere1.Material.MaterialLibrary := MaterialLibrary;
  126. GLSphere1.Material.LibMaterialName := 'c_tex';
  127. Cube_2.Material.LibMaterialName := 'c2_tex';
  128. end;
  129. procedure TBumpDemo_frm.VP_MemoChange(Sender: TObject);
  130. begin
  131. VP_btn.Enabled := True;
  132. end;
  133. procedure TBumpDemo_frm.FP_MemoChange(Sender: TObject);
  134. begin
  135. FP_btn.Enabled := True;
  136. end;
  137. procedure TBumpDemo_frm.SceneViewerMouseMove(Sender: TObject;
  138. Shift: TShiftState; X, Y: Integer);
  139. begin
  140. if ssLeft in Shift then Camera.MoveAroundTarget(OldY - y, oldX - x);
  141. OldX := x;
  142. Oldy := y;
  143. end;
  144. procedure TBumpDemo_frm.CadencerProgress(Sender: TObject; const deltaTime,
  145. newTime: Double);
  146. begin
  147. LightSource.MoveObjectAround(Dummy, 0, deltatime * 20);
  148. SceneViewer.Invalidate;
  149. end;
  150. procedure TBumpDemo_frm.CgShaderApplyFP(CgProgram: TCgProgram;
  151. Sender: TObject);
  152. begin
  153. CgProgram.ParamByName('tex1').SetAsTexture2D(0);
  154. CgProgram.ParamByName('tex2').SetAsTexture2D(1);
  155. CgProgram.ParamByName('lightcolor').SetAsVector(LightSource.Diffuse.Color);
  156. end;
  157. procedure TBumpDemo_frm.CgShaderApplyVP(CgProgram: TCgProgram;
  158. Sender: TObject);
  159. begin
  160. CgProgram.ParamByName('lightpos').SetAsVector(LightSource.Position.AsAffineVector);
  161. CgProgram.ParamByName('ModelViewProj').SetAsStateMatrix(CG_GL_MODELVIEW_PROJECTION_MATRIX, CG_GL_MATRIX_IDENTITY);
  162. end;
  163. procedure TBumpDemo_frm.TimerTimer(Sender: TObject);
  164. begin
  165. BumpDemo_frm.Caption := 'Cg BumpMapping FPS - '+SceneViewer.FramesPerSecondText(2);
  166. SceneViewer.ResetPerformanceMonitor;
  167. end;
  168. end.