SimpleGLSLUnit.cpp 11 KB

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