TDGVertexBuffer

タスク

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

 

リファレンス目次

プロパティ

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

頂点データ情報 FVF
VertexSize
Count
設定 AutoKeep
その他 VertexBuffer
Pool
Usage

メソッド

コンストラクタ Create
デストラクタ Destroy
ロック Lock
Unlock
頂点データへのアクセス GetVertex
SetVertex

 

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

FVF

FVF : DWORD

 頂点データについてのFlexibleVertexFormat(FVF)フラグを示します。

 参照 : FlexibleVertexFormat(柔軟な頂点フォーマット)

 

VertexSize 

VertexSize : UINT

 1つの頂点のサイズをバイト単位で返します。

 

Count 

Count : UINT

 VertexBufferに入っている頂点数を示します

 Countの値を変更すると、格納している頂点数を変更できます。この際、元の頂点データは消去されるので注意してください。

 

VertexBuffer

VertexBuffer : IDirect3DVertexBuffer9

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

 

Pool

Pool : D3DPOOL

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

 参照 : Create

 

Usage

Usage : UINT

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

 参照 : Create D3DUSAGE

 

 

 

リファレンス〜メソッド

Create

constructor Create(AOwner:TDGCarad; _vertexCount,_vertexSize:UINT;
        _Usage, _FVF:DWord; _Pool:D3DPool; debugName:String = '');

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

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

 _vertexCountで、頂点を何個格納したVertexBufferを作るかを指定します

 _vertexSizeで、頂点データ1つあたりのサイズをバイト単位で指定します

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

D3DUSAGE_WRITEONLY 書き込み専用リソースとして使います
D3DUSAGE_SOFTWAREPROCESSING  ソフトウェア頂点処理を行われるVertexBufferとして使います
D3DUSAGE_DONOTCLIP クリッピング処理の必要の無いVertexBufferとして使います
D3DUSAGE_POINTS ポイントスプライト用のVertexBufferとして使います
D3DUSAGE_RTPATCHES RTパッチ用のVertexBufferとして使います
D3DUSAGE_NPATCHES Nパッチ用のVertexBufferとして使います
D3DUSAGE_DYNAMIC 動的なメモリ管理を前提としたVertexBufferとして使います。メモリクラスにD3DPOOL_DEFAULTを指定して生成されているリソースである必要があります

_FVF で、頂点フォーマットについてのフラグを指定します。

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

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

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

 

Destroy

destructor Destroy;

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

 

Lock

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

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

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

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

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

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

 

Unlock

procedure Unlock;

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

 

GetVertex
SetVertex

procedure GetVertex(idx:UINT; out v);
procedure SetVertex(idx:UINT; const v);

 頂点を一個単位で読み書きをします。idxに読み書きする頂点へのインデクスを指定してください。0 〜 Count-1が有効なインデクスです。

 vに頂点データの読み込み元 / 読み出し先となる変数を指定してください。頂点データは型が決まっていないので、こういう実装になっています。結構不便なので、Lockしてポインタ使ったほうが高速ですし、かえって面倒くさくないかもしれません(^^;)

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