質問編集履歴
11
文章を修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
提示コードのコメント部の 頂点属性のUVデータを更新のコード部ですが毎フレーム頂点情報のUV座標を更新して反映させ
|
1
|
+
提示コードのコメント部の 頂点属性のUVデータを更新のコード部ですが毎フレーム頂点情報のUV座標を更新して反映させたいのですがglBufferSubData();関数の使い方が知りたいです。
|
2
2
|
|
3
3
|
|
4
4
|
|
10
文章を修正しました。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
頂点情報のUV座標を更新する方法
|
1
|
+
頂点情報のUV座標を更新する方法 glBuffersubData();関数の使い方が知りたい。
|
test
CHANGED
@@ -2,6 +2,36 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
+
確認したこと
|
6
|
+
|
7
|
+
「 UV座標の指定を確認するためコンストラクタ部にUV指定のコードを入れましたが座標は適切でした。 」
|
8
|
+
|
9
|
+
「glBuffersubData();関数でエラーコード0x502 が発生しているためこの関数が原因です。"現在のステートで無効な操作をしている場合、もしくは廃止された関数を呼び出した場合(*1)"」
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
利用ライブラリ
|
14
|
+
|
15
|
+
glew
|
16
|
+
|
17
|
+
glfw
|
18
|
+
|
19
|
+
freetype
|
20
|
+
|
21
|
+
opengl
|
22
|
+
|
23
|
+
glmライブラリ
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
5
35
|
Github: https://github.com/Shigurechan/OpenGL_FrameWork/tree/6c59a4560a5cb4c042f557264d9ab3f9e034d7dc
|
6
36
|
|
7
37
|
|
9
文章を修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
+
Github: https://github.com/Shigurechan/OpenGL_FrameWork/tree/6c59a4560a5cb4c042f557264d9ab3f9e034d7dc
|
6
|
+
|
7
|
+
|
8
|
+
|
5
9
|
|
6
10
|
|
7
11
|
提示画像の右上のキャラクター
|
8
文章を修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -18,6 +18,230 @@
|
|
18
18
|
|
19
19
|
```cpp
|
20
20
|
|
21
|
+
#include "Sprite.hpp"
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
#include <iostream>
|
26
|
+
|
27
|
+
#include <fstream>
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
#include <glm/glm.hpp>
|
32
|
+
|
33
|
+
#include <glm/gtc/matrix_Transform.hpp>
|
34
|
+
|
35
|
+
#include <glm/gtx/Transform.hpp>
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
#include "Texture.hpp"
|
40
|
+
|
41
|
+
#include "Shader.hpp"
|
42
|
+
|
43
|
+
#include "Window.hpp"
|
44
|
+
|
45
|
+
#include <stb/stb_image.h>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
//コンストラクタ
|
52
|
+
|
53
|
+
FrameWork::Sprite::Sprite(std::shared_ptr<Window> w,const char* vert,const char* frag) : Transform_2D(),Shader()
|
54
|
+
|
55
|
+
{
|
56
|
+
|
57
|
+
windowContext = w; //ウインドウコンテキスト
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
//シェーダー読み込み
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
if (vert == NULL && frag == NULL)
|
68
|
+
|
69
|
+
{
|
70
|
+
|
71
|
+
vert = "Shader/2D/BasicTexture_2D.vert";
|
72
|
+
|
73
|
+
frag = "Shader/2D/BasicTexture_2D.frag";
|
74
|
+
|
75
|
+
LoadShader(vert, frag); //シェーダーロード
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
isDefaultShader = true;
|
80
|
+
|
81
|
+
}
|
82
|
+
|
83
|
+
else
|
84
|
+
|
85
|
+
{
|
86
|
+
|
87
|
+
LoadShader(vert, frag);
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
isDefaultShader = false;
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
}
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
|
106
|
+
|
107
|
+
//テクスチャ関係
|
108
|
+
|
109
|
+
textureID = std::vector<TextureData>(0); //テクスチャーデータ
|
110
|
+
|
111
|
+
textureUnitCount = 0; //テクスチャユニット数をカウント
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
//vao
|
118
|
+
|
119
|
+
glGenVertexArrays(1, &vao);
|
120
|
+
|
121
|
+
glBindVertexArray(vao);
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
//vbo
|
126
|
+
|
127
|
+
glGenBuffers(1, &vbo);
|
128
|
+
|
129
|
+
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
130
|
+
|
131
|
+
|
132
|
+
|
133
|
+
//頂点
|
134
|
+
|
135
|
+
GLint attrib = getAttribLocation("vertexPosition");
|
136
|
+
|
137
|
+
glEnableVertexAttribArray(attrib);
|
138
|
+
|
139
|
+
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_STATIC_DRAW);
|
140
|
+
|
141
|
+
glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid*)0);
|
142
|
+
|
143
|
+
setBindAttribVertex("vertexPosition");
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
//UV
|
148
|
+
|
149
|
+
attrib = getAttribLocation("vertexUV");
|
150
|
+
|
151
|
+
glEnableVertexAttribArray(attrib);
|
152
|
+
|
153
|
+
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_STATIC_DRAW);
|
154
|
+
|
155
|
+
glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2));
|
156
|
+
|
157
|
+
setBindAttribVertex("vertexUV");
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
//アルファブレンド有効
|
164
|
+
|
165
|
+
glEnable(GL_BLEND);
|
166
|
+
|
167
|
+
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
168
|
+
|
169
|
+
}
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
// ######################################## メンバ関数 ########################################
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
//テクスチャ設定
|
180
|
+
|
181
|
+
void FrameWork::Sprite::setTexture(TextureData tex)
|
182
|
+
|
183
|
+
{
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
textureID.push_back(tex); //テクスチャーIDに追加
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
glGenTextures(1, &textureID.back().ID); //テクスチャIDの生成
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
//バインド
|
198
|
+
|
199
|
+
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
200
|
+
|
201
|
+
glBindTexture(GL_TEXTURE_2D, textureID.back().ID);
|
202
|
+
|
203
|
+
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureID.back().size.x, textureID.back().size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureID.back().fileData);
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
// テクスチャの補間設定
|
208
|
+
|
209
|
+
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
210
|
+
|
211
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
212
|
+
|
213
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
214
|
+
|
215
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
216
|
+
|
217
|
+
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
218
|
+
|
219
|
+
|
220
|
+
|
221
|
+
textureID.back().textureUnitNumber = GL_TEXTURE0 + (unsigned short int)textureUnitCount;
|
222
|
+
|
223
|
+
assert(textureID.back().textureUnitNumber < GL_TEXTURE31);//エラー表示
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
textureUnitCount++; //テクスチャーユニットカウントに加算
|
228
|
+
|
229
|
+
}
|
230
|
+
|
231
|
+
|
232
|
+
|
233
|
+
//描画するアクティブなテクスチャに指定
|
234
|
+
|
235
|
+
void FrameWork::Sprite::setDrawTextureID(unsigned char id)
|
236
|
+
|
237
|
+
{
|
238
|
+
|
239
|
+
//assert(id < textureID.size());
|
240
|
+
|
241
|
+
glActiveTexture(textureID.at(id).textureUnitNumber);
|
242
|
+
|
243
|
+
}
|
244
|
+
|
21
245
|
|
22
246
|
|
23
247
|
//描画
|
@@ -60,9 +284,9 @@
|
|
60
284
|
|
61
285
|
|
62
286
|
|
63
|
-
std::cout << textureID.at(texNum).size.x << std::endl;
|
287
|
+
//std::cout << textureID.at(texNum).size.x << std::endl;
|
64
|
-
|
288
|
+
|
65
|
-
std::cout << textureID.at(texNum).size.y << std::endl;
|
289
|
+
//std::cout << textureID.at(texNum).size.y << std::endl;
|
66
290
|
|
67
291
|
|
68
292
|
|
@@ -112,19 +336,7 @@
|
|
112
336
|
|
113
337
|
|
114
338
|
|
115
|
-
//UV
|
116
|
-
|
117
|
-
GLint attrib = getAttribLocation("vertexUV");
|
118
|
-
|
119
|
-
glEnableVertexAttribArray(attrib);
|
120
|
-
|
121
|
-
glBufferData(GL_ARRAY_BUFFER,
|
339
|
+
//glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexUV) * 6, rectangleVertex);
|
122
|
-
|
123
|
-
glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2));
|
124
|
-
|
125
|
-
setBindAttribVertex("vertexUV");
|
126
|
-
|
127
|
-
|
128
340
|
|
129
341
|
|
130
342
|
|
@@ -208,4 +420,54 @@
|
|
208
420
|
|
209
421
|
|
210
422
|
|
423
|
+
|
424
|
+
|
425
|
+
//デストラクタ
|
426
|
+
|
427
|
+
FrameWork::Sprite::~Sprite()
|
428
|
+
|
429
|
+
{
|
430
|
+
|
431
|
+
|
432
|
+
|
433
|
+
//std::cout << "デストラクタ" << std::endl;
|
434
|
+
|
435
|
+
|
436
|
+
|
437
|
+
//テクスチャーIDを開放
|
438
|
+
|
439
|
+
for (int i = 0; i < textureID.size(); i++)
|
440
|
+
|
441
|
+
{
|
442
|
+
|
443
|
+
glDeleteTextures(1,&textureID.at(i).ID);
|
444
|
+
|
445
|
+
|
446
|
+
|
447
|
+
stbi_image_free(textureID.at(i).fileData);
|
448
|
+
|
449
|
+
textureID.at(i).fileData = NULL;
|
450
|
+
|
451
|
+
|
452
|
+
|
453
|
+
|
454
|
+
|
455
|
+
|
456
|
+
|
457
|
+
}
|
458
|
+
|
459
|
+
|
460
|
+
|
461
|
+
glDeleteVertexArrays(1, &vao);
|
462
|
+
|
463
|
+
glDeleteBuffers(1, &vbo);
|
464
|
+
|
465
|
+
|
466
|
+
|
467
|
+
}
|
468
|
+
|
469
|
+
|
470
|
+
|
471
|
+
|
472
|
+
|
211
473
|
```
|
7
提示画像を追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,14 +2,18 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
+
|
6
|
+
|
7
|
+
提示画像の右上のキャラクター
|
8
|
+
|
9
|
+
![イメージ説明](85370e6d6b564a07095040bd79228ecd.png)
|
10
|
+
|
5
11
|
参考サイト: https://www.it-swarm-ja.com/ja/opengl/opengl%E9%A0%82%E7%82%B9%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%83%BC%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E9%81%A9%E5%88%87%E3%81%AA%E6%96%B9%E6%B3%95%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/1072569757/
|
6
12
|
|
7
13
|
|
8
14
|
|
9
15
|
参考サイト: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferSubData.xhtml
|
10
16
|
|
11
|
-
|
12
|
-
|
13
17
|
参考サイト: https://qiita.com/uechoco@github/items/08e401761bddd17b4c3f
|
14
18
|
|
15
19
|
```cpp
|
6
参考サイトを追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -8,6 +8,10 @@
|
|
8
8
|
|
9
9
|
参考サイト: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferSubData.xhtml
|
10
10
|
|
11
|
+
|
12
|
+
|
13
|
+
参考サイト: https://qiita.com/uechoco@github/items/08e401761bddd17b4c3f
|
14
|
+
|
11
15
|
```cpp
|
12
16
|
|
13
17
|
|
5
文章を修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,7 +2,11 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
|
5
|
+
参考サイト: https://www.it-swarm-ja.com/ja/opengl/opengl%E9%A0%82%E7%82%B9%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%83%BC%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E9%81%A9%E5%88%87%E3%81%AA%E6%96%B9%E6%B3%95%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/1072569757/
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
参考サイト: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferSubData.xhtml
|
6
10
|
|
7
11
|
```cpp
|
8
12
|
|
4
文章を修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
頂点情報のUV座標を更新する方法
|
test
CHANGED
@@ -1,80 +1,8 @@
|
|
1
|
-
提示コードの
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
CELL 96
|
6
|
-
|
7
|
-
SizeX 96
|
8
|
-
|
9
|
-
sizeY 48
|
1
|
+
提示コードのコメント部の 頂点属性のUVデータを更新のコード部ですが毎フレーム頂点情報のUV座標を更新して反映させるにはどんな関数を使えばいいのでしょうか?調べましたがわかりません。
|
10
2
|
|
11
3
|
|
12
4
|
|
13
5
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
使用ライブラリ
|
18
|
-
|
19
|
-
glew
|
20
|
-
|
21
|
-
glfw
|
22
|
-
|
23
|
-
freetype
|
24
|
-
|
25
|
-
opengl
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
Github https://github.com/Shigurechan/OpenGL_FrameWork
|
30
|
-
|
31
|
-
公式リファレンス: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferSubData.xhtml
|
32
|
-
|
33
|
-
![イメージ説明](dcbda7a3c86fea06acc152985953e590.png)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
```cpp
|
38
|
-
|
39
|
-
void Player::Draw() const
|
40
|
-
|
41
|
-
{
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
if (a == 0)
|
46
|
-
|
47
|
-
{
|
48
|
-
|
49
|
-
//sprite->DrawGraph(position, 0, 0, glm::vec2(0, 0), glm::vec2(0, 0), glm::vec2(CELL * 2, CELL));
|
50
|
-
|
51
|
-
}
|
52
|
-
|
53
|
-
else if(a == 1)
|
54
|
-
|
55
|
-
{
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
}
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
sprite->DrawGraph(position, 0, 0, glm::vec2(0, 0), glm::vec2(CELL, 0), glm::vec2(CELL * 2, CELL));
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
}
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
```
|
78
6
|
|
79
7
|
```cpp
|
80
8
|
|
@@ -110,6 +38,8 @@
|
|
110
38
|
|
111
39
|
|
112
40
|
|
41
|
+
|
42
|
+
|
113
43
|
//UVサイズからピクセルサイズを算出
|
114
44
|
|
115
45
|
const float sizeX = 1.0f / (float)textureID.at(texNum).size.x;
|
@@ -122,7 +52,7 @@
|
|
122
52
|
|
123
53
|
std::cout << textureID.at(texNum).size.y << std::endl;
|
124
54
|
|
125
|
-
|
55
|
+
|
126
56
|
|
127
57
|
|
128
58
|
|
@@ -166,13 +96,31 @@
|
|
166
96
|
|
167
97
|
rectangleVertex[5].uv[1] = 1.0f - (sizeY * ((endSize.y - startSize.y) + startSize.y));
|
168
98
|
|
169
|
-
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Transform_2D::VertexUV) * 6, rectangleVertex); //頂点データを再変更
|
170
99
|
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
//UV
|
104
|
+
|
105
|
+
GLint attrib = getAttribLocation("vertexUV");
|
106
|
+
|
107
|
+
glEnableVertexAttribArray(attrib);
|
108
|
+
|
109
|
+
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_STATIC_DRAW);
|
110
|
+
|
171
|
-
|
111
|
+
glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2));
|
112
|
+
|
113
|
+
setBindAttribVertex("vertexUV");
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
|
172
118
|
|
173
119
|
|
174
120
|
|
175
121
|
// ###################################################
|
122
|
+
|
123
|
+
|
176
124
|
|
177
125
|
|
178
126
|
|
@@ -192,7 +140,7 @@
|
|
192
140
|
|
193
141
|
setTranslate(glm::vec3(pos.x + (getSizeScale().x / 2.0f), pos.y + (getSizeScale().y / 2.0f), 0.0f)); //平行移動
|
194
142
|
|
195
|
-
|
143
|
+
|
196
144
|
|
197
145
|
|
198
146
|
|
3
文章を修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
提示コードのPlayer::Draw()関数部ですがなぜUV座標を指定しているにも関わらず画像が全体表示されてしまうのでしょうかglBufferSubData();関数がうまく機能していないためなのですがどうすれば正常に機能することができるのでしょうか?調べましたがこの関数の使い方がよくわからずUV座標を指定しても反映されません。
|
1
|
+
提示コードのPlayer::Draw()関数部ですがなぜUV座標を指定しているにも関わらず画像が全体表示されてしまうのでしょうかglBufferSubData();関数がうまく機能していないためなのですがどうすれば正常に機能することができるのでしょうか?調べましたがこの関数の使い方がよくわからずUV座標を指定しても反映されません UV座標の設定コードをコンストラクタで行いUV座標の位置を確かめましたが適切な位置でした。
|
2
2
|
|
3
3
|
|
4
4
|
|
2
文章を修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -10,6 +10,24 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
使用ライブラリ
|
18
|
+
|
19
|
+
glew
|
20
|
+
|
21
|
+
glfw
|
22
|
+
|
23
|
+
freetype
|
24
|
+
|
25
|
+
opengl
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
Github https://github.com/Shigurechan/OpenGL_FrameWork
|
30
|
+
|
13
31
|
公式リファレンス: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferSubData.xhtml
|
14
32
|
|
15
33
|
![イメージ説明](dcbda7a3c86fea06acc152985953e590.png)
|
1
文章を修正しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,6 +2,12 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
+
CELL 96
|
6
|
+
|
7
|
+
SizeX 96
|
8
|
+
|
9
|
+
sizeY 48
|
10
|
+
|
5
11
|
|
6
12
|
|
7
13
|
公式リファレンス: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glBufferSubData.xhtml
|