3

3Dモデル(つまり、三角形メッシュ)の描画を処理するクラスをC ++で作成していますが、データバッファーを整理するのに最適な方法を考えています。

これが私がこれまでに知っていることです:

  • インターリーブされた配列を使用すると、コードが高速化されます。空間的な局所性を利用し、キャッシュヒットを増やします。これを実装するには、頂点をstructsに編成し、それぞれstructが位置/通常/texcoordなどを保持します。その頂点の情報。

  • インデックス付き配列を使用すると、個別の頂点/法線/ texcoordなどを格納することにより、メモリ消費量が削減されます。各面のすべての情報を冗長に指定するのではなく、一度だけ、それらの配列への参照によって面を定義します。頂点属性のリストへのインデックスを使用してこれを実装することもできます。struct

私の質問:これらの両方をどのように活用すればよいですか?両方を行うことは可能ですか?両方とも、できる限り常に使用する必要があると聞いていますが、両方を同時に使用すること、または一方を他方に使用することについては何も見つかりませんでした。

私の最初の解決策:データ配列にインデックスを持つ構造体を実装し、これらの構造体の配列とデータ配列をVBOとして渡し、基本的に2つを組み合わせます。

私は正しい方向に進んでいますか?これを行うためのより良い方法はありますか?私は何をすべき/すべきではありませんか?この決定に影響を与えることに気付いていないように思われるものはありますか?

4

1 に答える 1

5

インターリーブされた配列とインデックスの使用は、実際には関係ありません。お互いにあまり関係がないので、両方を同時に行うことは可能です。

VTNVTNVTN ...(頂点、テクスチャ、通常)などの頂点を単一のバッファにパックする場合、またはVVV、TTT、NNNとして個別のバッファにパックする場合は、インターリーブ配列を使用するかどうかを選択するだけです。

インデックスバッファの使用を正当化するのに十分な繰り返し頂点がある場合、インデックスの使用は単なる決定です。この決定を行うとき、頂点をインターリーブしたかどうかはほとんど関係ありません。

私の最初の解決策:データ配列にインデックスを持つ構造体を実装し、これらの構造体の配列とデータ配列をVBOとして渡し、基本的に2つを組み合わせます。

これは違法です。インデックスを取得することはできません。インデックスを1つだけ取得することに注意してください。texcoord#1をサンプリングすると同時に頂点#0をサンプリングすることはできません。指定する単一のインデックスは、すべてのバッファーへのインデックスです。

複数のインデックスを持つことができると思っていたので、これが最初に混乱した理由だと思います。

于 2012-11-14T07:25:22.877 に答える