2012-04-05 15 views
6

新しいOpenGLでは、マトリックススタックはありません。私はシンプルなディスプレイエンジンで作業しており、変換スタックを実装しようとしています。OpenGL:変換マトリックススタックの実装

ここでは一般的な戦略は何ですか?私はプッシュ/ポップスタックを構築し、それを私のモデルを表すツリーと一緒に使うべきですか?私はこれが新しい "OpenGL"バージョンでは廃止された "古い"アプローチだと思います。たぶんそれが最善の解決策は、(それが私には未知の、何らかの理由で削除された)

+0

*理由*説明を見ると面白いです。同様に新しい優先アプローチ。 – Kromster

答えて

7

は(それが何らかの理由で削除された)

は、それが原因で近代的な3Dアプリケーションでは、削除されたではありませんOpenGLマトリクス操作機能全体が非常に冗長でした。いずれの近代的な3Dアプリケーションでも行列を扱う必要があります。OpenGLは適切な行列数学ライブラリではないので、あなたはEigenやGSLのようなものを使うでしょう。

スタックはまだ非常に実行可能な構造です。

+0

ところで、私は 'mesa3d'のコードを使用します。数学の部分は簡単に抽出して再利用することができます –

2

私はこれを特に経験していませんが、かなりのグラフィックス/ゲーム開発を行っています。私は答えより多くのアイデアを持っています。私の意見では、glPushMatrixglPopMatrixのものは非難されています。多くの開発者がOpenGLではなく変換を完全に制御したいからです。だから私の考えは、行列のスタックは方法ではなく、むしろGL開発者自身が行列の世話をしたり、別のライブラリを使ってそれらを処理することになっているため、廃止予定ではないということです。

他の言葉で言えば、おそらく行列のスタックはおそらくあなた自身で行う必要があります。非推奨の機能を使用するか、外部ライブラリを使用する必要があります。

2

固定パイプライン機能は、本質的には修正されたため廃止されました。

新しいトリックやそのような一般的に必要な新しいOpenGL関数をサポートするため、要求された機能を継続的にサポートすることは、OpenGL APIのサイズを大きくし、ますます扱いにくくなることを意味します。

一方、ハードウェアはますます洗練されて強力になり、OpenGLによって完全に活用されていませんでした。したがって、プログラム可能なパイプラインが考え出された。

OpenGL3では、Kronosグループは固定パイプライン機能を「廃止」しました。これは、あまりにも多くのコードと非常に多くの才能が定着した固定パイプラインに投資したため、大きな決定を下しました。その結果、「コア」プロファイルと「互換性」プロファイルが導入されました。コアプロファイルには新しいプログラマブルパイプラインモデルが含まれ、互換性プロファイルにはコアに加えて固定機能のほとんどまたはすべてが含まれているため、アプリケーションはどちらのモデルも使用できます。

私たちは現在OpenGL 4.2までですが、互換性プロファイルはまだ存在しており、消えないという兆候はありません。要するに、古いモデルがアプリケーションプログラマには適していなかったため、非推奨の理由はありません。むしろ、のインプリメンターにとっては重い負担でした。実際のモデルは非常に健全であり、プログラム可能な機能を使用する多くのアプリケーション/開発者は、固定機能(glBegin、glEnd、行列スタック、変換呼び出しなど)の基本的な部分を再度暗示しています。

したがって、独自のマトリックススタックを実装してください。しかし、さらに良いアイデアが出たら、私たちと分かち合ってください:)

+1

それは本当にその音ではありません。ひどく非効率的で、マトリックススタックはまったく愚かです。 –

+0

が効率的ではない、わかりました。しかし、なぜ馬鹿? –

+0

彼らは愚かではありません...私たちはゲーム業界で常にそれらを使用しますが、それは通常、何らかの種類のシーングラフ階層によって処理されます。私たちは通常、マトリクスを結合してgpuに送信する最後の瞬間まで行列の代わりに四元数を使用しますが、行列のスタックは絶対に使用されていますが、単純な固定関数アプリケーションが典型的にはチュートリアルなど。 (そして、ええ、事実が2日後のことについてコメントしているのは、今日のヒップなことです) – Xoorath

2

これはあなたには役に立たないのかどうかは分かりませんが、私は2つのことを実装しました。最初はすべての通常のメソッドを持つ単純な行列スタッククラスで、2つ目はスタックベースのRAII構造で、中括弧で行列の変更をスコープできます。つまり、構造上、行列スタックへの参照を格納し、破壊時に行列を復元します前の状態にスタックバックします。したがって、次のように書くことができます:

さらに、これは特定の種類の変換の便宜のためです。一般に、メッシュのツリー構造で構成されたモデルでは、すべて相互に変換されていますが、モデルを実行する前にルートノードの行列を結合します。したがって、各メッシュにはローカル変換とグローバル変換があり、グローバル変換はそのメッシュのルートノードに対する実際の変換です。マトリックススタックを使う必要はありません。

残りの部分とは独立してメッシュの一部をアニメーション化したいのであれば、少し違うので、ローカルのトランスフォームを放棄するのではなく、保存します。