OpenGLシェーディング言語(GLSL)バージョン1.5を使用して、頂点シェーダーとジオメトリシェーダーを作成しようとしています。
GLSLバージョン1.5では、_gl_ModelViewProjectionMatrix
_のような組み込み変数は非推奨であるため、手動で渡す必要があることを学びました。モデルビューと投影行列を既に設定している場合(gluLookAt
とgluPerspective
を使用するなど)、行列を取得して頂点シェーダーとジオメトリシェーダーに渡すにはどうすればよいですか?私はいくつかの検索を行っており、一部のサイトでは関数glGetMatrix()
について言及しているようですが、公式ドキュメントではその関数を見つけることができず、使用している実装に存在しないようです(その関数でコンパイルしようとすると、コンパイルエラー_unknown identifier: glGetMatrix
_が発生します)。
ちょっと、ここで少し遅くしましょう:)はい、それは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の下位バージョンのいずれかに進みます。
いずれかの行列を取得するには、glGetxxxxで定数GL_MODELVIEW_MATRIXまたはGL_PROJECTION_MATRIXを使用します。
GLfloat model[16];
glGetFloatv(GL_MODELVIEW_MATRIX, model);
float modelview[16];
glGetFloatv(GL_MODELVIEW_MATRIX, modelview);