質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

0回答

1664閲覧

DirectX12で何回でも使える図形描画関数を作りたい

gegegeitsu

総合スコア2

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2020/05/13 04:26

関数DrawBoxは四角形の頂点バッファ、インデックスバッファの生成、ビューの設定、情報をマップ、頂点、インデックスのセット、DrawIndexedInstanceの呼び出しを行う自作描画関数であり、

メインループ1ループ目
DrawBox() 1つ目を生成
DrawBox() 2つ目を生成
メインループ2ループ目
DrawBox() 更新だけ
DrawBox() 更新だけ

みたいな関数を作りたいのですが可能ですか?
1回だけの呼び出しなら実装できたのですが1フレームでn回呼びn個の図形を更新、描画するプログラムが思いつきません…
お助けください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2020/05/13 04:34

DirectX12にあまり詳しくないですが描画するためのキューというかパイプラインみたいなのがあったかと思います。それに積むものをstd::unorded_mapかなにかで保持しておけばいいのではないかと
yumetodo

2020/05/13 04:35

あとあなたがどのようにDrawBoxを実装しているかが追記されないと具体的な回答は得られないものと思います。
gegegeitsu

2020/05/13 04:55

###コード ``` //頂点バッファ、インデックスバッファ、ビューは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); //コマンドリスト(頂点ビューのセット、インデックスビューのセット、ドロー) ```
gegegeitsu

2020/05/13 05:01

現在ドローやコマンドリストは各バッファごとに呼び出しています。 作りたい理由:一つのバッファをvectorに積みながら生成する関数はできたが、毎フレーム各バッファごとにマップする関数を作ろうとしたが各バッファに対応する頂点情報をどう取得すればいいか思いつかなかったため。生成(一度だけ)、マップ(毎回)、描画(毎回)を一つの関数にまとめたかった。
gegegeitsu

2020/05/13 06:10

頂点情報を動的配列で保持すれば各バッファの要素番号から頂点情報取得できる。。。かな?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問