またおんなじ話題かよ・・・てな気持ちも少しだけあります
なぜなら、今は別の部活のゲームを作っているのでここで色々書いても実際に試せないからです
でもまぁ、部活の方は記事にするとなんか怖いのでやめといて、動的な頂点バッファについて書いてみます
まえ、書いたかもしんないですけど、動的な頂点バッファとインデックス バッファの使い方に欲しいような情報が書いてあったんで、これを解読してみたいと思います(さっきからなんで~してみたいと思います、ばっか言ってんだ( ^ω^))
・・・で、サンプルソースコードのコメントが・・・英語じゃん!!!
日本語に訳してくれよぉ
学生の少ない知識と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が言いたいんでしょうね
てか最初からリンク先の文章読めばいいのか?!( ゚д゚)ハッ!