非即時OpenGLではアニメーションはどのように処理されますか?


8

私は現代のOpenGLの初心者です。私は当面のOpenGL方法論に慣れていますが、VBOを真剣に使用したことはありません。私の質問はアニメーションについてです。即時モードでは、アニメーションを実現するには、オブジェクト空間で(キーフレームから補間された)異なる頂点位置をストリーミングする必要があります。

非イミディエートOpenGLでこれをどのように実現しますか?当然のことながら、フレームごとに新しいVBOデータをアップロードすると、グラフィックバスが占有されます。私はそれを行うための現代的な方法についての文献を見つけていません。それについて考えて、私はいくつかのオプションに行きました:

  • 属性: 3Dオフセットとしてのアニメーション。フレームごとに、異なる(可能な補間された)オフセット属性が各頂点に渡され、各キーフレームの同じ頂点に適用されます。
  • インデックス:キーフレームを絶対的な頂点として格納し、キーフレームごとに異なる頂点のセットを使用して、インデックスを介してそれらにアクセスします。隣接するキーフレームにアクセスできないため、キーフレーム間を補間できないため、このアプローチは不可能です。また、手続き型アニメーションでは悪い考えのようです。
  • テクスチャ:これは非常に伸縮性があるかもしれませんが、私にとっては良い解決策のように聞こえます。この場合も、アニメーションは各頂点のxyzオフセットと見なされます。各キーフレームは、次元が頂点IDにマップされる1Dテクスチャに保存できます。私が間違っていない場合、OpenGL 4.0では、任意のシェーダーからテクスチャにアクセスできるため、このテクスチャを頂点シェーダーから読み取って、各頂点変換を適用できます。2Dテクスチャは複数のフレームを保持できます。引き続き補間を実行します(そして、補間がフラグメントシェーダーの外側のテクスチャに対して機能する場合、確信が持てませんが、線形補間を無料で行うことができます!)これは、骨のアニメーションなどのより複雑なアニメーションシステムにそれほど労力をかけずに適用できます。

私はこれを考えすぎていますか?誰かが光を当てることはできますか?

回答:


5

私はそれを行うための現代的な方法についての文献を見つけていません。

これは一般に、キャラクターアニメーションを作成する「モダンな方法」は、頂点のブレンドではなく、骨格の骨の重み付けを使用するためです。

ただし、頂点ブレンドベースのアニメーションを主張する場合は可能です。最も簡単な方法は、ブレンドしたい2つのキーフレームを属性として送信することです。さまざまなキーフレームすべての位置データがあります。特定のキーフレームを選択するためにglVertexAttribPointer(またはglVertexPointer主張する場合)を使用します。各キーフレームの位置データは(対応する位置について)同じ順序で格納されている必要があるため、レンダリングに同じインデックスリストを使用できます。

シェーダーは2つの「位置」属性を取得します。1つは現在の時間の前のキーフレーム用、もう1つは後のキーフレーム用です。また、それらの間で行うブレンドの量を指定するユニフォームを渡します。2つのキーフレーム間のブレンドとして新しい位置を計算し、そこから通常の変換を行います。


骨格の骨の計量を処理するためのコードの記述について学習を始めるために読むべき推奨される本または記事はありますか?
michael.bartnett 2011

実際のアニメーションではなく、「頂点の移動方法」を探していました。まあ、それは骨格の骨の重み付けとそれほど変わらない、結局のところ、それは動き回る頂点、つまり事前計算された(頂点ブレンド)またはオンザフライの骨の重み付けに帰着する。属性はまだ行く唯一の方法ですか?テクスチャベースのアプローチはまだ実現可能ではなく、各頂点の多くのデータをフレームごとに渡すよりも高速ですか?(少なくともボーンごとのキーフレームとブレンドファクターの両方)テクスチャは引き続きボーンの回転をエンコードでき、テクスチャのルックアップは属性を渡すよりもはるかに高速です。
kaoD 2011

また、「各キーフレームには位置データが格納されている必要があるため[...]、レンダリングに同じインデックスリストを使用できます。」それは不可能ではないですか?2つのインデックスにアクセスしてそれらの間を補間するにはどうすればよいですか?頂点シェーダーは他の頂点に気づいていないのではなく、さらに他のインデックスに気づいていませんか?
kaoD 2011

@kaoD:不可能?新しい頂点の位置を計算するために現在行っていることではありませんか?各キーフレーム配列の各位置について、それらをブレンドしてOpenGLに書き込みます。私が言っているのは、それらのキーフレーム配列をOpenGLに提供し、シェーダーにブレンドを行わせることだけです。テクスチャルックアップに関しては、「シェーダーの高速機能」の階層では、テクスチャルックアップは通常最下部にあります。属性は多かれ少なかれ無料です。
Nicol Bolas

@NicolBolas:テクスチャのルックアップが思ったよりも遅いことを知っておくと良いでしょう。不可能なことですが、私が間違っていない場合、各頂点はシェーダーで自分自身を「見る」ことができるだけであり、したがって、他の頂点にインデックスを付けたり、他の配列(キーフレーム)にアクセスしたりすることはできません。これらの2つのキーフレーム位置を各頂点の属性として、ブレンドファクターのユニフォームと共に渡す必要がありますが、頂点配列はありませんか?現在のキーフレームを頂点配列として使用し、次のフレームを属性配列として使用できることに気づきましたが、これはどういう意味ですか?
kaoD 2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.