10

私はメソッドの署名を調べていましglVertexPointer

void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer)

3番目の引数が何をするのかを理解するのを手伝ってくれる人はいますかstride?

stride私はそれについてグーグルで調べた後、この定義を得ました

Amount of bytes from the beginning of one element to the beginning of the following element. If you pass a zero as stride, it means they are tightly packed. If you have an array of floats, which contains vertices like this, x1,y1,z1,x2,y2,z2... and so on, you can set stride to either zero (as tightly packed), or 12 (3 floats*4 bytes each from the beginning of vertex one to the beginning of vertex two).

これはどういう意味ですか? 誰かが例を使って説明してくれると本当に助かります。

ありがとう。

4

1 に答える 1

19

単純なケースは、配列に頂点座標データのみが含まれている場合です。座標が 2 つしかないので、float が 6 つあるとします。

{x1,y1,z1, x2,y2,y2}

ポインター (4 番目のパラメーター) は、配列内の最初の頂点の先頭 (x1 を指すゼロ) を指します。ストライドは 12 にする必要があります。つまり、ある頂点から次の頂点に移動するには、OpenGL は 12 バイトずつ移動する必要があります (各頂点の 3 つの座標がそれぞれ 4 バイトを占めるため)。したがって、12 バイト移動することで、2 番目の頂点の始まりである x2 の場所に到達します。

配列には 1 種類のデータしか含まれていないため、これは密にパックされた例です。ストライドを 0 に設定すると、OpenGL は一度に 1 つの浮動小数点数で配列をうまく処理します。ただし、配列には座標データのみが含まれている必要はありません。配列内の座標と一緒に法線データとカラー データを格納することもできます。

{x1,y1,z1,nx1,ny1,nz1,r1,g1,b1,a1, x2,y2,z2,nx2,ny2,nz2,r2,g2,b2,a2}

これは密集していません。座標データは配列内で連続していません (法線値と色値で区切られています)。この場合、ストライドは 40 になります。1 つの頂点の先頭から次の頂点に移動するには、OpenGL は 40 バイト移動する必要があります: (座標データの 3 float + 通常データの 3 float + カラー データの 4 float) x float あたり 4 バイト。

于 2014-03-10T10:16:26.467 に答える