ややプログラム紀行

博士2年のプログラムに関する日記

昨日の続き

絶対に今日1回で書き終わらない\(^o^)/

// USAGE STYLE 2

// Reusing one vertex buffer for multiple objects

// Determine the size of data to be moved into the vertex buffer.

UINT nSizeOfData = nNumberOfVertices * m_nVertexStride;

// No overwrite will be used if the vertices can fit into

// the space remaining in the vertex buffer.

DWORD dwLockFlags = D3DLOCK_NOOVERWRITE;

// Check to see if the entire vertex buffer has been used up yet.

if( m_nNextVertexData > m_nSizeOfVB - nSizeOfData )

{

// No space remains. Start over from the beginning

// of the vertex buffer.

dwLockFlags = D3DLOCK_DISCARD;

m_nNextVertexData = 0;

}

// Lock the vertex buffer.

BYTE* pBytes;

if( FAILED( m_pVertexBuffer->Lock( (UINT)m_nNextVertexData, nSizeOfData,

&pBytes;, dwLockFlags ) ) )

return false;

// Copy the vertices into the vertex buffer.

memcpy( pBytes, pVertices, nSizeOfData );

m_pVertexBuffer->Unlock();

// Render the primitives.

m_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST,

m_nNextVertexData/m_nVertexStride, nNumberOfVertices/3)

// Advance to the next position in the vertex buffer.

m_nNextVertexData += nSizeOfData;

一気にいきたいところです

// USAGE STYLE 2

// Reusing one vertex buffer for multiple objects

// 使い方②

// 1つの頂点バッファを多数のオブジェクトに再利用する

reusingになってんのは名詞にするためでしょうか

よくわかりません

// Determine the size of data to be moved into the vertex buffer.

UINT nSizeOfData = nNumberOfVertices * m_nVertexStride;

昨日もこんなのありましたね

// 頂点バッファに移動させるデータのサイズを決める

で、したのプログラムについては昨日の記事を見てもらいたいです

// No overwrite will be used if the vertices can fit into

// the space remaining in the vertex buffer.

DWORD dwLockFlags = D3DLOCK_NOOVERWRITE;

ifのあとは

もし頂点データが頂点バッファに残ってるスペースに収まるなら

って意味だと思います

しかしその前は・・・

will be usedってどういう意味・・・

使われるだろう・・・?

// No overwriteはもし頂点データが頂点バッファに残っているスペースに収まるなら使われる

ですかね

No overwriteってこのあとのプログラムからして訳しませんでしたけど、訳すべきなのか

したのプログラムは昨日のやつのバージョン違いみたいです

dwLockFlags変数にステータスを格納してると

// Check to see if the entire vertex buffer has been used up yet.

if( m_nNextVertexData > m_nSizeOfVB - nSizeOfData )

Check to see?

なんぞ

調べたら「調べる」って意味だった

// すべての頂点バッファを使い切ってるか調べる

で、したのは・・・

m_nNextVertexDataが頂点バッファにあるデータの量、言い換えれば頂点バッファの先頭からデータの最後までの距離、オフセットってやつですかね

m_nSizeOfVBが頂点バッファのサイズ

nSizeOfDataがこれから格納したいデータ

かな

// No space remains. Start over from the beginning

// of the vertex buffer.

dwLockFlags = D3DLOCK_DISCARD;

m_nNextVertexData = 0;

// スペースが残ってない 頂点バッファの先頭?からやり直す

やばい、どんどん謎が深まる

dwLockFlags = D3DLOCK_DISCARD;

で、さっきのステータス変数の値を変えてるっぽいです

D3DLOCK_DISCARDはLockしてる領域まるごと上書きするっぽいです

使ってないのでわかりませんが

なにより謎はm_nNextVertexDataに0を代入していること

// Lock the vertex buffer.

BYTE* pBytes;

if( FAILED( m_pVertexBuffer->Lock( (UINT)m_nNextVertexData, nSizeOfData,

&pBytes;, dwLockFlags ) ) )

return false;

// 頂点バッファをロックする

訳は問題ないと思いますが、Lock関数のほうが謎です

救いの手を差し伸べてもらうために動的な頂点バッファとインデックス バッファの使い方を見てみたら・・・

「D3DLOCK_DISCARD を使ってバッファをロックすると常にバッファ全体が破棄されること、非ゼロのオフセットまたは制限付きのサイズ フィールドを指定すると、ロックしていないバッファ領域の情報は保持されないことに注意すること。」

ん?てことはオフセット値(1つめの引数)に0を指定したら情報は引き継がれるのか?

正直まだ使ってないのでまったく確証がありません

こんど試してみます・・・

だからさっきNextVertexDataを0にしてたわけか

頂点バッファのサイズが足りるならいつもどおり

足りないならDISCARDにして、領域を拡張?か新しく作成?するってことですかね

領域を拡張するのか新しく別の場所に作るのかも今度やってみよう・・・

// Copy the vertices into the vertex buffer.

memcpy( pBytes, pVertices, nSizeOfData );

m_pVertexBuffer->Unlock();

// 頂点データを頂点バッファにコピー

コピーしてアンロックしてます

// Render the primitives.

m_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST,

m_nNextVertexData/m_nVertexStride, nNumberOfVertices/3)

// プリミティブを描画

プリミティブを描画してます

ここらへんは昨日もありました

// Advance to the next position in the vertex buffer.

m_nNextVertexData += nSizeOfData;

// 頂点バッファ内の次の位置へすすめる

なん・・・だと・・・

いや、嘘です

このコメントでNextVertexDataとかSizeOfDataとかがなんなのかはっきりしました

NextVertexDataはさっきも言ったとおり頂点バッファのオフセットです

SizeOfDataを頂点バッファに追加したので当然の如くオフセット値を増やす(=すすめる)わけで・・・す・・・が・・・

頂点バッファのサイズが足りなくなったとき、NextVertexBufferを0にしてたよね?

てことは、

容量が足りなくなったら、そこは置いといて(破棄して)新しく頂点バッファを作ってるってことかな?

それならオフセット値を0にするのも納得です

まあ、今度調べてみます・・・

// 使い方②

// 1つの頂点バッファを多数のオブジェクトに再利用する

// 頂点バッファに移動させるデータのサイズを決める

UINT nSizeOfData = nNumberOfVertices * m_nVertexStride;

// No overwriteはもし頂点データが頂点バッファに残っているスペースに収まるなら使われる

DWORD dwLockFlags = D3DLOCK_NOOVERWRITE;

// 全体の頂点バッファを使い切ってるか調べる

if( m_nNextVertexData > m_nSizeOfVB - nSizeOfData )

{

// スペースが残ってない 頂点バッファの先頭からやり直す

dwLockFlags = D3DLOCK_DISCARD;

m_nNextVertexData = 0;

}

// 頂点バッファをロックする

BYTE* pBytes;

if( FAILED( m_pVertexBuffer->Lock( (UINT)m_nNextVertexData, nSizeOfData,

&pBytes;, dwLockFlags ) ) )

return false;

// 頂点データを頂点バッファにコピー

memcpy( pBytes, pVertices, nSizeOfData );

m_pVertexBuffer->Unlock();

// プリミティブを描画

m_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST,

m_nNextVertexData/m_nVertexStride, nNumberOfVertices/3)

// 頂点バッファ内の次の位置へすすめる

m_nNextVertexData += nSizeOfData;