1

これは、同じトピックを扱う 2 つの質問です。

私は最近、obj データからインターリーブされたインデックス バッファを作成する obj ローダーを作成しました。これは問題なく動作しますが、大きなモデルでは、このバッファ フォーマットの重要な部分が 一意でないインデックスはインデックス配列で複数回参照できるため、同じインデックス データを 2 回追加する必要はありません。問題は、インデックスが一意であるかどうかをテストするには、他のインデックス データに対してテストする必要があり、大きなファイルでは計算に数分かかる場合があることです。これをスピードアップする方法はありますか?一意のインデックス チェックをスキップする必要がありますか? または、このコードを使用して、obj に基づいて独自のファイルを作成し、データをプログラムに直接ダンプできるようにする必要がありますか?

将来的には、自分のプログラムにアニメーション要素を適用したいと考えています (ライブラリを使用して collada データをインポートします)。アニメーション化されたメッシュについて理解するのに苦労していますが、n の重みに基づいて、頂点は頂点シェーダー内で操作されるため、影響を受けるボーンを各インデックスに伝え、シェーダーで更新することはできませんか? それとも、プロセスを誤解していますか?

4

1 に答える 1

0

スローダウンが一意のインデックス チェックであると本当に確信している場合は、前処理コードでその結果をバイナリ データとして OBJ ファイルの代わりにロードするファイルに書き出すことをお勧めします。コードをコマンドライン ユーティリティに前処理し、結果のファイルをプロジェクトに配置し、NSData を使用してその内容を取得し、VBO をデータに設定します。コードがなければ、高速化できるかどうかを判断するのは困難です。どのようにチェックを実行しますか? おそらく辞書を使用して、各チェックで O(1) ルックアップを取得できます。または、ジオメトリが非常に大きい場合は、マルチスレッドが役立つでしょう。

骨格アニメーションがシェーダーで一般的にどのように実装されているかについては正しいです。以下は、私が書いたシェーダーのコードで、役立つかもしれません。16 個のボーンのみをサポートし、各ポイントに影響を与えることができるのは 3 個のボーンのみであることに注意してください。

私が知る限り、Web 上で最高の COLLADA アニメーション チュートリアルはこれ ( http://www.wazim.com/Collada_Tutorial_1.htm ) ですが、著者の英語は最高ではなく、彼のコードは C++ と C# です。影響に関しては、おそらくそれを頂点属性にして、インターリーブされた VBO に追加します。

uniform mat4 modelViewProjectionMatrix;
attribute vec3 boneWeights;
attribute vec4 position

void main()
{

vec4 animatedPosition;
animatedPosition = ((position * boneMatrices[int(boneIndex[0])])) * boneWeights[0];
animatedPosition += ((position * boneMatrices[int(boneIndex[1])])) * boneWeights[1];
animatedPosition += ((position * boneMatrices[int(boneIndex[2])])) * boneWeights[2];
gl_Position = modelViewProjectionMatrix * animatedPosition;   
}
于 2013-10-09T04:15:37.410 に答える