-1

パーティクル システム レンダラーを作成しています。問題は、すべてのパーティクルの位置が、時間をかけて統合し、他の処理を行うクラスにカプセル化されていることです。値を個別の配列にコピーして各フレームをレンダリングする代わりに、すべての値を一度に指すために使用できる次のようなポイント構造体を作成しました。

typedef struct
{
    float *x, *y, *z;
} point;

次に、これらの配列を、粒子の配列と同じサイズで malloc します。

上部の宣言:

point *points;

マロク:

points = malloc(sizeof(point) * [particles count]);

次に、すべてのパーティクルをループして、各位置のアドレスを対応するポインターにコピーします。

for (int i = 0; i < [particles count]; ++i)
{
    points[i].x = &[[particles objectAtIndex:i] getPosition].x;
    points[i].y = &[[particles objectAtIndex:i] getPosition].y;
    points[i].z = &[[particles objectAtIndex:i] getPosition].z;
}

私の位置取得関数は、ベクトル構造体 (float x、y、z) を返すだけです。

これで最初に遭遇した問題は、次のように値を表示するときです。

 NSLog(@"%f", *points[0].x);

値を読み取る代わりに (例: 0.5)、丸めて否定した値 (つまり -1.0) を表示します。

次に、次のように VBO にデータを取得します。

 glBufferData(GL_ARRAY_BUFFER, sizeof(point) * [particles count], &points[0], GL_DYNAMIC_DRAW);

これも間違っていると思いますが、ポインターを VBO に渡す方法に関する情報が見つかりません。

4

1 に答える 1

0

C ではすべてが値渡しされるため、あなたがしていることは間違っています。そのため、返された構造体の.xメンバーを逆参照すると、position 構造体のコピーでそれを実行しているため、スタックからポップされます。どの値にも割り当てられていません。

設計が間違っています。次のような構造体は必要ありません。

typedef struct
{
    float *x, *y, *z;
} point;

むしろこのようなもの:

typedef struct
{
    float x,y,z;
}

元の構造体の値が変更された場合にこの構造体も変更されるように、元の値に割り当てたい場合は、構造体へのポインターを返し、ポインターを保持するゲッターが必要です。

points[i] = [[particles objectAtIndex:i] getPositionPointer];

このようにして、構造体に元の構造体と同じ値が含まれていることを確認できますが、カプセル化に違反しています。これにより、元の構造体へのポインターを保持する必要はあまりないのではないかと思いますが、そうする理由がある場合は、その方法を示しました。

于 2013-06-22T11:54:13.367 に答える