最新のLudum Dareコンテストでは、テーマは形が変わっていたので、私の考えは幾何学的な形から別の形へ単純なモーフィングを伴いました。どのようにシェーダを使って1つの3Dオブジェクトを別の3Dオブジェクトに変形できますか?
私がしたことは、同じ頂点数を持つBlenderでいくつかのオブジェクトを作ったことでした。 OpenGLでは、私はオブジェクトごとに別々のVAOを作成し、 "モーフィング"オブジェクト用に1つの追加のVAO(ダイナミックドローアトリビュート付き)を作成しました。すべてのフレームは、プレーヤーがシェイプシェイプしている間に、現在のオブジェクトとターゲットオブジェクトの間の補間された頂点データをこの余分なVAOにアップロードしてレンダリングします。それ以外の場合は、オブジェクトの対応するVAOをレンダリングします。 モーフィングはこのように見えた:私はちょうど迅速かつ汚い何かをしたが、今少し時間があったので
(頂点がそう「滑らか」ではありませんモーフィング、異なる順序を持っている)
これはGPUにフレームごとに大量のデータをアップロードする必要があるため、これはこのプロセスを実行するうえで最適な方法ではないと思います。また、異なるモーフィング段階で複数のモーフィングオブジェクトを描画したいと思えば、スケーラビリティにもなりません。
このプロセスを改善するための最初のステップとして、これらの補間計算をシェーダに移動したいと思います。 私はおそらく、単一のVAO内のすべてのオブジェクトのデータを別々の属性に格納し、どのデータから補間するかを選択することができます。
しかし、何とか複数のオブジェクト/バッファをシェーダに送り、補間率の均一化を行い、次にシェーダで補間を行う方法はありますか?
両方のオブジェクトを持つバッファを作成する – teivaz
@teivazこれは、私が1つのモーフィングオブジェクトしか持たない場合の良い考えです。しかし、複数のオブジェクトを使用する場合は、最悪の場合、すべての組み合わせに対して複数のVAOを作成する必要があります。 – aslg
パイプラインのテッセレーション部分には良い仕事があります。古典的なパイプラインにうまく収まらないものには、常にComputeシェーダとCUDA/OpenCL interopがあります。 – Drop