web-dev-qa-db-ja.com

OpenGLでモデルビューと射影行列をどのように取得しますか?

OpenGLシェーディング言語(GLSL)バージョン1.5を使用して、頂点シェーダーとジオメトリシェーダーを作成しようとしています。

GLSLバージョン1.5では、_gl_ModelViewProjectionMatrix_のような組み込み変数は非推奨であるため、手動で渡す必要があることを学びました。モデルビューと投影行列を既に設定している場合(gluLookAtgluPerspectiveを使用するなど)、行列を取得して頂点シェーダーとジオメトリシェーダーに渡すにはどうすればよいですか?私はいくつかの検索を行っており、一部のサイトでは関数glGetMatrix()について言及しているようですが、公式ドキュメントではその関数を見つけることができず、使用している実装に存在しないようです(その関数でコンパイルしようとすると、コンパイルエラー_unknown identifier: glGetMatrix_が発生します)。

27
Alex319

ちょっと、ここで少し遅くしましょう:)はい、それはglGetFloatv(GL_MODELVIEW_MATRIX, ptr)...によってマトリックスを受け取ることは事実ですしかし、それは間違いなくここで行うべきことではありません!

説明させてください:

GLSLでは、_gl_ModelViewProjectionMatrix_のような組み込み変数またはftransform()のような関数は非推奨です-そうです、それはマトリックススタック全体がGL 3.xそして、あなたはあなた自身のマトリックススタックを使用することになっています(または他の解決策を使用してください、マトリックススタックは役に立ちますが義務ではありません!)。

それでもマトリックススタックを使用している場合は、OpenGL 2.xまたは1.xの機能に依存しています。 GL互換性プロファイル-新しいバージョンGL=に切り替えることをお勧めしますが、とりあえずこれでいられます。

しかし古いバージョンのOpenGL(マトリックススタック付き)を使用している場合は、古いバージョンのGLSLも使用してください。 1.2を試してください。より高いバージョン(1.5を含む)はOpenGL3と互換性があるように設計されているため、投影やモデルビューマトリックスなどはOpenGLに存在せず、必要に応じてカスタムのユーザー定義uniform変数として明示的に渡されることが期待される場合。

OpenGLとGLSLのバージョン間の対応は、以前は(バージョン番号を一致させるためにクリーンアップする前に)少しトリッキーでしたが、多かれ少なかれ次のようになります。

_GL    GLSL

4.1 - 4.1
4.0 - 4.0
3.3 - 3.3
3.2 - 1.5
3.1 - 1.4
3.0 - 1.3
2.x and lower - 1.2 and lower
_

つまり、要するに、OpenGLの対応する機能も廃止されたため、シェーダーの組み込みのユニフォームは廃止されました。 OpenGLの上位バージョンまたはGLSLの下位バージョンのいずれかに進みます。

59
Kos

いずれかの行列を取得するには、glGetxxxxで定数GL_MODELVIEW_MATRIXまたはGL_PROJECTION_MATRIXを使用します。

GLfloat model[16]; 
glGetFloatv(GL_MODELVIEW_MATRIX, model); 
10
ergosys
float modelview[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);
1
Andreas Brinck