前提
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に精通している方、ご助力お願いします。
あなたの回答
tips
プレビュー