fSimpleShaderC.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. //--------------------------------------------------------------
  2. #include <sysutils.hpp>
  3. #include <math.h>
  4. #include <vcl.h>
  5. #pragma hdrstop
  6. #include "fSimpleShaderC.h"
  7. #include "GLS.Keyboard.hpp"
  8. #include "GLS.Context.hpp"
  9. #include "GLS.File3DS.hpp"
  10. //---------------------------------------------------------------------------
  11. #pragma package(smart_init)
  12. #pragma link "GLS.OpenGLAdapter"
  13. #pragma link "GLS.BitmapFont"
  14. #pragma link "GLS.Cadencer"
  15. #pragma link "GLS.GeomObjects"
  16. #pragma link "GLS.HUDObjects"
  17. #pragma link "GLS.Objects"
  18. #pragma link "GLS.Scene"
  19. #pragma link "GLS.Texture"
  20. #pragma link "GLSL.UserShader"
  21. #pragma link "GLS.OpenGLTokens"
  22. #pragma link "GLS.VectorFileObjects"
  23. #pragma link "GLS.SceneViewer"
  24. #pragma link "GLS.WindowsFont"
  25. #pragma link "GLS.Keyboard"
  26. #pragma link "GLS.Context"
  27. #pragma link "GLS.File3DS"
  28. #pragma link "GLS.BaseClasses"
  29. #pragma link "GLS.Coordinates"
  30. #pragma link "GLS.Material"
  31. #pragma link "GLS.SimpleNavigation"
  32. #pragma resource "*.dfm"
  33. TForm1* Form1;
  34. int CurrShader = 0;
  35. AnsiString CurrShaderName = "Blinn";
  36. //---------------------------------------------------------------------------
  37. __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {}
  38. //---------------------------------------------------------------------------
  39. void __fastcall TForm1::FormCreate(TObject* Sender)
  40. {
  41. Path = GetCurrentAssetPath();
  42. // Loading static models
  43. SetCurrentDir(Path + "\\model");
  44. GLFreeForm1->LoadFromFile("teapot.3ds");
  45. // Then loading textures.
  46. SetCurrentDir(Path + "\\texture");
  47. MatLib->LibMaterialByName("Brick01")
  48. ->Material->Texture->Image->LoadFromFile("mur_NormalMap.bmp");
  49. MatLib->LibMaterialByName("Brick02")
  50. ->Material->Texture->Image->LoadFromFile("mur_Ambiant.bmp");
  51. MatLib->LibMaterialByName("Brick03")
  52. ->Material->Texture->Image->LoadFromFile("mur_Hauteur.bmp");
  53. ShaderActived = false;
  54. }
  55. //---------------------------------------------------------------------------
  56. void __fastcall TForm1::GLCadencer1Progress(
  57. TObject* Sender, const double deltaTime, const double newTime)
  58. {
  59. if (IsKeyDown('1')) {
  60. CurrShaderName = "Blinn";
  61. CurrShader = 0;
  62. } else if (IsKeyDown('2')) {
  63. CurrShaderName = "Lambert";
  64. CurrShader = 1;
  65. } else if (IsKeyDown('3')) {
  66. CurrShaderName = "Phong";
  67. CurrShader = 2;
  68. } else if (IsKeyDown('4')) {
  69. CurrShaderName = "Rim";
  70. CurrShader = 3;
  71. } else if (IsKeyDown('5')) {
  72. CurrShaderName = "SharpSpecular";
  73. CurrShader = 4;
  74. } else if (IsKeyDown('6')) {
  75. CurrShaderName = "Sheen";
  76. CurrShader = 5;
  77. } else if (IsKeyDown('7')) {
  78. CurrShaderName = "ThinPlastic";
  79. CurrShader = 6;
  80. } else if (IsKeyDown('8')) {
  81. CurrShaderName = "Velvet";
  82. CurrShader = 7;
  83. }
  84. if (IsKeyDown('9')) {
  85. CurrShaderName = "TEST TEXTURE BUMP";
  86. CurrShader = 8;
  87. }
  88. if (IsKeyDown('0')) {
  89. CurrShaderName = "TEST Toon";
  90. CurrShader = 9;
  91. }
  92. if (CurrShader != 8) {
  93. DummyLight->Position->X = sin(DegToRad(newTime * 15)) * 65;
  94. DummyLight->Position->Z = sin(DegToRad(newTime * 15)) * 65;
  95. }
  96. GLSceneViewer1->Invalidate();
  97. }
  98. //---------------------------------------------------------------------------
  99. void __fastcall TForm1::GLUserShader1DoApply(
  100. TObject* Sender, TGLRenderContextInfo &rci)
  101. {
  102. TVector3f vec, VecCol1, VecCol2;
  103. TGLLibMaterial* libMat;
  104. GLSLProg[CurrShader]->UseProgramObject();
  105. if ((CurrShader != 8) && (CurrShader != 9))
  106. GLSLProg[CurrShader]->Uniform4f["light"] = Light->AbsolutePosition;
  107. if ((CurrShader == 8)) {
  108. // initialize the heightmap
  109. libMat = MatLib->LibMaterialByName("Brick01");
  110. {
  111. libMat->PrepareBuildList();
  112. glActiveTextureARB(GL_TEXTURE0_ARB);
  113. glBindTexture(GL_TEXTURE_2D, libMat->Material->Texture->Handle);
  114. GLSLProg[CurrShader]->Uniform1i["Normal"] = 0;
  115. glActiveTextureARB(GL_TEXTURE0_ARB);
  116. }
  117. libMat = MatLib->LibMaterialByName("Brick02");
  118. {
  119. libMat->PrepareBuildList();
  120. glActiveTextureARB(GL_TEXTURE1_ARB);
  121. glBindTexture(GL_TEXTURE_2D, libMat->Material->Texture->Handle);
  122. GLSLProg[CurrShader]->Uniform1i["base_tex"] = 1;
  123. glActiveTextureARB(GL_TEXTURE0_ARB);
  124. }
  125. libMat = MatLib->LibMaterialByName("Brick03");
  126. {
  127. libMat->PrepareBuildList();
  128. glActiveTextureARB(GL_TEXTURE2_ARB);
  129. glBindTexture(GL_TEXTURE_2D, libMat->Material->Texture->Handle);
  130. GLSLProg[CurrShader]->Uniform1i["Base_Height"] = 2;
  131. glActiveTextureARB(GL_TEXTURE0_ARB);
  132. }
  133. GLSLProg[CurrShader]->Uniform1f["u_invRad"] = 0.001;
  134. vec.X = 0.42200005;
  135. vec.Y = -0.04999996;
  136. vec.Z = 0;
  137. GLSLProg[CurrShader]->Uniform3f["cBumpSize"] = vec;
  138. }
  139. if ((CurrShader == 9)) {
  140. VecCol1.X = 0.5;
  141. VecCol1.Y = 0.25;
  142. VecCol1.Z = 0.2;
  143. GLSLProg[CurrShader]->Uniform3f["DiffuseColor"] = VecCol1;
  144. VecCol2.X = 0.95;
  145. VecCol2.Y = 0.45;
  146. VecCol2.Z = 0.3;
  147. GLSLProg[CurrShader]->Uniform3f["PhongColor"] = VecCol2;
  148. GLSLProg[CurrShader]->Uniform1f["Edge"] = 0.25;
  149. GLSLProg[CurrShader]->Uniform1f["Phong"] = 0.5540001;
  150. }
  151. }
  152. //---------------------------------------------------------------------------
  153. void __fastcall TForm1::GLUserShader1DoUnApply(
  154. TObject* Sender, int Pass, TGLRenderContextInfo &rci, bool &Continue)
  155. {
  156. GLSLProg[CurrShader]->EndUseProgramObject();
  157. }
  158. //---------------------------------------------------------------------------
  159. void __fastcall TForm1::Timer1Timer(TObject* Sender)
  160. {
  161. Caption = Format("Simple GLSL Shader [%.2f FPS]",
  162. ARRAYOFCONST((GLSceneViewer1->FramesPerSecond())));
  163. GLHUDText1->Text =
  164. "GLS.Keyboard [1,2,3,4,5,6,7,8,9,0 ] Current Shader: " + CurrShaderName;
  165. GLSceneViewer1->ResetPerformanceMonitor();
  166. }
  167. //---------------------------------------------------------------------------
  168. void __fastcall TForm1::GLSceneViewer1MouseDown(
  169. TObject* Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
  170. {
  171. mx = X;
  172. my = Y;
  173. }
  174. //---------------------------------------------------------------------------
  175. void __fastcall TForm1::GLSceneViewer1MouseMove(
  176. TObject* Sender, TShiftState Shift, int X, int Y)
  177. {
  178. if (Shift.Contains(ssRight))
  179. Cam->MoveAroundTarget(my - Y, mx - X);
  180. mx = X;
  181. my = Y;
  182. }
  183. //---------------------------------------------------------------------------
  184. void __fastcall TForm1::FormClose(TObject* Sender, TCloseAction &Action)
  185. {
  186. GLCadencer1->Enabled = false;
  187. Timer1->Enabled = false;
  188. ShaderActived = false;
  189. for (int i = 0; i < MAXSHADERS; i++) {
  190. GLSLProg[i]->Free();
  191. }
  192. }
  193. //---------------------------------------------------------------------------
  194. void __fastcall TForm1::FormMouseWheel(TObject* Sender, TShiftState Shift,
  195. int WheelDelta, TPoint &MousePos, bool &Handled)
  196. {
  197. Cam->AdjustDistanceToTarget(Power(1.1, WheelDelta / 120));
  198. }
  199. //---------------------------------------------------------------------------
  200. void __fastcall TForm1::GLDOInitializeRender(
  201. TObject* Sender, TGLRenderContextInfo &rci)
  202. {
  203. bool Continue;
  204. if (!ShaderActived) /// Should be (! ShaderActived)
  205. {
  206. if (!((GL_SHADER_OBJECT_ARB) && (GL_VERTEX_PROGRAM_ARB) &&
  207. (GL_VERTEX_SHADER_ARB) && (GL_FRAGMENT_SHADER_ARB)))
  208. {
  209. ShowMessage(
  210. "Your hardware does not support GLSL to execute this demo!");
  211. // return (void) NULL; <- It's not necessary
  212. }
  213. // Loading shaders
  214. SetCurrentDir(Path + "\\shader");
  215. //Blinn Shader
  216. GLSLProg[0] = new TGLProgramHandle(true);
  217. GLSLProg[0]->AddShader(__classid(TGLVertexShaderHandle),
  218. LoadAnsiStringFromFile("vertex.glsl"), true);
  219. GLSLProg[0]->AddShader(__classid(TGLFragmentShaderHandle),
  220. LoadAnsiStringFromFile("blinn.glsl"), true);
  221. //Lambert Shader
  222. GLSLProg[1] = new TGLProgramHandle(true);
  223. GLSLProg[1]->AddShader(__classid(TGLVertexShaderHandle),
  224. LoadAnsiStringFromFile("vertex.glsl"), true);
  225. GLSLProg[1]->AddShader(__classid(TGLFragmentShaderHandle),
  226. LoadAnsiStringFromFile("lambert.glsl"), true);
  227. //Phong Shader
  228. GLSLProg[2] = new TGLProgramHandle(true);
  229. GLSLProg[2]->AddShader(__classid(TGLVertexShaderHandle),
  230. LoadAnsiStringFromFile("vertex.glsl"), true);
  231. GLSLProg[2]->AddShader(__classid(TGLFragmentShaderHandle),
  232. LoadAnsiStringFromFile("phong.glsl"), true);
  233. //Rim Shader
  234. GLSLProg[3] = new TGLProgramHandle(true);
  235. GLSLProg[3]->AddShader(__classid(TGLVertexShaderHandle),
  236. LoadAnsiStringFromFile("vertex.glsl"), true);
  237. GLSLProg[3]->AddShader(__classid(TGLFragmentShaderHandle),
  238. LoadAnsiStringFromFile("rim.glsl"), true);
  239. //SharpSpecular Shader
  240. GLSLProg[4] = new TGLProgramHandle(true);
  241. GLSLProg[4]->AddShader(__classid(TGLVertexShaderHandle),
  242. LoadAnsiStringFromFile("vertex.glsl"), true);
  243. GLSLProg[4]->AddShader(__classid(TGLFragmentShaderHandle),
  244. LoadAnsiStringFromFile("sharpspecular.glsl"), true);
  245. //Sheen Shader
  246. GLSLProg[5] = new TGLProgramHandle(true);
  247. GLSLProg[5]->AddShader(__classid(TGLVertexShaderHandle),
  248. LoadAnsiStringFromFile("vertex.glsl"), true);
  249. GLSLProg[5]->AddShader(__classid(TGLFragmentShaderHandle),
  250. LoadAnsiStringFromFile("sheen.glsl"), true);
  251. //ThinPlastic Shader
  252. GLSLProg[6] = new TGLProgramHandle(true);
  253. GLSLProg[6]->AddShader(__classid(TGLVertexShaderHandle),
  254. LoadAnsiStringFromFile("vertex.glsl"), true);
  255. GLSLProg[6]->AddShader(__classid(TGLFragmentShaderHandle),
  256. LoadAnsiStringFromFile("thinplastic.glsl"), true);
  257. //Velvet Shader
  258. GLSLProg[7] = new TGLProgramHandle(true);
  259. GLSLProg[7]->AddShader(__classid(TGLVertexShaderHandle),
  260. LoadAnsiStringFromFile("vertex.glsl"), true);
  261. GLSLProg[7]->AddShader(__classid(TGLFragmentShaderHandle),
  262. LoadAnsiStringFromFile("velvet.glsl"), true);
  263. //TEST Texture Bump
  264. GLSLProg[8] = new TGLProgramHandle(true);
  265. GLSLProg[8]->AddShader(__classid(TGLVertexShaderHandle),
  266. LoadAnsiStringFromFile("bump2.vert"), true);
  267. GLSLProg[8]->AddShader(__classid(TGLFragmentShaderHandle),
  268. LoadAnsiStringFromFile("bump2.frag"), true);
  269. //TEST Toon
  270. GLSLProg[9] = new TGLProgramHandle(true);
  271. GLSLProg[9]->AddShader(__classid(TGLVertexShaderHandle),
  272. LoadAnsiStringFromFile("toon.vert"), true);
  273. GLSLProg[9]->AddShader(__classid(TGLFragmentShaderHandle),
  274. LoadAnsiStringFromFile("toon.frag"), true);
  275. for (int i = 0; i < MAXSHADERS; i++) {
  276. if (!GLSLProg[i]->LinkProgram())
  277. throw Exception(GLSLProg[i]->InfoLog());
  278. if (!GLSLProg[i]->ValidateProgram())
  279. throw Exception(GLSLProg[i]->InfoLog());
  280. }
  281. glGetError();
  282. ShaderActived = true;
  283. } else if (ShaderActived) {
  284. GLUserShader1DoApply(this, rci);
  285. if (CurrShader != 8) {
  286. glPushMatrix();
  287. glColor4fv(
  288. GLSphere1->Material->FrontProperties->Diffuse->AsAddress());
  289. GLSphere1->DoRender(rci, true, false);
  290. glPopMatrix();
  291. glPushMatrix();
  292. glTranslatef(1, 0, 0);
  293. glColor4fv(
  294. GLCone1->Material->FrontProperties->Diffuse->AsAddress());
  295. GLCone1->DoRender(rci, true, false);
  296. glPopMatrix();
  297. glPushMatrix();
  298. glTranslatef(0, -1, 0);
  299. glScalef(0.015, 0.015, 0.015);
  300. glRotatef(90, -1, 0, 0);
  301. glColor4fv(
  302. GLFreeForm1->Material->FrontProperties->Diffuse->AsAddress());
  303. GLFreeForm1->DoRender(rci, true, false);
  304. glPopMatrix();
  305. glPushMatrix();
  306. glTranslatef(-1, 0, 0);
  307. glColor4fv(
  308. GLCube1->Material->FrontProperties->Diffuse->AsAddress());
  309. GLCube1->DoRender(rci, true, false);
  310. glPopMatrix();
  311. } else {
  312. glPushMatrix();
  313. GLCube1->DoRender(rci, true, false);
  314. glPopMatrix();
  315. }
  316. }
  317. GLUserShader1DoUnApply(this, 0, rci, Continue);
  318. }
  319. //---------------------------------------------------------------------------