1

OpenGLには、BufferData(int array[])wherearrayの形式などの関数がありますx-y-z x-y-z ...

これは単に整数のシーケンスであり、連続する各3タプルが頂点として解釈されます。

これをstd::vectorとして表すのは安全ですか?ここで、頂点は次のように宣言されます:

struct vertex
{
  int x, y, z;
};

私の意見では、これにより、何が起こっているのかが意味的に明確になります。しかし、これが機能することを保証することは可能ですか?

そうでない場合、データのよりセマンティックな表現を提供する他の方法はありますか?

4

2 に答える 2

2

動作する可能性はありますが、信頼性は高くありません。構造体のメンバー間に名前のないパディングが存在する可能性があるため、正しく整列されていることを保証できません。

std :: vectorを使用するだけの何が問題になっていますか?このメモリは、標準によって正しく整列され、シーケンシャルであることが保証されています。

たとえば、次を使用できます。

std::vector<int> cord(3,0);
BufferData(&cord[0]);

[編集]MoingDuckポインターを出力するには、3つのセットが1つ以上必要です。その場合は、ベクトルを拡張するだけです。

3intの3タプル

std::vector<int> cord(9,0);
BufferData(&cord[0]);
于 2011-10-14T23:48:01.373 に答える
0

構造体メモリは、コンパイル命令を使用してパックできます

#pragma pack(push,1)
struct vertex
{
int x,y,z;
};
#pragma pack(pop,1)

ベクターはデータを継続的に保存します。これは、次の簡単なプログラムを使用して確認できます。

#include <iostream>
#include <vector>

using namespace std;
#pragma pack(push,1)
struct vtx
{
    int x,y,z;
};
#pragma pack(pop,1)

main()
{
    vector<vtx> v(3);
    v[0].x=v[0].y=v[0].z=1;
    v[1].x=v[1].y=v[1].z=2;
    v[2].x=v[2].y=v[2].z=3;
    int *p=&v[0].x;
    for(int i=0;i<9;i++) cout<<*p++<<endl;
}

出力は次のようになります:1 1 1 2 2 2 3 3 3

だから答えはイエスです。

于 2011-10-15T00:33:14.530 に答える