0

C# で DirectX 9
を使用しています。動的 LOD アルゴリズムを使用しているため、すべての頂点をリスト (配列ではなく) に格納します。すべてがフレームごとに計算されるため、頂点はフレームごとに異なる可能性があります。

法線と照明を追加しようとするまで、すべて正常に動作します。
クラスではなく構造体のリストであるため、リストに頂点を追加すると法線を編集できないことがわかりました。したがって、「変数ではないため、blablaba の戻り値を変更できません」などのエラーが表示されます。
たとえば、これを実行しようとすると、機能しません。

vertices[i].Normal = new Vector3(0, 1, 0);

頂点をリストに追加するときに法線を追加する必要がありますが、完全なメッシュが得られるまで法線を計算することはできません。

そこで、新しいカスタム頂点タイプを作成し、それを構造体にする代わりにクラスにしました。構造体でない限り、directxはそれを受け入れないため、これも機能しません...

そこで、頂点のリストではなく配列で機能するようにしました。これにより、1 秒あたりのフレーム数が 1 未満になりました。Array.Resize を使用して、フレームごとに数百回配列のサイズを変更する必要がありましたが、それは気に入らなかったと思います。

おそらく、最終的なリストを配列に変換し、そこから法線を計算する必要があると考えているでしょう。頂点は特定の順序で追加されないため、これは機能しません。そのため、法線を計算できるように特定の頂点の近くにある頂点を知ることができません。

では、メッシュを構築した後に頂点に法線を与えることができる方法で頂点を保存するにはどうすればよいでしょうか?

4

1 に答える 1

1

C#vertices[i].Normal = new Vector3(0, 1, 0)では、その式は意図したとおりに動作しないため、記述できません。配列インデクサーとは異なり、インデクサーは指定された要素のコピーList<T>を返します。頂点が構造体であるため、頂点全体がコピーされます。リスト内にある実際の頂点ではなく、頂点の一時コピーを更新します。Normal

回避策は、リストから頂点を取得 (のコピー) し、更新してから (コピーを) 元に戻すことです。

var vertex = vertices[i];
vertex.Normal = new Vector3(0, 1, 0); 
vertices[i] = vertex;

残念なことに、この繰り返しのコピーを回避する簡単な方法はありません。

于 2012-01-30T03:40:35.230 に答える