グラフィックス プログラミングでは、頂点フォーマットを扱うことは非常に一般的です。これについては、たとえばここで説明されています。
ただし、未定義の動作を呼び出さない方法を探しています (主に C++ の情報を探していますが、C も問題ありません)。
一般的な方法は次のとおりです。まず、頂点フォーマットを構造体として宣言します。
struct Vertex {
float x;
float y;
uint16_t someData;
float etc;
};
次に、これらの配列を作成して入力し、グラフィック API (例: OpenGL) に送信します。
Vertex myVerts[100];
myVerts[0].x = 42.0;
// etc.
// when done, send the data along:
graphicsApi_CreateVertexBuffer(&myVerts[0], ...);
(余談ですが、API に形式を伝える部分はスキップしました。API が認識していると仮定します)。
ただし、グラフィックス API には構造体に関する知識がありません。次のような、メモリ内の一連の値が必要なだけです。
|<--- first vertex -->||<--- second vertex -->| ...
[float][float][u16][float][float][float][u16][float] ...
また、パッキングとアラインメントの問題によりmyVerts
、メモリ内でそのようにレイアウトされる保証はありません。
もちろん、多くのコードがこのように書かれており、移植性はありませんが動作します。
しかし、これを行うためのポータブルな方法はありますか
1. Inefficient
2. Awkward to write
?
これは基本的にシリアル化の問題です。参照: buffer を構造体として解釈するための、移植可能な正しい方法
私が知っている主な標準準拠の方法は、メモリを として割り当てることchar[]
です。次に、すべてのバイトを希望どおりに配置するだけです。
しかし、struct Vertex
上記の表現からその表現に変換char[]
するには、追加のコピーが必要になります (そして、バイトごとの遅いコピーが必要になります)。それでは非効率です。
別の方法として、表現にデータを直接書き込むこともできますがchar[]
、これは非常に厄介です。verts[5].x = 3.0f
バイト配列にアドレス指定したり、float を 4 バイトとして書き込んだりするよりも、言う方がずっといいです。
これを行うための優れたポータブルな方法はありますか?