Nanashi-softプログラマ専用DirectX11開発


◇DirectX11プログラミング -頂点データを複数持つには?-

頂点データは,このようなプログラムになっています
	//頂点バッファ作成
D3D11_BUFFER_DESC hBufferDesc;
hBufferDesc.ByteWidth = sizeof(Vertex3D) * TYOUTEN;
hBufferDesc.Usage = D3D11_USAGE_DEFAULT;
hBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
hBufferDesc.CPUAccessFlags = 0;
hBufferDesc.MiscFlags = 0;
hBufferDesc.StructureByteStride = sizeof(float);

D3D11_SUBRESOURCE_DATA hSubResourceData;
hSubResourceData.pSysMem = hVectorData;
hSubResourceData.SysMemPitch = 0;
hSubResourceData.SysMemSlicePitch = 0;

ID3D11Buffer* hpBuffer;
if(FAILED(hpDevice->CreateBuffer(&hBufferDesc, &hSubResourceData, &hpBuffer))){
MessageBoxW(hWnd, L"CreateBuffer", L"Err", MB_ICONSTOP);
goto End;
}

//その頂点バッファをコンテキストに設定
UINT hStrides = sizeof(Vertex3D);
UINT hOffsets = 0;
hpDeviceContext->IASetVertexBuffers(0, 1, &hpBuffer, &hStrides, &hOffsets);
この後,DrawやDrawIndexedで描画を行います

PMDファイルから読み込んだ頂点データをセットするのが↓ココなのです
	hSubResourceData.pSysMem = hVectorData;
そうすると,別のモデルデータに切り替える為には,CreateBufferから必要になりますよね?
なので,メインループに全体を放り込んで,hVectorData1とhVectorData2を切り替えれば描画できます

……と言うのが,今までの発想でした(^^;
新システムでは,もう少しレベルアップした思考でいきます

色々なサンプルを見ていると,デバイスコンテキストにセットすることだけを描画中でおこなっています
つまり,前処理でCreateBufferまでを行って,描画時にIASetVertexBuffersをおこなうべきだということです


○処理の流れ
mainクラス

pmdクラスでモデルデータロード

CreateBufferで頂点データを生成

modeldataクラスにID3D11Bufferポインターをセット

描画時にIASetVertexBuffersで使用する頂点データをスイッチ

こういう流れを作れば,2つのモデルデータの頂点データを切り替えて描画する事ができます


初期化で,頂点バッファーを生成して,
	#define MODELDATA_MAX 2
int TYOUTEN[2];
ID3D11Buffer *vctBuf[MODELDATA_MAX];
~略~
for(int mdcnt=0; mdcnt < MODELDATA_MAX; mdcnt++){
~略~
//頂点バッファ作成
D3D11_BUFFER_DESC hBufferDesc;
hBufferDesc.ByteWidth = sizeof(Vertex3D) * TYOUTEN[mdcnt];
hBufferDesc.Usage = D3D11_USAGE_DEFAULT;
hBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
hBufferDesc.CPUAccessFlags = 0;
hBufferDesc.MiscFlags = 0;
hBufferDesc.StructureByteStride = sizeof(float);

D3D11_SUBRESOURCE_DATA hSubResourceData;
hSubResourceData.pSysMem = hVectorData;
hSubResourceData.SysMemPitch = 0;
hSubResourceData.SysMemSlicePitch = 0;

if(FAILED(hpDevice->CreateBuffer(&hBufferDesc, &hSubResourceData, &vctBuf[mdcnt]))){
MessageBoxW(hWnd, L"CreateBuffer", L"Err", MB_ICONSTOP);
goto End;
}
~略~
}
メインループで,それをセットして描画する
	for(int mdcnt=0; mdcnt < MODELDATA_MAX; mdcnt++){
~略~
//頂点バッファー切り替え
UINT hStrides = sizeof(Vertex3D);
UINT hOffsets = 0;
hpDeviceContext->IASetVertexBuffers(0, 1, &vctBuf[mdcnt], &hStrides, &hOffsets);
~略~
//頂点描画
hpDeviceContext->Draw(TYOUTEN[mdcnt], 0);
}
頂点数と頂点バッファーのポインターを保管しておけば,描画可能です


TOPプログラマ専用DirectX11開発

Melonbooks DL