输入布局,访问违规,错误处理不能像我希望的那样工作

Input layout, access violation, error handling not working like i want it to

本文关键字:我希望 工作 不能 处理 访问 布局 错误 输入      更新时间:2023-10-16

我正在学习DirectX 11,我想了解DirectX调试,因为我在第199行读取位置时出现了访问违规错误(创建inputLayout)我正试图让一个显示directX错误的错误框出现,因为我在某处读到,让该框显示错误信息是一种很好的编程实践有什么想法吗?此外,将对输入布局提供帮助

ID3DBlob *VS, *PS;
#if defined(DEBUG) | defined(_DEBUG)
#ifndef HR
#define HR(x) 
{ 
HRESULT hr = (x); 
if(FAILED(hr)) 
{ 
DXTrace(__FILE__, (DWORD)__LINE__, hr, L#x, true); 
} 
}
#endif
#else
#ifndef HR
#define HR(x) (x)
#endif
#endif
D3DX11CompileFromFile(L"shaders.fx", 0, 0, "VS", "vs_5_0", 0, 0, 0, &VS, 0, 0);
D3DX11CompileFromFile(L"shaders.fx", 0, 0, "PS", "ps_5_0", 0, 0, 0, &PS, 0, 0);
device->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &vShader);
device->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pShader);
VS->Release();
PS->Release();
context->VSSetShader(vShader, 0, 0);
context->PSSetShader(pShader, 0, 0);

// define the input layout
D3D11_INPUT_ELEMENT_DESC layout[] =
  {
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }
};

UINT numElements = ARRAYSIZE(layout);
//below gives me access violation error and says that &inputLayout is NULL 
HR(device->CreateInputLayout(layout, numElements, VS->GetBufferPointer(), VS->GetBufferSize(), &inputLayout));

在根据上面的代码创建布局之前,您将释放VS blob。创建输入布局时需要原始的"顶点着色器"二进制blob,以便Direct3D可以验证它们是否匹配。

一个简单的修复方法是在调用CreateInputLayout之后将VS->Release();移动到。

一个更好的答案是删除Release的所有显式使用,而是依赖于像Microsoft::WRL::ComPtr这样的智能指针。

#include <wrl/client.h>
using Microsoft::WRL::ComPtr;
...
ComPtr<ID3DBlob> VS, PS;
...
D3DX11CompileFromFile(L"shaders.fx", 0, 0, "VS", "vs_5_0", 0, 0, 0, &VS, 0, 0);
D3DX11CompileFromFile(L"shaders.fx", 0, 0, "PS", "ps_5_0", 0, 0, 0, &PS, 0, 0);
device->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &vShader);
device->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pShader);
context->VSSetShader(vShader, 0, 0);
context->PSSetShader(pShader, 0, 0);
...
//below gives me access violation error and says that &inputLayout is NULL 
HR(device->CreateInputLayout(layout, numElements, VS->GetBufferPointer(), VS->GetBufferSize()));

每当VSPS超出范围时,它们都会自行清理。