Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

212 righe
7.4 KiB

  1. unit uglcArrayBuffer;
  2. { Package: OpenGLCore
  3. Prefix: glc - OpenGL Core
  4. Beschreibung: diese Unit enthält eine Klassen-Kapselung für OpenGL Array Buffer
  5. Beispiel:
  6. type
  7. TVertex = packed record
  8. pos: TgluVector3f; // vertex position
  9. tex: TgluVector2f; // texture coordinates
  10. nor: TgluVector3f; // normal
  11. end;
  12. PVertex = ^TVertex;
  13. var
  14. vBuffer: TglcArrayBuffer;
  15. iBuffer: TglcArrayBuffer;
  16. p: Pointer;
  17. vBuffer := TglcArrayBuffer.Create(TglcBufferTarget.btArrayBuffer);
  18. iBuffer := TglcArrayBuffer.Create(TglcBufferTarget.btElementArrayBuffer);
  19. try
  20. // write vertex data to vertex buffer
  21. vBuffer.Bind;
  22. vBuffer.BufferData(4, SizeOf(TresMeshVertex), TglcBufferUsage.buStaticDraw, nil);
  23. p := vBuffer.MapBuffer(TglcBufferAccess.baWriteOnly);
  24. try
  25. PVertex(p).pos := gluVertex3f(0.0, 0.0, 0.0);
  26. PVertex(p).tex := gluVertex2f(0.0, 0.5);
  27. PVertex(p).nor := gluVertex3f(0.0, 1.0, 0.0);
  28. inc(p, SizeOf(TVertex));
  29. // ...
  30. finally
  31. vBuffer.UnmapBuffer;
  32. vBuffer.Unbind;
  33. end;
  34. // write indices to index buffer
  35. iBuffer.Bind;
  36. iBuffer.BufferData(4, SizeOf(GLuint), TglcBufferUsage.buStaticDraw, nil);
  37. p := iBuffer.MapBuffer(TglcBufferAccess.baWriteOnly);
  38. try
  39. PGLuint(p) := 0;
  40. // ...
  41. finally
  42. iBuffer.UnmapBuffer;
  43. iBuffer.Unbind;
  44. end;
  45. // use array buffers to draw primitive
  46. vBuffer.Bind;
  47. iBuffer.Bind;
  48. glEnableClientState(GL_VERTEX_ARRAY);
  49. glVertexPointer(3, GL_FLOAT, 8, Pointer(0));
  50. glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  51. glTexCoordPointer(2, GL_FLOAT, 8, Pointer(3));
  52. glEnableClientState(GL_NORMAL_ARRAY);
  53. glNormalPointer(GL_FLOAT, 8, Pointer(5));
  54. glEnableClientState(GL_INDEX_ARRAY);
  55. glIndexPointer(GL_INT, 0, nil);
  56. glDrawElements(GL_QUADS, iBuffer.DataCount, GL_UNSIGNED_INT, nil);
  57. glDisableClientState(GL_INDEX_ARRAY);
  58. glDisableClientState(GL_VERTEX_ARRAY);
  59. glDisableClientState(GL_TEXTURE_COORD_ARRAY);
  60. glDisableClientState(GL_NORMAL_ARRAY);
  61. fIndexBuffer.Unbind;
  62. fVertexBuffer.Unbind;
  63. finally
  64. FreeAndNil(vBuffer);
  65. FreeAndNil(iBuffer);
  66. end; }
  67. {$mode objfpc}{$H+}
  68. interface
  69. uses
  70. {$IFNDEF OPENGL_ES}dglOpenGL{$ELSE}dglOpenGLES{$ENDIF}, sysutils, uglcTypes;
  71. type
  72. EglcArrayBuffer = class(Exception);
  73. TglcArrayBuffer = class(TObject)
  74. private
  75. fID: GLuint;
  76. fTarget: TglcBufferTarget;
  77. fUsage: TglcBufferUsage;
  78. protected
  79. fDataCount: Integer;
  80. fDataSize: Integer;
  81. public
  82. property ID: gluInt read fID;
  83. property Target: TglcBufferTarget read fTarget;
  84. property Usage: TglcBufferUsage read fUsage;
  85. property DataCount: Integer read fDataCount;
  86. property DataSize: Integer read fDataSize;
  87. procedure BufferData(const aDataCount, aDataSize: Cardinal; const aUsage: TglcBufferUsage; const aData: Pointer);
  88. function MapBuffer(const aAccess: TglcBufferAccess): Pointer;
  89. function MapBufferRange(const aOffset: GLintptr; const aSize: GLsizeiptr; const aAccess: TglcBufferAccess): Pointer;
  90. procedure UnmapBuffer;
  91. procedure Bind;
  92. procedure Unbind;
  93. constructor Create(const aTarget: TglcBufferTarget);
  94. destructor Destroy; override;
  95. end;
  96. implementation
  97. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. //TglcArrayBuffer///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  99. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  100. procedure TglcArrayBuffer.BufferData(const aDataCount, aDataSize: Cardinal; const aUsage: TglcBufferUsage; const aData: Pointer);
  101. begin
  102. glGetError(); //clear Errors
  103. Bind;
  104. fDataCount := aDataCount;
  105. fDataSize := aDataSize;
  106. fUsage := aUsage;
  107. glBufferData(GLenum(fTarget), fDataCount * fDataSize, aData, GLenum(fUsage));
  108. glcCheckAndRaiseError;
  109. end;
  110. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  111. function TglcArrayBuffer.MapBuffer(const aAccess: TglcBufferAccess): Pointer;
  112. begin
  113. glGetError();
  114. result := nil;
  115. if (fDataCount * fDataSize) <= 0 then
  116. exit;
  117. {$IFNDEF OPENGL_ES}
  118. result := glMapBuffer(GLenum(fTarget), GLenum(aAccess));
  119. {$ELSE}
  120. if not GL_OES_mapbuffer then
  121. raise EglcArrayBuffer.Create('map buffer is not supported by video card');
  122. result := glMapBufferOES(GLenum(fTarget), GLenum(aAccess));
  123. {$ENDIF}
  124. glcCheckAndRaiseError;
  125. end;
  126. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  127. function TglcArrayBuffer.MapBufferRange(const aOffset: GLintptr; const aSize: GLsizeiptr; const aAccess: TglcBufferAccess): Pointer;
  128. begin
  129. {$IFNDEF OPENGL_ES}
  130. if not (GL_ARB_map_buffer_range or GL_VERSION_3_0) then
  131. raise EglcArrayBuffer.Create('map buffer range is not supported by video card');
  132. result := glMapBufferRange(GLenum(fTarget), aOffset, aSize, GLenum(aAccess));
  133. {$ELSE}
  134. if not GL_VERSION_3_0 then
  135. raise EglcArrayBuffer.Create('map buffer range is not supported by video card');
  136. result := glMapBufferRange(GLenum(fTarget), aOffset, aSize, GLenum(aAccess));
  137. {$ENDIF}
  138. end;
  139. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  140. procedure TglcArrayBuffer.UnmapBuffer;
  141. begin
  142. {$IFNDEF OPENGL_ES}
  143. glUnmapBuffer(GLenum(fTarget));
  144. {$ELSE}
  145. if not (GL_OES_mapbuffer or GL_VERSION_3_0) then
  146. raise EglcArrayBuffer.Create('unmap buffer is not supported by video card');
  147. glUnmapBuffer(GLenum(fTarget));
  148. {$ENDIF}
  149. end;
  150. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  151. procedure TglcArrayBuffer.Bind;
  152. begin
  153. glBindBuffer(GLenum(fTarget), fID);
  154. end;
  155. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  156. procedure TglcArrayBuffer.Unbind;
  157. begin
  158. glBindBuffer(GLenum(fTarget), 0);
  159. end;
  160. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  161. constructor TglcArrayBuffer.Create(const aTarget: TglcBufferTarget);
  162. begin
  163. {$IFNDEF OPENGL_ES}
  164. if not (GL_ARB_Vertex_Buffer_Object or GL_VERSION_2_0) then
  165. raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported');
  166. {$ELSE}
  167. if not GL_VERSION_2_0 then
  168. raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported');
  169. {$ENDIF}
  170. inherited Create;
  171. glGenBuffers(1, @fID);
  172. fDataCount := 0;
  173. fDataSize := 0;
  174. fTarget := aTarget;
  175. glcCheckAndRaiseError;
  176. end;
  177. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c]
  178. destructor TglcArrayBuffer.Destroy;
  179. begin
  180. glDeleteBuffers(1, @fID);
  181. inherited Destroy;
  182. end;
  183. end.