1

次のような構造体Point(たまたま Python 拡張機能) があります。

struct Point {
    PyObject_HEAD    // Macro that expands to include a few more members
    double x;
    double y;
};

そして、これらの束を 2 つの配列に保持する別の構造体があります。

struct Polygon {
    int length;
    Point **vertex_points;
    Point **texcrd_points;
}

これらを使用して、頂点配列を持つポリゴンの頂点とテクスチャ座標の両方をマップしたいと考えています。問題は、頂点配列が次の形式の配列を想定していることです。

[x, y, x, y, x, y, etc]

glVertexPointerandglTexCoordPointerPolygon->vertex_pointsandを呼び出す方法はありますPolygon->texcrd_pointsか、または gl*Pointer が期待するものと一致する新しい配列を作成する必要がありますか?

4

2 に答える 2

2

glVertexPointer頂点配列glTexCoordPointerのベース、およびテクスチャ座標配列のベースで呼び出すことができます。これらの配列内のものの数が頂点の正しい (同じ) 数に並んでいる限り、これは正常に機能するはずです。

OpenGL は構造体のメンバーに明示的にアクセスできません。メンバーはメモリ内で隣り合わせに配置されます (以下の警告を参照)。複数の Point 構造体がメモリ内のシリーズにある場合、事実上、double の大きなフラット リストがあります。OpenGL は構造体を認識せず、値の大きなリスト (この場合は double) を 1 つだけ必要とします。しかし、一連のポイントを構築し、OpenGL に最初のポイントへのポインターを渡すことができます。メモリ内のレイアウトが間違っていたり、パディングされていなければ、それらは同等になります。

C に慣れていないため、これを概念的に (メモリ レイアウトの警告とともに) 理解できない場合は、GL を呼び出す前に、すべての double を新しい配列にコピーする必要があります。

ここにコードが欠けている可能性がありますが、ここでは値のフラットな配列が期待されるため、Point**代わりにPoint*怪しいように見えます。glVertexPointer同様に、おそらくすでにうまく配置されていますが、理論的には、これらの構造体の配列はメモリ内で一緒にフラッシュパックされない可能性があります。コンパイラに応じてこれを明示的に行うかstride、GL 呼び出しのパラメーターを操作して、各頂点間のメモリ内の距離を明示的にすることができます。

于 2010-07-18T00:31:05.000 に答える
0

http://www.opengl.org/sdk/docs/man/xhtml/glVertexPointer.xml

http://www.opengl.org/sdk/docs/man/xhtml/glTexCoordPointer.xml

両方の関数のパラメーター 'size' はおそらく必要なものです (頂点には 2 つ必要です - struct Point と 'type'=GL_DOUBLE)

于 2010-07-18T00:29:16.707 に答える