OpenGL - Vertex array
をテンプレートにして作成
[
トップ
|
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
*Vertex array [#xde7433f]
OpenGLでポリゴンなどを描画するときは,
#code(C){{
double v0[3] = {0, 0, 0};
double v1[3] = {1, 0, 0};
double v2[3] = {0, 1, 0};
glBegin(GL_TRIANGLES);
glVertex3dv(v0);
glVertex3dv(v1);
glVertex3dv(v2);
glBegin(GL_TRIANGLES);
}}
などのようにglVertexで一つ一つ指定します.
しかし,大量の頂点データがある場合,毎回glVertex関数を呼...
そこで,Vertex arrayを用います.
#code(C){{
GLdouble vertices[] = { 0, 0, 0, 1, 0, 0, 1, 1, 0 };
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_DOUBLE, 0, vertices);
int num_of_vertices = sizeof(vertices)/sizeof(GLdouble);
glDrawArrays(GL_TRIANGLES, 0, num_of_vertices);
glDisableClientState(GL_VERTEX_ARRAY);
}}
配列に格納した頂点データをOpenGLに転送,描画します.
それぞれの関数は,
-glEnableClientState : arrayをactivateする.引数には,GL_...
GL_INDEX_ARRAY, GL_NORMAL_ARRAY, GL_FOG_COORDINATE_ARRAY,...
-glVertexPointer(size, type, stride, pointer) : arrayの元...
glVertexPointerは頂点データの場合だが,その他に同様の関数...
|命令名|size|type|
|glVertexPointer(size, type, stride, pointer)|2,3,4|GL_SH...
|glColorPointer(size, type, stride, pointer)|3,4|GL_BYTE,...
|glSecondaryColorPointer(size, type, stride, pointer)|3|...
|glIndexPointer(type, stride, pointer)|1|GL_UNSIGNED_BYTE...
|glNormalPointer(type, stride, pointer)|3|GL_BYTE, GL_SHO...
|glFogCoordPointer(type, stride, pointer)|1|GL_FLOAT, GL_...
|glTexCoordPointer(size, type, stride, pointer)|1,2,3,4|G...
|glEdgeFlagPointer(stride, pointer)|1|-|
-glDrawArrays(mode, first, count) : arrayのfirstからfirst...
ちなみにarray内の1要素のみを描画したい場合はglArrayElemen...
#code(C){{
glBegin(GL_POINTS);
for(int i = 0; i < n; ++i){
glArrayElement(first+i);
}
glEnd();
}}
-glDisableClientState : arrayをdeactivate.
*glDrawElements [#c8fd5275]
ポリゴンデータの表現には通常,頂点列とその幾何構造を用い...
そのようなデータの描画時にはglDrawElements()を用います.
#code(C){{
GLdouble vertices[] = { 0, 0, 0, 1, 0, 0, 1, 1, 0, 0,...
GLuint indices[] = { 0, 1, 2, 0, 2, 3 };
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_DOUBLE, 0, vertices);
int num_of_indices = sizeof(indices)/sizeof(GLuint);
glDrawElements(GL_TRIANGLES, num_of_indices, GL_UNSIGNED...
glDisableClientState(GL_VERTEX_ARRAY);
}}
indicesのある範囲だけ使いたい場合は,glDrawRangeElement(m...
また,複数のindicesをまとめて指定したい場合は,glMultiDra...
*Interleaved array [#v06bfa67]
1つのarrayに複数の種類のデータ(e.g. ColorとVertex)を含め...
glInterleavedArraysが使えます.例えば,頂点の色と座標の場...
#code(C){{
GLfloat col_and_vert[] = { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 5.0, 0.0, 0.0,
0.0, 0.0, 1.0, 5.0, 5.0, 0.0 };
glInterleavedArrays(GL_C3F_V3F, 0, col_and_vert);
glDrawArrays(GL_TRIANGLES, 0, 3);
}}
col_and_vertには{頂点1の色,頂点1の座標,頂点2の色,頂点2...
glInterleavedArraysの第一引数は配列の型と並びを指定します...
glVertexPointerに対応する3要素のfloatが並んでいることを示...
このほかにも,GL_V2F, GL_V3F, GL_C4UB_V2F, GL_C4UB_V3F, G...
が指定できます.UBはGL_UNSIGNED_BYTE,Tはテクスチャ座標に...
また,構造体を用いると,
#code(C){{
struct Vertex
{
GLfloat color[4];
GLfloat normal[3];
GLfloat vertex[3];
};
vector<Vertex> inter_array;
inter_array.resize(N);
...
glInterleavedArrays(GL_C4F_N3F_V3F, 0, &inter_array[0]);
glDrawArrays(GL_TRIANGLES, 0, N);
}}
値の格納にはCの配列ではなくSTLのvectorを用いました.
vectorは&inter_array[0]を渡すことで配列と互換性を持ってい...
終了行:
*Vertex array [#xde7433f]
OpenGLでポリゴンなどを描画するときは,
#code(C){{
double v0[3] = {0, 0, 0};
double v1[3] = {1, 0, 0};
double v2[3] = {0, 1, 0};
glBegin(GL_TRIANGLES);
glVertex3dv(v0);
glVertex3dv(v1);
glVertex3dv(v2);
glBegin(GL_TRIANGLES);
}}
などのようにglVertexで一つ一つ指定します.
しかし,大量の頂点データがある場合,毎回glVertex関数を呼...
そこで,Vertex arrayを用います.
#code(C){{
GLdouble vertices[] = { 0, 0, 0, 1, 0, 0, 1, 1, 0 };
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_DOUBLE, 0, vertices);
int num_of_vertices = sizeof(vertices)/sizeof(GLdouble);
glDrawArrays(GL_TRIANGLES, 0, num_of_vertices);
glDisableClientState(GL_VERTEX_ARRAY);
}}
配列に格納した頂点データをOpenGLに転送,描画します.
それぞれの関数は,
-glEnableClientState : arrayをactivateする.引数には,GL_...
GL_INDEX_ARRAY, GL_NORMAL_ARRAY, GL_FOG_COORDINATE_ARRAY,...
-glVertexPointer(size, type, stride, pointer) : arrayの元...
glVertexPointerは頂点データの場合だが,その他に同様の関数...
|命令名|size|type|
|glVertexPointer(size, type, stride, pointer)|2,3,4|GL_SH...
|glColorPointer(size, type, stride, pointer)|3,4|GL_BYTE,...
|glSecondaryColorPointer(size, type, stride, pointer)|3|...
|glIndexPointer(type, stride, pointer)|1|GL_UNSIGNED_BYTE...
|glNormalPointer(type, stride, pointer)|3|GL_BYTE, GL_SHO...
|glFogCoordPointer(type, stride, pointer)|1|GL_FLOAT, GL_...
|glTexCoordPointer(size, type, stride, pointer)|1,2,3,4|G...
|glEdgeFlagPointer(stride, pointer)|1|-|
-glDrawArrays(mode, first, count) : arrayのfirstからfirst...
ちなみにarray内の1要素のみを描画したい場合はglArrayElemen...
#code(C){{
glBegin(GL_POINTS);
for(int i = 0; i < n; ++i){
glArrayElement(first+i);
}
glEnd();
}}
-glDisableClientState : arrayをdeactivate.
*glDrawElements [#c8fd5275]
ポリゴンデータの表現には通常,頂点列とその幾何構造を用い...
そのようなデータの描画時にはglDrawElements()を用います.
#code(C){{
GLdouble vertices[] = { 0, 0, 0, 1, 0, 0, 1, 1, 0, 0,...
GLuint indices[] = { 0, 1, 2, 0, 2, 3 };
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_DOUBLE, 0, vertices);
int num_of_indices = sizeof(indices)/sizeof(GLuint);
glDrawElements(GL_TRIANGLES, num_of_indices, GL_UNSIGNED...
glDisableClientState(GL_VERTEX_ARRAY);
}}
indicesのある範囲だけ使いたい場合は,glDrawRangeElement(m...
また,複数のindicesをまとめて指定したい場合は,glMultiDra...
*Interleaved array [#v06bfa67]
1つのarrayに複数の種類のデータ(e.g. ColorとVertex)を含め...
glInterleavedArraysが使えます.例えば,頂点の色と座標の場...
#code(C){{
GLfloat col_and_vert[] = { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 5.0, 0.0, 0.0,
0.0, 0.0, 1.0, 5.0, 5.0, 0.0 };
glInterleavedArrays(GL_C3F_V3F, 0, col_and_vert);
glDrawArrays(GL_TRIANGLES, 0, 3);
}}
col_and_vertには{頂点1の色,頂点1の座標,頂点2の色,頂点2...
glInterleavedArraysの第一引数は配列の型と並びを指定します...
glVertexPointerに対応する3要素のfloatが並んでいることを示...
このほかにも,GL_V2F, GL_V3F, GL_C4UB_V2F, GL_C4UB_V3F, G...
が指定できます.UBはGL_UNSIGNED_BYTE,Tはテクスチャ座標に...
また,構造体を用いると,
#code(C){{
struct Vertex
{
GLfloat color[4];
GLfloat normal[3];
GLfloat vertex[3];
};
vector<Vertex> inter_array;
inter_array.resize(N);
...
glInterleavedArrays(GL_C4F_N3F_V3F, 0, &inter_array[0]);
glDrawArrays(GL_TRIANGLES, 0, N);
}}
値の格納にはCの配列ではなくSTLのvectorを用いました.
vectorは&inter_array[0]を渡すことで配列と互換性を持ってい...
ページ名: