一つのIndexBuffer(IDirect3DIndexBuffer9オブジェクト)をカプセル化します
(凡例:
読み取り専用
Published)
| インデクスについての情報 | Count | |
| Indices | ||
| 設定 | AutoKeep | |
| その他 | IndexBuffer | |
| Pool | ||
| Usage |
| コンストラクタ | Create |
| デストラクタ | Destroy |
| ロック | Lock |
| Unlock |
Count : UINT
IndexBufferに入っている頂点インデクスの数を示します
Countの値を変更すると、格納している頂点インデクスの数を変更できます。この際、もともと格納されていた頂点インデクスは全て消去されるので注意してください。
Indices[idx:UINT]:Word
IndexBufferに入っている頂点インデクスにアクセスします。
複数の頂点インデクスにアクセスする前には、先にLockしておくと高速にアクセスが行われます。ただし、Lockして一連のアクセスを終えたら、Unlockしてください。
IndexBuffer : IDirect3DIndexBuffer9
TDGIndexBufferオブジェクトが保持している、IDirect3DIndexBuffer9オブジェクトへの参照を返します。
Pool : D3DPOOL
IndexBufferがどこに格納されているかを示します。
参照 : Create
Usage : UINT
IndexBufferの使われ方を示します。
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の名前を指定します。プログラムの挙動とは直接関係ありません。
destructor Destroy;
TDGIndexBufferオブジェクトを解放します。
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_DISCARDと同時には指定できず、D3DUSAGE_WRITEONLYで作成されたIndexBufferの場合も指定できません |
一連のアクセスを終えたら、必ずUnlockしてください。
procedure Unlock;
IndexBufferのロックを解除します。