3

このクラスのインスタンスを glUniformMatrix に渡すことができるように、C++ カスタム マトリックス クラスを作成することは可能ですか? つまり、このクラスのインスタンスを頂点シェーダーに渡します。

この質問をするのは、コンピューター グラフィックスのコースを受講したときに、opengl および glsl シェーダー プログラミングのコード スケルトンが与えられたからです。コード スケルトンには、mat4 という名前のカスタム C++ 行列クラスがありました。このクラスには、多くのメソッドとユーザー定義のコンストラクターが含まれていました。ただし、glUniformMatrix へのパラメーターとして使用される mat4 のインスタンスと、このインスタンスは、頂点シェーダーで mat4 型に正しく変換されます。

将来的には、 GLM ライブラリを使用して、opengl コードと頂点/フラグメント シェーダーの間のインターフェイスを作成したいと考えていますが、glUniformMatrix に渡すことができるデータ型のルールとセマンティクスを理解したいので、この型のインスタンスが正しくなります。頂点シェーダーで均一の mat4 に変換されます。

この動作の鍵は演算子を定義することだと思います

operator GLfloat* (); 
operator const GLfloat* () const;

行列データ構造の先頭に戻りstatic_cast<const GLfloat*>(...)、すべての行列を列ごとに指すようにします。これは、GLMライブラリがどのように機能するかの大まかな流れですか?

4

1 に答える 1

3

さまざまなglUniformMatrx*fv()関数は、行列が一連のGLfloat値 (mat4 の場合は 16) であり、メモリに連続して配置されることを想定しているため、C/C++ の 1 次元または 2 次元の float 配列へのポインターを渡すと機能します。

GLM は次の 2 つのバリアントを使用します

glm::mat4 m;
glUniform4fv(location, 1, GL_FALSE, &m[0][0]);
// or
glUniform4fv(location, 1, GL_FALSE, glm::value_ptr(m));

彼らは、その操作を隠すための何らかのメカニズムを実装することを明示的に避けましたが、実装は簡単です.

于 2013-07-27T17:53:52.373 に答える