ややプログラム紀行

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

動的な頂点バッファ

またおんなじ話題かよ・・・てな気持ちも少しだけあります

なぜなら、今は別の部活のゲームを作っているのでここで色々書いても実際に試せないからです

でもまぁ、部活の方は記事にするとなんか怖いのでやめといて、動的な頂点バッファについて書いてみます

まえ、書いたかもしんないですけど、動的な頂点バッファとインデックス バッファの使い方に欲しいような情報が書いてあったんで、これを解読してみたいと思います(さっきからなんで~してみたいと思います、ばっか言ってんだ( ^ω^))

・・・で、サンプルソースコードのコメントが・・・英語じゃん!!!

日本語に訳してくれよぉ

学生の少ない知識とgoogle先生で解読してみます

↓問題のソース

// USAGE STYLE 1

// Discard the entire vertex buffer and refill with thousands of vertices.

// Might contain multiple objects and/or require multiple DrawPrimitive

// calls separated by state changes, etc.

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

UINT nSizeOfData = nNumberOfVertices * m_nVertexStride;

// Discard and refill the used portion of the vertex buffer.

CONST DWORD dwLockFlags = D3DLOCK_DISCARD;

// Lock the vertex buffer.

BYTE* pBytes;

if( FAILED( m_pVertexBuffer->Lock( 0, 0, &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, 0, nNumberOfVertices/3)

// 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 1

// Discard the entire vertex buffer and refill with thousands of vertices.

// Might contain multiple objects and/or require multiple DrawPrimitive

// calls separated by state changes, etc.

// USAGE STYLE 1 は多分 // 使い方① でしょう

// Discard the entire vertex buffer and refill with thousands of vertices.

・・・動詞が・・・ない・・・

どうなってる・・・(今頃ですが、意味がなんとなく分かればいいれす)

あ、discardが動詞か

// すべての頂点バッファを破棄して1000の頂点を再び満たす

ですかね・・・(ヤバイ、全くわからん・・・なんで1000って具体的なんだよ・・・)

// Might contain multiple objects and/or require multiple DrawPrimitive

// calls separated by state changes, etc.

might・・・だと・・・

ググッたら「かもしれない」だと分かった

// かもしれない 含む 多数のオブジェクト と/か 必要とする 多数の DrawPrimitive

ここまでは勘でいける

だけど、calls separated by ってなんだ?!

なんで過去形なんだ?!

ステートチェンジして切り離すってことか?

callsがsついてるのも意味深すぎる・・・

あ、DrawPrimitiveが呼ぶ必要があるって意味か

つまりさっきの文章と合体させて、

// 使い方①

// すべての頂点バッファを破棄して数千の頂点を再び満たす

// 多数のオブジェクトを含んだり、多数のDrawPrimitive関数が切り離す?状態変更を呼ぶ必要があるかもしれない

だ!!!

・・・いや、いいんだ、どうせあまり大切じゃない・・・

よし、次

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

Determine・・・決意する、らしい

さっきよりは楽・・・か?

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

かなぁ

で、

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

UINT nSizeOfData = nNumberOfVertices * m_nVertexStride;

こう書いてあったわけですが、下の掛け算は

サイズデータって変数に頂点の数×頂点1つのデータ量

をしてるんでしょう(strideって意味がちょいわからんけど)

// Discard and refill the used portion of the vertex buffer.

CONST DWORD dwLockFlags = D3DLOCK_DISCARD;

え~・・・ポーション?薬?調べたら一部って意味だった

the used portionってところがちょっと分からないけど(過去形っぽいのって、名詞につくのかな?過去分詞?)

// 破棄して使用した部分の頂点バッファを満たす

破棄に使用したってことかな?ぐしゃぐしゃすぎる

下のプログラムは、LockをするときのステータスをdwLockFlagsに入れてるんでしょう

// Lock the vertex buffer.

BYTE* pBytes;

if( FAILED( m_pVertexBuffer->Lock( 0, 0, &pBytes;, dwLockFlags ) ) )

return false;

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

うはwww天才すぎワロスwww

英語ペラペラwwwww

・・・は忘れて、プログラムの方は、コメントのとおりLockしてるんですね

さっきのステータスを使ってます

m_pVertexBufferはIDirect3DVertexBuffer9あたりだと思います

// Copy the vertices into the vertex buffer.

memcpy( pBytes, pVertices, nSizeOfData );

m_pVertexBuffer->Unlock();

// 頂点を頂点バッファにコピーする

この頂点というのは、自分で用意したやつでしょうね、準備がいいです

memcpyでコピーしてから、描画とかできるようにUnlockしてます

// Render the primitives.

m_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, nNumberOfVertices/3)

// プリミティブを描画する

こいつ、セミコロン忘れてます

プリミティブっていうのは調べたら、「太古の」とか「初期の」とか出てきました

多分頂点のデータっていうものが基礎的なものだからでしょう

これで使い方①は終わりか・・・

ぶっちゃけ本題は②の気がすんだよな・・・

じゃあ今回はここまでにします

今、書く事もとくにないのでこれの翻訳(っていうほどじゃないけど)をします

この目的は、英語かけるようになりたいという意味もあるんです

// 使い方①

// すべての頂点バッファを破棄して数千の頂点を再び満たす

// 多数のオブジェクトを含んだり、多数のDrawPrimitive関数が切り離す?状態変更を呼ぶ必要などがあるかもしれない

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

UINT nSizeOfData = nNumberOfVertices * m_nVertexStride;

// 破棄して使用した部分の頂点バッファを満たす

CONST DWORD dwLockFlags = D3DLOCK_DISCARD;

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

BYTE* pBytes;

if( FAILED( m_pVertexBuffer->Lock( 0, 0, &pBytes;, dwLockFlags ) ) )

return false;

// 頂点を頂点バッファにコピーする

memcpy( pBytes, pVertices, nSizeOfData );

m_pVertexBuffer->Unlock();

// プリミティブを描画する

m_pDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, nNumberOfVertices/3);

やってることは

・頂点データのサイズを計算して

・バッファをロックして

・データ入れて

・アンロックして

・描画

ってことですね

// 破棄して使用した部分の頂点バッファを満たす

CONST DWORD dwLockFlags = D3DLOCK_DISCARD;

がイミフですけどD3DLOCK_DISCARDが言いたいんでしょうね

てか最初からリンク先の文章読めばいいのか?!( ゚д゚)ハッ!