2012-01-03 14 views
0

私は、各整数は、バッファ内の特定の場所である必要があります(32バイト)のバッファの中にいくつかの整数値を配置する必要があります(私は、OpenGL VBOsのデータを使用するつもりです)。パッキングデータは、移植性

私が今やっているやり方は、醜いものです。すべてのコンテンツは、アドレスbuf2に置かれるはずです。問題に無関係なので、私がバッファに割り当てる値を見て気にしないでください。

uint32_t *const coords  = reinterpret_cast<uint32_t *>(buf2 + CoordDataOff); 
    uint16_t *const texcoords = reinterpret_cast<uint16_t *>(buf2 + TcoordDataOff); 
    uint32_t *const color  = reinterpret_cast<uint32_t *>(buf2 + ColorDataOff); 

    coords[0] = x + bearing[0]; // left 
    coords[1] = y + bearing[1] - 64*(tcoords[3] - tcoords[1]); // bottom 
    coords[2] = x + bearing[0] + 64*(tcoords[2] - tcoords[0]); // right 
    coords[3] = y + bearing[1]; // top 
    copy_n(tcoords, 4, texcoords); 
    *color = c.color; 

これを実現する方法はありますか?

答えて

2

バッファに各頂点のデータが含まれていますか?あなたはちょうどそれがTDATA

TData verts[100]; 
vert[0].coord[0] = x; 
vert[0].coord[1] = y; 
... 
FunctionToWriteToBuffer((void *)verts, sizeof(TData) * 100); 

または

TData *vert = (TData *)buf2; 

それ以上のあなたが持っているコード内の配列としてあなたのバッファを処理するのと同じくらい簡単になり、構造体

struct TData 
{ 
    uint32_t coords[4]; 
    uint16_t texcoords[4]; 
    uint32_t color; 
}; 

を生成することがありました

+1

あなたの 'struct'は' texcoorの前後に2バイトのパディングを挿入するでしょうds。 C++標準では、どこに指定されていません。明示的にパディングを追加することはできますが、OPの指定されていないメモリの制限があると、動作しない可能性があります。 –

+0

彼は1つのTDataしか持っていないようですが、TDataには4つのテクスチャがあります。 –

+0

申し訳ありません。#pragma pack()について考えていましたが、答えを入力していましたが、これを行うことが非常に重要です。貼り付けたコードの最後の行は、(CoordDataOff、TcoordDataOff、ColorDataOffの値に応じて)質問での使用には問題ありません。しかし、私はVBOに値を設定するいくつかの同様のコードがあると思います。同じ構造体を使用してバッファを読み書きすると、操作が簡単になります。 – noggin182

関連する問題