MathgeomGLS

Форк
0
/
uSimpleVBO.pas 
131 строка · 2.7 Кб
1
unit uSimpleVBO;
2

3
interface
4

5
uses
6
  Winapi.OpenGL,
7
  Winapi.OpenGLext,
8
  GLS.Scene,
9
  GLS.Mesh,
10
  GLS.VectorTypes,
11
  GLS.VectorGeometry,
12
  GLS.RenderContextInfo,
13
  GLS.OpenGLTokens,
14
  GLS.Context,
15
  GLS.Material,
16
  GLS.Texture;
17

18

19
type
20
  TGLSimpleVBO = class(TGLSceneObject)
21
  protected
22

23
    f_varr: array of TVector3f;
24
    f_narr: array of TVector3f;
25
    f_tarr: array of TTexPoint;
26
    f_bufs: array[0..2] of Cardinal;
27

28
    procedure _initBufs;
29

30
  public
31
    constructor CreateAsChild(a_Owner:TGLBaseSceneObject;
32
      a_Array:PGLVertexDataArray; a_VertexCount:integer);
33
    procedure DoRender(var a_Rci:TGLRenderContextInfo;
34
        a_RenderSelf,a_RenderChildren:Boolean); override;
35
    procedure loadData(a_Array:PGLVertexDataArray; a_VertexCount:integer);
36
    end;
37

38

39
implementation
40

41

42
//
43
// _initBufs
44
//
45
procedure TGLSimpleVBO._initBufs;
46
var
47
    c: integer;
48

49
begin
50
  c := Length(f_varr);
51
  gl.GenBuffers(1, @f_bufs[0]);
52
  gl.BindBuffer(GL_ARRAY_BUFFER, f_bufs[0]);
53
  gl.BufferData(GL_ARRAY_BUFFER, 12 * c, @f_varr[0], GL_STATIC_DRAW);
54
  gl.BindBuffer(GL_ARRAY_BUFFER, 0);
55

56
  gl.GenBuffers(1, @f_bufs[1]);
57
  gl.BindBuffer(GL_ARRAY_BUFFER_ARB, f_bufs[1]);
58
  gl.BufferData(GL_ARRAY_BUFFER_ARB, 12 * c, @f_narr[0], GL_STATIC_DRAW);
59
  gl.BindBuffer(GL_ARRAY_BUFFER_ARB, 0);
60

61
  gl.GenBuffers(1, @f_bufs[2]);
62
  gl.BindBuffer(GL_ARRAY_BUFFER, f_bufs[2]);
63
  gl.BufferData(GL_ARRAY_BUFFER, 8 * c, @f_tarr[0], GL_STATIC_DRAW);
64
  gl.BindBuffer(GL_ARRAY_BUFFER, 0);
65

66
end;
67

68

69
//
70
// constructor
71
//
72
constructor TGLSimpleVBO.CreateAsChild;
73
begin
74
  inherited CreateAsChild(a_Owner);
75
  loadData(a_Array, a_VertexCount);
76
end;
77

78

79
//
80
// loadData
81
//
82
procedure TGLSimpleVBO.loadData;
83
var
84
    i: integer;
85
begin
86
  if a_VertexCount < 3 then Exit;
87
  SetLength(f_varr, a_VertexCount);
88
  SetLength(f_narr, a_VertexCount);
89
  SetLength(f_tarr, a_VertexCount);
90

91
  for i := 0 to a_VertexCount - 1 do begin
92
    f_varr[i] := a_Array[i].coord;
93
    f_narr[i] := a_Array[i].normal;
94
    f_tarr[i] := a_Array[i].textCoord;
95
    end;
96
  _initBufs;
97
end;
98

99

100
//
101
// DoRender
102
//
103
procedure TGLSimpleVBO.DoRender;
104
begin
105
  if High(f_varr) < 2 then Exit;
106
  Material.Apply(a_Rci);
107

108
  gl.EnableClientState(GL_VERTEX_ARRAY);
109
  gl.BindBuffer(GL_ARRAY_BUFFER, f_bufs[0]);
110
  gl.VertexPointer(3, GL_FLOAT, 0, nil);
111

112
  gl.EnableClientState(GL_NORMAL_ARRAY);
113
  gl.BindBuffer(GL_ARRAY_BUFFER, f_bufs[1]);
114
  gl.NormalPointer(GL_FLOAT, 0, nil);
115

116
  gl.EnableClientState(GL_TEXTURE_COORD_ARRAY);
117
  gl.BindBuffer(GL_ARRAY_BUFFER, f_bufs[2]);
118
  gl.TexCoordPointer(2, GL_FLOAT, 0, nil);
119

120
  gl.DrawArrays(GL_QUADS, 0, high(f_varr) + 1);
121

122
  gl.DisableClientState(GL_VERTEX_ARRAY);
123
  gl.DisableClientState(GL_NORMAL_ARRAY);
124
  gl.DisableClientState(GL_TEXTURE_COORD_ARRAY);
125

126
  Material.UnApply(a_Rci);
127

128
end;
129

130

131
end.
132

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.