2011-07-10 3 views
1

私はその中の3種類のデータを一つのバッファを使用する方法を理解する問題を抱えている、私は私のヴェール、テキスト、カラーデータについては、以下の構造を有する:VBOでstrideパラメータを使用するにはどうすればよいですか?

struct xyzf { 
    float x, y, z; 
}; 
struct xyf { 
    float x, y; 
}; 

struct vertype { 
    xyzf points[4]; 
}; 
struct textype { 
    xyf points[4]; 
}; 
struct coltype { 
    GLuint points[4]; 
}; 

struct buftype { 
    vertype vertex; 
    textype texcoord; 
    coltype color; 
}; 

その後、私は(しよう)以下でそれを使用します(私にはほとんど意味があります)方法:

glBindBufferARB(GL_ARRAY_BUFFER, mybufid); 
glVertexPointer(3, GL_FLOAT, sizeof(buftype), 0); 
glTexCoordPointer(2, GL_FLOAT, sizeof(buftype), (GLvoid *)sizeof(vertype)); 
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(buftype), (GLvoid *)(sizeof(vertype)+sizeof(textype))); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnableClientState(GL_COLOR_ARRAY); 

glDrawArrays(GL_QUADS, 0, indices); 

glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisableClientState(GL_VERTEX_ARRAY); 

glBindBufferARB(GL_ARRAY_BUFFER, 0); // unbind 

しかし、それは失敗し、その私はすべてをゼロにストライドとポインタを設定することで得たものよりも何かをレンダリングします。私がそれをすると、頂点データは正しくレンダリングされますが、テキスト/カラーは正しくありません。

glVertexPointer()などの最後のパラメータには、& data [0] .vertexを使用できません。これは、VBOを使用して以来、データがなくなっているため、そのメソッドは頂点配列でのみ機能します。

また、glDrawArrays()のカウント値がどのように機能するかわかりませんが、インデックスであると言うドキュメントを読んでいるので、クワッドには4が正しく表示されますか?しかし、4倍のカウントを4倍にすると、それは私の頂点の半分をレンダリングするだけです。何が起こっていますか? (私が8で掛け合わせるとすべてがレンダリングされます)

答えて

2

あなたは四分木ごとにデータをインタリーブしているようですが、少なくとも頂点ごとにインタリーブする必要があります。

あなたはこれに頂点レイアウトを変更した場合あなたのコードは、右のようになります。

xyz 
uv 
rgba 
xyz 
uv 
rgba 
xyz 
uv 
rgba 
xyz 
uv 
rgba 

よりもむしろ

xyzxyzxyzxyz 
uvuvuvuv 
rgbargbargbargba 
+0

いまいましいあなたは正しいです、そして今私は前にこれと同じ問題を抱えていた覚えています!これはまた、私が持っていたインデックスの問題を解決するようです。 – Rookie

関連する問題