関数DrawBoxは四角形の頂点バッファ、インデックスバッファの生成、ビューの設定、情報をマップ、頂点、インデックスのセット、DrawIndexedInstanceの呼び出しを行う自作描画関数であり、
メインループ1ループ目
DrawBox() 1つ目を生成
DrawBox() 2つ目を生成
メインループ2ループ目
DrawBox() 更新だけ
DrawBox() 更新だけ
みたいな関数を作りたいのですが可能ですか?
1回だけの呼び出しなら実装できたのですが1フレームでn回呼びn個の図形を更新、描画するプログラムが思いつきません…
お助けください。
DirectX12にあまり詳しくないですが描画するためのキューというかパイプラインみたいなのがあったかと思います。それに積むものをstd::unorded_mapかなにかで保持しておけばいいのではないかと
あとあなたがどのようにDrawBoxを実装しているかが追記されないと具体的な回答は得られないものと思います。
###コード
```
//頂点バッファ、インデックスバッファ、ビューはvector
///一度だけ===========================================================
//右上座標と左下座標から4頂点、6インデックスを生成
XMFLOAT3 vertices[] =
{
{lx,ly,0.0f},//左上座標 インデックス0
{rx,ly,0.0f},//右上座標 インデックス1
{rx,ry,0.0f},//右下座標 インデックス2
{lx,ry,0.0f},//左下座標 インデックス3
};
unsigned short indices[]
{
0,1,2,
0,2,3,
};
//バッファの設定、生成(一度だけ)
D3D12_HEAP_PROPERTIES bufferHeapProp = {};
bufferHeapProp.Type = D3D12_HEAP_TYPE_UPLOAD;
D3D12_RESOURCE_DESC bufferDesc = {};
bufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
bufferDesc.Width = sizeof(vertices); // 頂点情報が入る分のサイズ
bufferDesc.Height = 1;
bufferDesc.DepthOrArraySize = 1;
bufferDesc.MipLevels = 1;
bufferDesc.SampleDesc.Count = 1;
bufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
//頂点バッファの生成
vtxBuffer.push_back(nullptr);
result = device->CreateCommittedResource(
&bufferHeapProp, // ヒープ設定
D3D12_HEAP_FLAG_NONE,
&bufferDesc, // リソース設定
D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr,
IID_PPV_ARGS(&vtxBuffer.back()));
//サイズ以外の設定も同様
bufferDesc.Width = sizeof(indices);
//インデックスバッファの生成
idxBuffer.push_back(nullptr);
result = device->CreateCommittedResource(
&bufferHeapProp,
D3D12_HEAP_FLAG_NONE,
&bufferDesc,
D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr,
IID_PPV_ARGS(&idxBuffer.back()));
///一度だけ===========================================================
///毎回更新===========================================================
//バッファの更新(毎回)
//頂点の更新
XMFLOAT3* vertMap = nullptr;
result = vtxBuffer.back()->Map(0, nullptr, (void**)&vertMap);
for (int i = 0; i < _countof(vertices); i++)
{
vertMap[i] = vertices[i];
}
vtxBuffer.back()->Unmap(0, nullptr);
//インデックスの更新
unsigned short* idxMap = nullptr;
result = idxBuffer.back()->Map(0, nullptr, (void**)&idxMap);
for (int i = 0; i < _countof(indices); i++)
{
idxMap[i] = indices[i];
}
idxBuffer.back()->Unmap(0, nullptr);
///毎回更新===========================================================
//ビューの設定
vbView.push_back({});
vbView.back().BufferLocation = vtxBuffer.back()->GetGPUVirtualAddress();
vbView.back().SizeInBytes = sizeof(vertices);
vbView.back().StrideInBytes = sizeof(vertices[0]);
ibView.push_back({});
ibView.back().BufferLocation = idxBuffer.back()->GetGPUVirtualAddress();
ibView.back().Format = DXGI_FORMAT_R16_UINT;
ibView.back().SizeInBytes = sizeof(indices);
//コマンドリスト(頂点ビューのセット、インデックスビューのセット、ドロー)
```
現在ドローやコマンドリストは各バッファごとに呼び出しています。
作りたい理由:一つのバッファをvectorに積みながら生成する関数はできたが、毎フレーム各バッファごとにマップする関数を作ろうとしたが各バッファに対応する頂点情報をどう取得すればいいか思いつかなかったため。生成(一度だけ)、マップ(毎回)、描画(毎回)を一つの関数にまとめたかった。
頂点情報を動的配列で保持すれば各バッファの要素番号から頂点情報取得できる。。。かな?
あなたの回答
tips
プレビュー