前提
DirectX12のウィンドウ表示をしました。
DirectX12とAssimpを使い3Dモデルの表示をさせようと
しています。
インデックスバッファの実装中に以下のエラーが検出
されました。
プログラムで例外がスローされた場合の対処方法についてご教授
お願いします。
発生している問題・エラーメッセージ
0x00007FF621C16D10 で例外がスローされました (Directx12.exe 内): 0xC0000005: 場所 0x000001B4F1390000 への書き込み中にアクセス違反が発生しました
考えられるエラーの原因
データ終わりの判定が出来ていない
モデルの頂点バッファの作成に失敗している
(別で四角形を表示しているためモデルの頂点バッファビューの設定
に変える必要がある)
Step
参考にしたサイト
ハローワールドからFBXモデルを表示させるまで
似たような処理をしている部分を発見し自分の
プログラムと見比べた。
実現したいこと
人型の3DモデルをDirectX12でAssimpライブラリを用いて
表示させたい。
該当のソースコード
C
1#include <DirectXMath.h> 2#include <d3dcompiler.h> 3#pragma comment(lib,"d3dcompiler.lib") 4 5#include <d3d12.h> 6#include <dxgi1_6.h> 7#pragma comment(lib,"d3d12.lib") 8#pragma comment(lib,"dxgi.lib") 9 10int g_meshNum; 11int* g_pIdxNum; 12ID3D12Resource** g_ppModelVB; 13D3D12_VERTEX_BUFFER_VIEW* g_pModelVBV; 14ID3D12Resource** g_ppModelIB; 15D3D12_INDEX_BUFFER_VIEW* g_pModelIBV; 16 17struct Vertex { 18 DirectX::XMFLOAT3 pos; 19 DirectX::XMFLOAT4 color; 20 DirectX::XMFLOAT2 uv; 21 DirectX::XMFLOAT3 normal; 22}; 23 24HRESULT InitGame() 25{ 26 HRESULT hr; 27 28 // ヒープの設定 29 D3D12_HEAP_PROPERTIES vbHeapProp = {}; 30 vbHeapProp.Type = D3D12_HEAP_TYPE_UPLOAD; 31 vbHeapProp.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; 32 vbHeapProp.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; 33 vbHeapProp.CreationNodeMask = 1; 34 vbHeapProp.VisibleNodeMask = 1; 35 36 // 頂点バッファリソースの設定 37 D3D12_RESOURCE_DESC vbResDesc = {}; 38 vbResDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; 39 vbResDesc.Height = 1; 40 vbResDesc.DepthOrArraySize = 1; 41 vbResDesc.MipLevels = 1; 42 vbResDesc.Format = DXGI_FORMAT_UNKNOWN; 43 vbResDesc.SampleDesc.Count = 1; 44 vbResDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; 45 vbResDesc.Flags = D3D12_RESOURCE_FLAG_NONE; 46 47 // ~~~~~~省略 48 // 頂点バッファリソースの生成 49 // バッファの初期値設定 50 // 頂点バッファビューの設定 51 // モデル読み込み 52 // ~~~~~~ 53 54 g_meshNum = pScene->mNumMeshes; // Assimp機能 55 g_pIdxNum = new int[g_meshNum]; 56 g_ppModelVB = new ID3D12Resource*[g_meshNum]; 57 g_pModelVBV = new D3D12_VERTEX_BUFFER_VIEW[g_meshNum]; 58 g_ppModelIB = new ID3D12Resource*[g_meshNum]; 59 g_pModelIBV = new D3D12_INDEX_BUFFER_VIEW[g_meshNum]; 60 61 for (int i = 0; i < g_meshNum; ++i) 62 { 63 // ~~~~~~省略 64 // 頂点バッファリソース作成 65 vbResDesc.Width = sizeof(unsigned int)*pScene->mMeshes[i]->mNumFaces; 66 // 頂点バッファリソースの生成 67 // バッファの初期値設定 68 // ~~~~~~ 69 70 // 頂点バッファビューの設定 71 ZeroMemory(&g_pModelVBV[i], sizeof(g_pModelVBV[i])); 72 g_pModelVBV[i].BufferLocation = g_ppModelVB[i]->GetGPUVirtualAddress(); 73 g_pModelVBV[i].SizeInBytes = vbResDesc.Width; 74 g_pModelVBV[i].StrideInBytes = sizeof(Vertex); 75 76 77 // インデックスバッファリソースの作成 78 vbResDesc.Width = sizeof(unsigned int)*pScene->mMeshes[i]->mNumFaces; 79 80 // インデックスバッファリソースの生成 81 // GetDevice()↓ 82 // DirectX12デバイスオブジェクトの戻り値を返す 83 hr = GetDevice()->CreateCommittedResource( 84 &vbHeapProp, D3D12_HEAP_FLAG_NONE, &vbResDesc, 85 D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, 86 IID_PPV_ARGS(&g_ppModelIB[i])); 87 88 if (FAILED(hr)) { return hr; } 89 90 // バッファの初期値設定 91 unsigned int* pIdx; 92 hr = g_ppModelIB[i]->Map(0, nullptr, (void**)&pIdx); 93 94 if (SUCCEEDED(hr)) 95 { 96 int faceNum = pScene->mMeshes[i]->mNumFaces; 97 g_pIdxNum[i] = faceNum * 3; 98 for (int j = 0; j < faceNum; ++j) 99 { 100 // Assimp機能 101 aiFace& face = pScene->mMeshes[i]->mFaces[j]; 102 int idx = j * 3; 103/* コメントにすると動いた(表示はされない) 104 pIdx[idx + 0] = face.mIndices[0]; 105 pIdx[idx + 1] = face.mIndices[1];// ★ここでエラー 106 pIdx[idx + 2] = face.mIndices[2]; 107*/ 108 } 109 } 110 g_ppModelIB[i]->Unmap(0, nullptr); 111 112 // インデックスバッファビューの設定 113 ZeroMemory(&g_pModelIBV[i], sizeof(g_pModelIBV[i])); 114 g_pModelIBV[i].BufferLocation = g_ppModelIB[i]->GetGPUVirtualAddress(); 115 g_pModelIBV[i].SizeInBytes = vbResDesc.Width; 116 g_pModelIBV[i].Format = DXGI_FORMAT_R32_UINT; 117 } 118 119 return hr; 120}
試したこと
ブレークポイントをはりStep実行をした。
→エラーの特定はできなかったが、faceNumのfor文を抜けないことが
分かった。for文で無限ループが発生している
新しいプロジェクトで試した。→何回やっても同じエラー
補足情報(FW/ツールのバージョンなど)
Visual Studio2017
Visual C++
Windows SDK バージョン 10.0.17763.0
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。