6

新しい OpenGL には、マトリックス スタックはありません。私は単純な表示エンジンに取り組んでおり、変換スタックを実装しようとしています。

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

4

4 に答える 4

7

(なぜか削除されました)

最新の 3D アプリケーションでは、OpenGL マトリックス操作機能全体が非常に冗長であったため、削除されました。いずれにしても、最新の 3D アプリケーションは行列を処理する必要があります。また、OpenGL は適切な行列数学ライブラリではないため、とにかく Eigen または GSL などの自作のものを使用します。

スタックは、依然として非常に実行可能な構造です。

于 2012-04-05T11:22:51.610 に答える
2

それがあなたに役立つかどうかはわかりませんが、私はこれのために2つのことを実装しました。1つ目はすべての通常のメソッドを備えた単純なマトリックススタッククラスで、2つ目はスタックベースのRAII構造であり、中括弧を使用してマトリックスの変更をスコープできます。つまり、構築時にマトリックススタックへの参照を格納し、破棄時にマトリックスを復元します。以前の状態にスタックバックします。だからあなたは書くことができます:

MatrixStack stack;

stack.push(rotate...)
stack.push(translate...)

{
    MatrixScope(stack);

    stack.push(rotate...)    
}

... back to previous stack state.

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

メッシュの一部を残りの部分とは独立してアニメートする場合は少し異なります。そのため、ローカルトランスフォームを破棄するのではなく、保存するのもそのためです。

于 2012-04-05T14:44:22.507 に答える
2

私は特にこれについてはあまり経験がありませんが、かなりの量のグラフィックス/ゲーム開発を行ってきました。私は答えよりもアイデアを持っています。私の意見では、多くの開発者は、OpenGL が変換を処理するのではなく、変換を完全に制御することを望んでいたため、 glPushMatrixandは推奨されません。glPopMatrixしたがって、私の考えでは、行列スタックが進むべき道ではないため、廃止されたのではなく、GL 開発者が行列を自分で処理するか、別のライブラリを使用してそれを行う必要があるためです。

言い換えれば、マトリックス スタックはおそらくまだ進むべき道です。自分で行うか、非推奨の機能を使用するか、外部ライブラリを使用する必要があります。

于 2012-04-05T11:24:55.403 に答える
2

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

新しいトリックなどをサポートするには、一般的に新しい OpenGL 関数が必要であり、要求された機能を継続的にサポートすると、OpenGL API のサイズが大きくなり、ますます扱いにくくなることが明らかになりました。

一方、ハードウェアはますます洗練され、強力になりつつあり、OpenGL では十分に活用されていませんでした。このようにして、プログラム可能なパイプラインが考案されました。

OpenGL3 では、Kronos グループが固定パイプライン機能を「非推奨」にしました。十分に確立された固定パイプラインに非常に多くのコードと多くの才能が投資されたため、これは大きな騒動を引き起こし、「コア」および「互換性」プロファイルを導入して、決定を部分的に後退させました。コア プロファイルには、新しいプログラマブル パイプライン モデルが含まれ、互換性プロファイルには、コアに加えてほとんど/すべての固定機能が含まれているため、アプリケーションはどちらのモデルも使用できます。

現在、OpenGL 4.2 に対応しており、互換性プロファイルはまだ存在しており、消える兆候は見られません。

要するに、非推奨の理由は、古いモデルがアプリケーション プログラマーに適していなかったからではありません。むしろ実装者の負担が大きかった。実際のモデルは非常に健全であり、プログラム可能な機能を使用する多くのアプリケーション/開発者は、固定機能 (glBegin、glEnd、マトリックス スタック、変換呼び出しなど) の基本的な部分を再実装していることに気付きます。

それでは、独自のマトリックス スタックを実装してください。しかし、もっと良いアイデアを思いついたら、私たちと共有してください:)

于 2012-04-05T11:25:11.813 に答える