私は現在、より多くのアニメーションモデルを便利にレンダリングできるフレームワークを開発しています。
モデルは、骨の単純な階層として編成され、ルートは胴体/骨盤です。通常、次のようになります。
したがって、擬似コードとして、私は現在、次のようなモデルをレンダリングしています。
RenderBone(Bone b, Mat4x4 currentTransform){
Mat4x4 pos = currentTransform * b.boneTransform;
SetUniform("transformation", pos);
Draw(bone.mesh);
for each Bone bc in b.children do{
RenderBone(bc, pos);
}
}
したがって、n個のボーンを持つモデルを使用する単一のアクターの場合、n個のSetUniform(テクスチャの設定などはカウントされません)とn個の描画呼び出しが必要です。
そのオーバーヘッドを減らし、同じモデルを使用してすべてのアクターを一度にレンダリングしようとして、インスタンス化されたレンダリングに切り替えることを考えました。
ただし、私が見つけたすべての情報とチュートリアルは、立方体、球体、または同様の単純なオブジェクトの描画に関するものです。インスタンス化された描画を使用して、各パーツ(ボーン)がシェーダーに異なる変換行列を与える必要があるモデルをレンダリングする方法について、簡単でわかりやすい情報をどこにも見ることができませんでした。
したがって、問題:glVertexAttribDivisor
またはgl_InstanceID
を使用すると、インスタンス関連のマトリックスのみを指定でき、ボーンで実現されたマトリックスは指定できません。では、どうすれば骨の変形を適用できますか?
私が考えることができる唯一の実行可能な解決策は、モデル全体をインスタンス化する代わりに、各ボーンをインスタンス化できることです。したがって、あるボーンタイプ、次に別のボーンタイプのすべてのインスタンスを描画します。しかし、それでも、変換行列を使用してバッファを比較的頻繁に更新する必要があり、それはより多くのハウスキーピングコードです。
それで、これは最良の選択肢ですか?または、より一般的には、それほど複雑ではないレンダリング方法がありますか?または、インスタンス化されたレンダリングは、静的ジオメトリで使用する場合にのみ実際に輝きますか?