頂点データを保存するための次の構造体があります。
struct Rz3DContourNode {
float x; //pos x
float y; //pos y
float z; //pos z
float nx; //normal x
float ny; //normal y
float nz; //normal z
};
頂点のリストを次のようにSTLベクトルに格納します。
std::vector < Rz3DContourNode > nodes;
これをOPEGLの頂点配列として使用しようとすると、inが正しくレンダリングされません。
glVertexPointer(3, GL_FLOAT, 12, &nodes[0]);
glDrawArrays(GL_POINTS,0,nodes.size());
そこで、次のようにポインタ演算を使用して値を確認しようとしました(OPENGLがデータを処理する方法を想定しています)。
float *ptr=(float*) &nodes[0];
for(int i=0;i<nodes.size();i++)
{
Rz3DContourNode confirmNode=nodes[i];
float x=*ptr;
ptr++;
float y=*ptr;
ptr++;
float z=*ptr;
ptr++;
//Confirm values !!! Do not equal ??
qDebug("x=%4.2f y=%4.2f z=%4.2f | nx=%4.2f ny=%4.2f nz=%4.2f
",confirmNode.x,confirmNode.y,confirmNode.z,x,y,z);
//Skip normal positions
ptr++;
ptr++;
ptr++;
}
構造体から値に直接アクセスする場合、値は等しくありません。
これは、構造体が値を連続して保存しないことを意味しますか?
[編集]12の代わりにsizeof()を使用すると、次のように問題が修正されることに気づきました。
glVertexPointer(3, GL_FLOAT, sizeof(Rz3DContourNode), &nodes[0]);
しかし、それでも、ハックがメモリ内を正しくトラバースしなかった理由がわかりません(qDebugが同じ値を出力しないのはなぜですか?)