输入布局,访问违规,错误处理不能像我希望的那样工作
Input layout, access violation, error handling not working like i want it to
我正在学习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()));
每当VS
和PS
超出范围时,它们都会自行清理。
相关文章:
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 我希望定义两个具有相同代码的不同名称的库
- 我希望改进或要求我目前的延迟/睡眠方法。C++
- 视觉我希望一个函数在另一个函数C++中进行计算
- 当我希望 1 时,c ++ int 会变为大约 4198321
- 精灵不显示我希望它们显示的方式
- 告诉编译器我希望变量始终存储在寄存器中的正确方法是什么
- std::string::擦除没有按我预期工作
- VS为我提供了对构造函数的另一个解决方案,但我想知道为什么我的工作不起作用
- 程序在我的C++工作区中找不到头文件
- 我希望通过使用模板元编程从变量ARGS中进行剥离参数
- 我希望在字符串功能上提供一些帮助
- 在Mac OSX中,文本的大小比使用Qt的Windows小。我希望到处都有相同的尺寸
- 我希望循环运行直到数字为:123
- 在我的工作目录中使用 glfw -3.2.1,如何使用 makefile 使用它进行编译
- 如何在不保存文件的情况下制作打印屏幕并将其发送到FTP服务器?我的工作代码将文件保存到HDD
- 我希望QT-App看起来像QT-App,而不是Android-native
- 无法使我的getChar()函数能够工作,我希望它能正常工作,输出IS10而不是2 C
- 为什么我的工作人员线程未收到此信号
- 输入布局,访问违规,错误处理不能像我希望的那样工作