OpenGLの数学関数は最高のものではありませんでした。新しい標準OpenGL 3(4、ES)の出現により、数学はまったくなりませんでした。 そして、最も面倒なのは、彼らが私たちに見返りを与えなかったことです。 シェーダープログラミングの自由が無限にある状況で、キューブとハンモックをねじる方法を教えてください。
3D空間での変換を伴うほとんどすべての操作は、マトリックスとベクトルの使用が原因で発生することを思い出させてください。 そして、すべてglRotate、glScale、glTranslateなど。 マトリックスの形成にすぎません。 次に、1つまたは異なる行列の積にベクトルを掛けて、適切な場所に到達します。
これに関して、頭に浮かぶ最初の解決策は、行列とベクトルを操作するための独自のライブラリを書くことです。 自転車の発明は良いことですが、常に感謝しているわけではありません。バグ、間違ったアプローチなど。 2つ目は、既製のライブラリを使用することです。 ここで疑問が生じます-そして、どれですか? マトリックス変換の通常のライブラリは一般的なケースで動作するため、動作が遅くなります。 3x3および4x4マトリックスを操作するために最適化されたライブラリが必要です。 そのようなライブラリの候補はGLMです。
ここを取るには: glm.g-truc.net
ライブラリの主な利点は、サイトの最初のページの見出しに「GLSL +オプション機能= OpenGL数学(GLM)」というフレーズで説明されているように思えました。 つまり、ライブラリの構文と機能はGLSL(OpenGLのシェーダー言語)に似ていますが、ライブラリ機能のリストを拡張する「オプション機能」もいくつかあります。
また、ライブラリはすべての最新のC ++コンパイラと互換性があり、CUDAのようなものでも、接続時にライブラリやdllを指定する必要がないことにも注意してください。
ライブラリの内部は2つの部分に分かれています。最初の部分はglm.hppです。主要なタイプの説明が含まれています。2番目の部分はext.hpp拡張ライブラリです。 ドキュメントでは、拡張機能を個別に接続することを推奨していますが、特定のライブラリを示しています。
#include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp>
ライブラリ拡張はいくつかのグループに分けられます。
GTC-標準拡張バージョンまたはext.hpp(安定)ヘッダーに記載されているとおり
GTX-実験的な拡張機能。その結果は保証されており、ご自身の責任で使用してください。
VIRTREV-明らかに、入力/出力ストリームを介したマトリックスの出力に関連する何か
ライブラリはプラスになっているため、当然、glmと呼ばれる独自のネームスペースがあります。
公式マニュアルglm.g-truc.net/glm.pdfは、ライブラリについて非常によく説明しています。
ライブラリの使用方法を示すいくつかの例を次に示します。
#include <glm/glm.hpp> #include <glm/gtc/matrix_transform.hpp> void foo(){ glm::vec4 Position = glm::vec4(glm:: vec3(0.0f), 1.0f); glm::mat4 Model = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f)); Model = glm::rotate(Model,45,0,1,0); glm::vec4 Transformed = Model * Position; }
OpenGLでGLMを使用する別の例
#include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> using namespace glm; void foo(){ vec4 v(0.0f); mat4 m(1.0f); ... glVertex3fv(value_ptr(v)) glLoadMatrixfv(value_ptr(m)); }
1つの記事でライブラリのすべての機能を確認することは不可能です。 または多分それはたくさんあります、色と通常の数学関数さえ罪、cosで仕事があります。 そして、どんな種類のおいしいランダム性があります。
コードの品質を疑う人のために、ライブラリの中には特別な場合に最適化された非常に有能なコードがあることに注意してください。
行列に転送行列を掛ける例を次に示します。転送はベクトルによって与えられます。
template <typename T> GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate ( detail::tmat4x4<T> const & m, detail::tvec3<T> const & v ) { detail::tmat4x4<T> Result(m); Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3]; return Result; }
上記を要約すると、GLMは、CORE_PROFILEでコードを書く人にとっても、昔ながらの方法でOpenGLを扱う人にとっても価値のあるライブラリです。 このライブラリを使用することで、シェーダープログラミングの現代の標準に近づくことができ、コードをより効率的にすることができます。 数学的計算を完全に制御できるためです。