TDGIndexBuffer

タスク

 一つのIndexBuffer(IDirect3DIndexBuffer9オブジェクト)をカプセル化します

 

リファレンス目次

プロパティ

(凡例:    読み取り専用   Published)

インデクスについての情報 Count
Indices
設定 AutoKeep
その他 IndexBuffer
Pool
Usage

メソッド

コンストラクタ Create
デストラクタ Destroy
ロック Lock
Unlock

 

リファレンス〜プロパティ

Count 

Count : UINT

 IndexBufferに入っている頂点インデクスの数を示します

 Countの値を変更すると、格納している頂点インデクスの数を変更できます。この際、もともと格納されていた頂点インデクスは全て消去されるので注意してください。

 

Indices

Indices[idx:UINT]:Word

 IndexBufferに入っている頂点インデクスにアクセスします。

 複数の頂点インデクスにアクセスする前には、先にLockしておくと高速にアクセスが行われます。ただし、Lockして一連のアクセスを終えたら、Unlockしてください。

 

IndexBuffer

IndexBuffer : IDirect3DIndexBuffer9

 TDGIndexBufferオブジェクトが保持している、IDirect3DIndexBuffer9オブジェクトへの参照を返します。

 

Pool

Pool : D3DPOOL

 IndexBufferがどこに格納されているかを示します。

 参照 : Create

 

Usage

Usage : UINT

 IndexBufferの使われ方を示します。

 参照 : Create D3DUSAGE

 

リファレンス〜メソッド

Create

constructor Create(AOwner:TDGCarad; _indexCount:UINT; _Usage:DWord;
       _Pool:D3DPool; debugName:String = '');

 TDGIndexBufferオブジェクトを生成します。

 AOwnerには使用しているTDGCaradオブジェクトを指定してください。

 _IndexCountで、頂点インデクスを何個格納したIndexBufferを作るかを指定します

 _Usageで、頂点データの使い道を指定します。0または以下の値で指定します。

D3DUSAGE_WRITEONLY 書き込み専用リソースとして使います

 _poolで、メモリクラス(どこに頂点インデクスデータを格納するか)を指定します。以下の値を指定できます

D3DPOOL_DEFAULT ドライバ側でもっとも適切な場所 (おそらくビデオメモリ又はAGPメモリ) を割り当て、そこに格納します。もっとも高速ですが、Direct3DDeviceのロストや再生成が起こると、内容は消去されっぱなしになります。自動復元の必要の無いリソースに用いてください
D3DPOOL_MANAGED 必要に応じて、デバイスからアクセスできるメモリに自動的にコピーされます。自動復元が利きますので、基本的には全てのリソースはこれを指定して生成されることになるでしょう。ただし、内容をロックなどで書き換える都度、メモリにコピーする処理が必要になるので、毎フレーム内容を全部書き換える必要のあるようなリソースには向きません
D3DPOOL_SYSTEMMEM システムメモリに生成されます。これも自動復元が利きます。環境によってはDirect3DDeviceからアクセスできません。バッファ用途に使うことになるでしょう

 debugNameで、デバッグメッセージに出力される、このIndexBufferの名前を指定します。プログラムの挙動とは直接関係ありません。

 

Destroy

destructor Destroy;

 TDGIndexBufferオブジェクトを解放します。

 

Lock

function Lock(start,count:UINT; Flags:DWord):Pointer;

 IndexBufferのロックを行い、頂点データを格納しているメモリに直接アクセスできるようにします。

 startでロックを開始する頂点のインデクスを指定し、そこからcount個の頂点を直接アクセスできるようにします。start , count 双方に0を指定すると、IndexBuffer全体をロックします。

 Flagsに指定できる値は、0または以下の値の和です。

D3DLOCK_DISCARD 書き込み専用処理で、IndexBuffer全体を上書きする場合に指定します。これを指定すると、Direct3Dは新しいメモリ領域へのポインタを返すことができるので、ダイナミック メモリ アクセス (DMA) と古い領域からのレンダリングが機能停止することが無く、つまり、前のシーンのレンダリングをしながらバッファを書き替える事が可能になるのです。
ただし、D3DUSAGE_DYNAMICで作成されたIndexBufferにのみ有効です。
D3DLOCK_NOOVERWRITE 最後のシーンのレンダリングを行った時点で使用された範囲(つまり、現在ビデオカードから参照されているかもしれない範囲)を書き換えない事を前提にロックします。D3DUSAGE_DYNAMICで作成されたIndexBufferにのみ有効です。
D3DLOCK_NOSYSLOCK
ロック処理自体に少し時間がかかる代わりに、マウスカーソルの移動など、システムでほかの処理を実行することが可能になります。バックバッファをロックして前面書き換えする時のような、ロックが長時間に及び、システムの応答性に悪影響を与えてしまうようなロックに対して有効だそうです。
D3DLOCK_READONLY
バッファに書き込みを行わない事をあらかじめ宣言した上でロックします。ドライバによっては効率的なアクセスを期待できるようです。D3DLOCK_DISCARDと同時には指定できず、D3DUSAGE_WRITEONLYで作成されたIndexBufferの場合も指定できません

 一連のアクセスを終えたら、必ずUnlockしてください。

 

Unlock

procedure Unlock;

 IndexBufferのロックを解除します。