一つのVertexBuffer(IDirect3DVertexBuffer9オブジェクト)をカプセル化します
(凡例:
読み取り専用
Published)
| 頂点データ情報 | FVF | |
| VertexSize | ||
| Count | ||
| 設定 | AutoKeep | |
| その他 | VertexBuffer | |
| Pool | ||
| Usage |
| コンストラクタ | Create |
| デストラクタ | Destroy |
| ロック | Lock |
| Unlock | |
| 頂点データへのアクセス | GetVertex |
| SetVertex |
FVF : DWORD
頂点データについてのFlexibleVertexFormat(FVF)フラグを示します。
参照 : FlexibleVertexFormat(柔軟な頂点フォーマット)
VertexSize : UINT
1つの頂点のサイズをバイト単位で返します。
Count : UINT
VertexBufferに入っている頂点数を示します
Countの値を変更すると、格納している頂点数を変更できます。この際、元の頂点データは消去されるので注意してください。
VertexBuffer : IDirect3DVertexBuffer9
TDGVertexBufferオブジェクトが保持している、IDirect3DVertexBuffer9オブジェクトへの参照を返します。
Pool : D3DPOOL
VertexBufferがどこに格納されているかを示します。
参照 : Create
Usage : UINT
VertexBufferの使われ方を示します。
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の名前を指定します。プログラムの挙動とは直接関係ありません。
destructor Destroy;
TDGVertexBufferオブジェクトを解放します。
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_DISCARDと同時には指定できず、D3DUSAGE_WRITEONLYで作成されたVertexBufferの場合も指定できません |
一連のアクセスを終えたら、必ずUnlockしてください。
procedure Unlock;
VertexBufferのロックを解除します。
procedure GetVertex(idx:UINT; out v); procedure SetVertex(idx:UINT; const v);
頂点を一個単位で読み書きをします。idxに読み書きする頂点へのインデクスを指定してください。0 〜 Count-1が有効なインデクスです。
vに頂点データの読み込み元 / 読み出し先となる変数を指定してください。頂点データは型が決まっていないので、こういう実装になっています。結構不便なので、Lockしてポインタ使ったほうが高速ですし、かえって面倒くさくないかもしれません(^^;)
複数の頂点インデクスにアクセスする前には、先にLockしておくと高速にアクセスが行われます。ただし、Lockして一連のアクセスを終えたら、Unlockしてください。