Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

156 wiersze
3.4 KiB

  1. unit uMainForm;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls,
  6. uglcContext, uglcShader, uglcArrayBuffer, uglcTypes;
  7. type
  8. TMainForm = class(TForm)
  9. ApplicationProperties: TApplicationProperties;
  10. LogLB: TListBox;
  11. RenderPanel2: TPanel;
  12. RenderPanel1: TPanel;
  13. procedure ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean);
  14. procedure FormCreate(Sender: TObject);
  15. procedure FormDestroy(Sender: TObject);
  16. procedure FormResize(Sender: TObject);
  17. private
  18. fContext1: TglcContext;
  19. fContext2: TglcContext;
  20. fShader: TglcShaderProgram;
  21. fVBO: TglcArrayBuffer;
  22. procedure Log(aSender: TObject; const aMsg: String);
  23. procedure Render;
  24. public
  25. { public declarations }
  26. end;
  27. var
  28. MainForm: TMainForm;
  29. implementation
  30. {$R *.lfm}
  31. uses
  32. dglOpenGL, ugluVector;
  33. const
  34. SHADER_FILE = 'shader.glsl';
  35. LAYOUT_LOCATION_POS = 0;
  36. procedure TMainForm.FormCreate(Sender: TObject);
  37. type
  38. TVertex = packed record
  39. pos: TgluVector3f;
  40. end;
  41. PVertex = ^TVertex;
  42. var
  43. pf: TglcContextPixelFormatSettings;
  44. p: PVertex;
  45. begin
  46. pf := TglcContext.MakePF();
  47. fContext1 := TglcContext.GetPlatformClass.Create(RenderPanel1, pf);
  48. fContext1.BuildContext;
  49. fContext2 := TglcContext.GetPlatformClass.Create(RenderPanel2, pf, fContext1);
  50. fContext2.BuildContext;
  51. fContext1.Activate;
  52. fShader := TglcShaderProgram.Create(@Log);
  53. fShader.LoadFromFile(ExtractFilePath(Application.ExeName) + SHADER_FILE);
  54. fShader.Compile;
  55. fVBO := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer);
  56. fVBO.BufferData(4, sizeof(TVertex), TglcBufferUsage.buStaticDraw, nil);
  57. p := fVBO.MapBuffer(TglcBufferAccess.baWriteOnly);
  58. try
  59. p^.pos := gluVector3f(-0.5, -0.5, 0); inc(p);
  60. p^.pos := gluVector3f( 0.5, -0.5, 0); inc(p);
  61. p^.pos := gluVector3f( 0.5, 0.5, 0); inc(p);
  62. p^.pos := gluVector3f(-0.5, 0.5, 0); inc(p);
  63. finally
  64. fVBO.UnmapBuffer;
  65. end;
  66. end;
  67. procedure TMainForm.ApplicationPropertiesIdle(Sender: TObject; var Done: Boolean);
  68. begin
  69. Render;
  70. Done := false;
  71. end;
  72. procedure TMainForm.FormDestroy(Sender: TObject);
  73. begin
  74. FreeAndNil(fVBO);
  75. FreeAndNil(fShader);
  76. FreeAndNil(fContext2);
  77. FreeAndNil(fContext1);
  78. end;
  79. procedure TMainForm.FormResize(Sender: TObject);
  80. procedure DoResize(const l, r, w, h: Integer; const aPanel: TPanel; const aContext: TglcContext);
  81. begin
  82. aPanel.SetBounds(l, r, w, h);
  83. if Assigned(aContext) then begin
  84. aContext.Activate;
  85. glViewport(0, 0, w, h);
  86. end;
  87. end;
  88. var
  89. w, h: Integer;
  90. begin
  91. w := (ClientWidth - 24) div 2;
  92. h := LogLB.Top - 16;
  93. DoResize( 8, 8, w, h, RenderPanel1, fContext1);
  94. DoResize(w + 16, 8, w, h, RenderPanel2, fContext2);
  95. end;
  96. procedure TMainForm.Log(aSender: TObject; const aMsg: String);
  97. begin
  98. LogLB.Items.Add(aMsg);
  99. end;
  100. procedure TMainForm.Render;
  101. procedure DoRender;
  102. begin
  103. glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  104. fVBO.Bind;
  105. fShader.Enable;
  106. glEnableVertexAttribArray(LAYOUT_LOCATION_POS);
  107. glVertexAttribPointer(LAYOUT_LOCATION_POS, 3, GL_FLOAT, False, 0, nil);
  108. glDrawArrays(GL_QUADS, 0, fVBO.DataCount);
  109. glDisableVertexAttribArray(LAYOUT_LOCATION_POS);
  110. fShader.Disable;
  111. fVBO.Unbind;
  112. end;
  113. begin
  114. fContext1.Activate;
  115. glClearColor(0.1, 0.2, 0.1, 0);
  116. DoRender;
  117. fContext1.SwapBuffers;
  118. fContext2.Activate;
  119. glClearColor(0.1, 0.1, 0.2, 0);
  120. DoRender;
  121. fContext2.SwapBuffers;
  122. end;
  123. end.