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

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

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

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

DirectX

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

Q&A

0回答

1474閲覧

DirectX12を用いた3Dモデル表示プログラムにimGUIを統合したい

Riku_Hirasaka

総合スコア0

C++

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

DirectX

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

0グッド

0クリップ

投稿2022/08/26 14:08

前提

C++, DirectXで描画、ユーザーが設定したパラメータに基づいてCUDAでAndy Lomasのアルゴリズムに基づいたジオメトリの更新を行い、読み込んだ初期メッシュから有機的な形状を自動生成するアプリケーションを作ろうとしています。
具体的に実現したいのはAndy Lomasのソフトウェア(https://vimeo.com/98435385)
のオープンソース版です。
頂点、面データの更新アルゴリズムを実装することに興味があるのであり、また、Unreal Blueprint以外のプログラミング言語については初心者なので、その他の描画系やGUIの実装については、できるだけ最小努力で実装したいと考えています。
そのため、まずはハローワールドからFBXモデルを表示させるまで(https://qiita.com/kyooooooooma/items/c43dd8b96cc104cb6713)
をベースに、FBX読み込み・描画系を実装し、ImGUI(https://github.com/ocornut/imgui
を統合してGUIを実装しようとしています。
これまでに、「ハローワールドから~」のコードをコピペしてとりあえずFBXを表示することには成功し、imGUIのDX12サンプルを「ハローワールドから~」のプロジェクト上で(main.cppをコメントアウトしてimGUIサンプルのものに入れ替えることで)実行することまでは成功しました。

実現したいこと

・既に作成したDirectX12でジオメトリを描画するプログラムにimGUIを使える状態で統合すること

発生している問題・エラーメッセージ

中身はあまり理解していないのですが、imGUIのサンプルと「ハローワールドから~」の対応関係から推測してコードを変えることで、ビルドを通すことには成功しています。しかし、実行すると
ImGui_ImplDX12_NewFrame();
ImGui_ImplWin32_NewFrame();
ImGui::NewFrame();
のいずれかで呼び出されるimgui_impl_dx12.cppのコード内
bd->pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, bd->hFontSrvCpuDescHandle);
SafeRelease(bd->pFontTextureResource);
で、「読み取り中にアクセス違反が発生しました」というエラーが出て停止してしまいます。
imGUIのサンプルのmain.cpp(実行できる)と現在のコードが何が違ってエラーが出ているのか特定できず、困っています。

問題のコード 初期化部分 ここではエラーが発生しない

Engine.cpp

1 // Setup Dear ImGui context 2 IMGUI_CHECKVERSION(); 3 ImGui::CreateContext(); 4 ImGuiIO& io = ImGui::GetIO(); (void)io; 5 //io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls 6 //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls 7 8 // Setup Dear ImGui style 9 ImGui::StyleColorsDark(); 10 //ImGui::StyleColorsLight(); 11 io.Fonts->AddFontDefault(); 12 // Setup Platform/Renderer backends 13 ImGui_ImplWin32_Init(m_hWnd); 14 ImGui_ImplDX12_Init(m_pDevice.Get(), FRAME_BUFFER_COUNT, 15 DXGI_FORMAT_R8G8B8A8_UNORM, m_pRtvHeap.Get(), 16 m_pRtvHeap->GetCPUDescriptorHandleForHeapStart(), 17 m_pRtvHeap->GetGPUDescriptorHandleForHeapStart());

描画開始部分 ここでエラーが発生している

Scene.cpp

1 2 // Start the Dear ImGui frame 3 ImGui_ImplDX12_NewFrame(); 4 5 ImGui_ImplWin32_NewFrame(); 6 ImGui::NewFrame(); 7 8 /* ここに追加したいGUIを書く */ 9 10 { 11 static float f = 0.0f; 12 static int counter = 0; 13 14 ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. 15 16 ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate); 17 ImGui::End(); 18 } 19 20 21 // Rendering 22 ImGui::Render(); 23 // Render Dear ImGui graphics 24 ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), commandList);

試したこと

ImGUI関連の関数をDirectX描画系に統合した後、それらの関数の呼び出し部分をコメントアウトしていき、どこでエラーが発生しているかは特定しました。結果的には上記3つ( ImGui_ImplDX12_NewFrame(); ImGui_ImplWin32_NewFrame(); ImGui::NewFrame();)のどれを呼び出しても同様のエラーが発生し、初期化部分ではエラーが発生していないことはわかっています。

補足情報(FW/ツールのバージョンなど)

IDE:Visual Studio 2019
C++言語標準:ISO C++17
現在のプロジェクト:https://drive.google.com/file/d/15uoeYI7Tv4Z1yWbHw4laWbbEV3486iCN/view?usp=sharing

C++, imGUIに精通している方、ご助力お願いします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問