そのため、DirectXTK のテキスト レンダリングに合わせてテキスト処理をいじっていましたが、Visual Studio を「怒らせた」のではないかと思います。範囲外の配列で動作させようとしたためにいくつかのエラーが発生した後、エラーが発生しました。単純にエラーが何度も発生したのか、それとも誤ってエラーを超えてプログラムを実行し続けようとしたのかはわかりませんしかし、今では完全に異なるクラスでエラーが発生します(同じだと思います)。
HRESULT hr;
wchar_t VSFilepath[250] = L"";
wchar_t PSFilepath[250] = L"";
wchar_t SVSFilepath[250] = L"";
wchar_t SPSFilepath[250] = L"";
wcscat_s(VSFilepath, directory);
wcscat_s(VSFilepath, L"\\Shaders\\Player\\PlayerVertexShader.hlsl");
wcscat_s(PSFilepath, directory);
wcscat_s(PSFilepath, L"\\Shaders\\Player\\PlayerPixelShader.hlsl");
//create vertex shader
ID3DBlob* pVS = nullptr;
hr = D3DCompileFromFile(VSFilepath,
nullptr,
D3D_COMPILE_STANDARD_FILE_INCLUDE,
"VS_main",
"vs_5_0",
0,
NULL,
&pVS,
nullptr);
hr = gDevice->CreateVertexShader(pVS->GetBufferPointer(),
pVS->GetBufferSize(),
nullptr,
&playerVertexShader);
//create input layout (verified using vertex shader)
D3D11_INPUT_ELEMENT_DESC inputDesc[] =
{
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 20, D3D11_INPUT_PER_VERTEX_DATA, 0},
};
hr = gDevice->CreateInputLayout(inputDesc,
ARRAYSIZE(inputDesc),
pVS->GetBufferPointer(),
pVS->GetBufferSize(),
&playerVertexLayout);
pVS->Release();
//create pixel shader
ID3DBlob* pPS = nullptr;
hr = D3DCompileFromFile(PSFilepath,
nullptr,
D3D_COMPILE_STANDARD_FILE_INCLUDE,
"PS_main",
"ps_5_0",
0,
NULL,
&pPS,
nullptr);
hr = gDevice->CreatePixelShader(pPS->GetBufferPointer(),
pPS->GetBufferSize(),
nullptr,
&playerPixelShader);
pPS->Release();
プログラムをステップ実行することで、次の結論に達しました。
シェーダー作成関数 (CreateVertexShader など) を使用した後、次に D3DCompileFromFile を使用しようとすると、プログラムが停止し、「game.exe の 0x772BDBB7 で初回例外: 0xC0000008: 無効なハンドルが指定されました」というメッセージが表示されます。
CreateVertexShader をコメントアウトしようとしても問題ありません。次のピクセルシェーダーを作成できますが、次の D3DCompileFromFile で同じエラーが発生し、すべての hr 結果が S_OK になります。
問題は、彼のコードはこれより前におそらく 100 回は機能し、それに関連するものは何も変更していないということです。そのため、何が起こったのか非常に混乱しています。