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

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

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

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

DirectX

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

Q&A

解決済

DrectX12で例外がスローされるのを解決したい

isimasa
blanket

総合スコア122

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

DirectX

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

1回答

0グッド

0クリップ

236閲覧

投稿2022/11/22 13:54

前提

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

自己解決

// インデックスバッファリソースの作成
vbResDesc.Width = sizeof(unsigned int)*pScene->mMeshes[i]->mNumFaces * 3; // *3を追加
for (int j = 0; j < faceNum; ++j) // ここは変えない
g_pModelVBV[i].StrideInBytes = sizeof(Vertex); // ここも変えない

for (int j = 0; j < g_pIdxNum[j]; ++j) // g_pIdxNum[j]
for文を修正したら直りました。

ただ、
g_pModelVBV[i].StrideInBytes = sizeof(Vertex); // =?
頂点バッファビューの設定を変えないことには3dモデルの表示は出来ません。

四角形は表示されてエラーは消えたので、自己解決しました。
*3のところを直しただけで3dモデル表示できました。

投稿2022/11/23 23:55

編集2022/11/24 06:37
isimasa

総合スコア122

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

DirectX

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