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. Cg.GL,
  17. GLS.CgShader,
  18. GLS.VectorTypes,
  19. GLS.SceneViewer,
  20. GLS.Cadencer,
  21. GLS.Scene,
  22. GLS.Texture,
  23. GLS.Objects,
  24. GLS.AsyncTimer,
  25. GLS.Material,
  26. GLS.Coordinates,
  27. GLS.BaseClasses,
  28. GLS.TextureFormat,
  29. GLS.Utils,
  30. GLS.SimpleNavigation;
  31. type
  32. TFormBumpMap = 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. FormBumpMap: TFormBumpMap;
  75. implementation
  76. {$R *.dfm}
  77. procedure TFormBumpMap.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 TFormBumpMap.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 TFormBumpMap.FP_btnClick(Sender: TObject);
  88. begin
  89. CgShader.FragmentProgram.Code := FP_Memo.Lines;
  90. FP_btn.Enabled := False;
  91. end;
  92. procedure TFormBumpMap.VP_btnClick(Sender: TObject);
  93. begin
  94. CgShader.VertexProgram.Code := VP_Memo.Lines;
  95. VP_btn.Enabled := False;
  96. end;
  97. procedure TFormBumpMap.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 TFormBumpMap.VP_MemoChange(Sender: TObject);
  130. begin
  131. VP_btn.Enabled := True;
  132. end;
  133. procedure TFormBumpMap.FP_MemoChange(Sender: TObject);
  134. begin
  135. FP_btn.Enabled := True;
  136. end;
  137. procedure TFormBumpMap.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 TFormBumpMap.CadencerProgress(Sender: TObject; const deltaTime,
  145. newTime: Double);
  146. begin
  147. LightSource.MoveObjectAround(Dummy, 0, deltatime * 20);
  148. SceneViewer.Invalidate;
  149. end;
  150. procedure TFormBumpMap.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 TFormBumpMap.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 TFormBumpMap.TimerTimer(Sender: TObject);
  164. begin
  165. FormBumpMap.Caption := 'Cg BumpMapping FPS - '+SceneViewer.FramesPerSecondText(2);
  166. SceneViewer.ResetPerformanceMonitor;
  167. end;
  168. end.