因此,我在处理 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。
问题是他的代码在此之前可能已经运行了一百次,而我没有更改任何与之相关的东西,所以我对发生的事情感到非常困惑。