2017-03-22 3 views
0

私は頂点ごとに6バイトに走るいくつかのパックされた頂点データを持っている:GLES2.0 glVertexAttribPointer:奇数ストライド値とオフセット値を使用するとパフォーマンスが低下しますか?

glVertexAttribPointer Shader.pos3d_loc, 3, GL_UNSIGNED_BYTE, True, 6, 0 
glVertexAttribPointer Shader.norm_loc, 3, GL_UNSIGNED_BYTE, True, 6, 3 

は4バイトの倍数ではありません進歩とオフセットを使用することによって誘発される任意のパフォーマンスの低下(例えば隠されたメモリコピーが)ありますか?

+0

この時点でコピーは行われません。データを頂点バッファにコピーするか、必要に応じて値が1つずつアクセスされます。これらの値は、OpenGLにバッファの解釈方法を伝えるためのものです。例えば、normal [i] .x =(float)((ubyte)((void *)ptr)[stride * i]))ここで、ubyteはGL_UNSIGNED_BYTEパラメータから来たものです。 –

+0

ありがとう:)私は関数が何をしているのか理解していますが、かなりのパフォーマンスコストでGLが内部的にデータを変換するいくつかのアラインメントとフォーマット関連の問題があります。奇妙なストライドとアラインメントを指定するとGLが最終的なレンダリングコールが発生したときにデータを内部的に再バッファリングするかどうかを疑問に思った。 – Peeling

答えて

0

短い答えは「それが依存」です:

PCと(少なくとも一部)のAndroidデバイスでは、しっかりとこのように3成分の属性を梱包する識別可能なペナルティはありません。

IOSでは(とにかくこれを書いていると)大きなパフォーマンス上のペナルティがあります。 IOS GLの実装は、4バイト整列ではない属性を内部的にアンパックして整列させ、メモリとCPUヒットの両方を引き起こします。ダイナミックVBOで作業している場合を除き、CPUヒットは目立たないかもしれません。

関連する問題