2016-04-23 11 views
3

最新のLudum Dareコンテストでは、テーマは形が変わっていたので、私の考えは幾何学的な形から別の形へ単純なモーフィングを伴いました。どのようにシェーダを使って1つの3Dオブジェクトを別の3Dオブジェクトに変形できますか?

私がしたことは、同じ頂点数を持つBlenderでいくつかのオブジェクトを作ったことでした。 OpenGLでは、私はオブジェクトごとに別々のVAOを作成し、 "モーフィング"オブジェクト用に1つの追加のVAO(ダイナミックドローアトリビュート付き)を作成しました。すべてのフレームは、プレーヤーがシェイプシェイプしている間に、現在のオブジェクトとターゲットオブジェクトの間の補間された頂点データをこの余分なVAOにアップロードしてレンダリングします。それ以外の場合は、オブジェクトの対応するVAOをレンダリングします。 モーフィングはこのように見えた:私はちょうど迅速かつ汚い何かをしたが、今少し時間があったので

Morphing shapes

(頂点がそう「滑らか」ではありませんモーフィング、異なる順序を持っている)

これはGPUにフレームごとに大量のデータをアップロードする必要があるため、これはこのプロセスを実行するうえで最適な方法ではないと思います。また、異なるモーフィング段階で複数のモーフィングオブジェクトを描画したいと思えば、スケーラビリティにもなりません。

このプロセスを改善するための最初のステップとして、これらの補間計算をシェーダに移動したいと思います。 私はおそらく、単一のVAO内のすべてのオブジェクトのデータを別々の属性に格納し、どのデータから補間するかを選択することができます。

しかし、何とか複数のオブジェクト/バッファをシェーダに送り、補間率の均一化を行い、次にシェーダで補間を行う方法はありますか?

+0

両方のオブジェクトを持つバッファを作成する – teivaz

+0

@teivazこれは、私が1つのモーフィングオブジェクトしか持たない場合の良い考えです。しかし、複数のオブジェクトを使用する場合は、最悪の場合、すべての組み合わせに対して複数のVAOを作成する必要があります。 – aslg

+0

パイプラインのテッセレーション部分には良い仕事があります。古典的なパイプラインにうまく収まらないものには、常にComputeシェーダとCUDA/OpenCL interopがあります。 – Drop

答えて

5

各頂点の複数の座標を保持するバッファを作成できます。通常は座標、法線、テクスチャ座標を持っています。座標1、座標2、座標3などがあります。次に、シェーダでは、使用することを示す一様な変数を設定できます。

2つの場合、ユニフォームは0から1になり、最初の座標にそれを掛けて2を乗じたものに(1.0 - 値)を加算するだけで簡単です。

次に、同じベースシェイプからメッシュを作成することをお勧めします。

また、法線を使用する場合は、法線がいくつかあり、それらの間にも法線を入れていることを確認してください。

このマイナスは、シェーダが行うより多くのデータをスキップするために必要なデータ量が増えるほど、フォームがたくさんある場合は最も優れた解決策ではない可能性があるということです。

関連する問題