この質問の短いバージョン: クラスの最初のデータ メンバーへのポインターは、そのすべてのデータ メンバーへのポインターになりますか?
討論:
私はいくつかのサンプル コードを読んでいますが、これは興味深いものです。特定の関数 (この場合はglUniformMatrix4fv
OpenGL の C 関数) がパラメーターとして配列を受け取る場合、次のように、配列の最初の要素のアドレスへのポインターを使用する一般的な C の方法で渡されます。
glUniformMatrix4fv(glvariable, 1, 0, &newmatrix[0]);
// newmatrix を参照
この開発者は、合計 16 個の float の 4X4 マトリックスを作成するための C++ クラスを持っています。ただし、そのクラスのデータ メンバーは、それぞれ 4 つのデータ メンバーの 4 つの個別のベクトルに分割されます。
クラスのデータメンバーは次のとおりです。
vec4 x;
vec4 y;
vec4 z;
vec4 w;
このvec4
クラスは、次のデータ メンバーを提供します。
T x;
T y;
T z;
T w;
vec4 x
次に、最初のデータ メンバーだけを指す関数を作成します。
const T* Pointer() const
{
return &x.x;
}
vec4
そしてどういうわけか、これは奇跡的に 4 つのオブジェクトすべてとそれぞれの 4 つのコンポーネントを送信することに変換されます。
glUniformMatrix4fv(modelviewUniform, 1, 0, modelviewMatrix.Pointer());
私は C++ にかなり慣れていませんが、データ メンバーを 1 つだけ指定して、残りのすべてのメンバーも同様に送信されることを期待できることに驚きました。クラスが特定の順序でそれらを定義しているためですか?クラス定義で別の順序で定義されていたらどうなるでしょうか?