頂点配列について

vertexarray.png
  1. glEnableClientStateで配列を有効化する
  2. 配列のためのデータを渡すglVertexPointer
  3. 参照先のデータを取得してレンダリングする

もしかして、1.でenableする順番も、直接書くときみたいに。法線、テクスチャ座標、頂点座標の順じゃなきゃいけないのかな。

initで使うもの。

Step1.Enableにする

  • glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  • glEnableClientState(GL_VERTEX_ARRAY);

Step2.配列のデータを渡す

OpenGL ES2
glInterleavedArrays(GL_T2F_V3F,stride(何バイト?),cubeVerticesForQuads); X
glVertexPointer(xyzの数(2~4),GL_FLOAT,stride(何バイト?),vert_array);1
glColorPointer(rgbの数(3 or 4),GL_FLOAT,stride(何バイト?),&vert_array[3]);

glArrayElement
glColorPointer
glEdgeFlagPointer,
glFogCoordPointer
glIndexPointer
glInterleavedArrays
glMultiDrawArrays
glMultiDrawElements
glNormalPointer
glSecondaryColorPointer
glTexCoordPointer
glVertexAttribPointer
Copyright

display()で使うもの

インデックスを使う インデックス使わない
配列の要素一個だけ glArrayElement(何番目)
配列の要素のうち何個か glDrawElements(タイプ、インデックスの数,インデックスの型,インデックス配列); glDrawArrays(タイプ,頂点の始まる箇所,何個の頂点を描くか?);
同じ配列を違うふうに何回か使う glMultiDrawElements()2 glMultiDrawArrays()3
glDrawRangeElements()4

インデックスの型はGL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT,GL_UNSIGNED_INTのいずれかでなくてはならない。
速度的におすすめは、インデックスをつかったglDrawElements

色と頂点を一緒の配列で使いたい時は?

こんな配列にしたとする。

float vert_array{x,y,z,r,g,b,a};
glVertexPointer(3,GL_FLOAT,7*sizeog(float),vert_array);
glColorPointer(4,GL_FLOAT,7*sizeog(float),&vert_array[3]);

glInterleavedArrays]がいいかも

エラー

ポリゴンを描いた時、原点から無限遠へ変な板が飛び出る。

strange_plate.jpg
glDrawArrays(GL_QUADS,gTex[i].mPlaneId*4,4);//の三番目の引数が、実際の頂点の数よりも多すぎた。

glDrawArrays(タイプ,頂点の始まる箇所,何個の頂点を描くか?);
3番目の引数、たとえ頂点配列が頂点1こにつき、何個のデータを持っていようとも関係なく、頂点の個数を指定する。
たとえばGL_QUADSの場合は4の倍数じゃないと変な描画結果になるってこと。

glDrawArraysのGL_INVALID_OPERATION

GL_INVALID_OPERATION is generated if a non-zero buffer object name is bound to an enabled array and the buffer object's data store is currently mapped.

頂点インデックスを使う

gl.glDrawElements(GL10.GL_POINTS, mValidPointNum,GL10.GL_UNSIGNED_SHORT,makeShortBuffer(mIndices, mValidPointNum));
mIndicesがshort型でも、GL10.GL_UNSIGNED_SHORTにしなければならない。GL10.GL_SHORTだと何も見えなくなってしまう。要注意!

性能をしらべる

glGetIntegerv(GL_MAX_ELEMENTS_VERTICES);
glGetIntegerv(GL_MAX_ELEMENTS_INDICES);


vbo

サポートサイト Wikidot.com vbo