4

グラフィックス プログラミングでは、頂点フォーマットを扱うことは非常に一般的です。これについては、たとえばここで説明されています。

ただし、未定義の動作を呼び出さない方法を探しています (主に 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 バイトとして書き込んだりするよりも、言う方がずっといいです。

これを行うための優れたポータブルな方法はありますか?

4

1 に答える 1