我在名为 ModelClass 的类中有一个函数,它执行以下操作:
bool ModelClass::SetVertices(ID3D11Device* device, VertexType* vertices)
{
// Error catching variable
HRESULT result;
// Setup the vertex buffer description
D3D11_BUFFER_DESC vertexBufferDesc;
ZeroMemory(&vertexBufferDesc, sizeof(vertexBufferDesc));
vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
vertexBufferDesc.ByteWidth = sizeof(vertices)*24;
vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vertexBufferDesc.CPUAccessFlags = 0;
vertexBufferDesc.MiscFlags = 0;
//vertexBufferDesc.StructureByteStride = 0;
// Give the subresource structure a pointer to the vertex data.
D3D11_SUBRESOURCE_DATA vertexData;
ZeroMemory(&vertexData, sizeof(vertexData));
vertexData.pSysMem = vertices;
vertexData.SysMemPitch = 0;
vertexData.SysMemSlicePitch = 0;
// Create the Vertex Buffer
result = device->CreateBuffer(&vertexBufferDesc, &vertexData, &m_vertexBuffer);
if (FAILED(result))
{
return false;
}
return true;
}
运行它,给我一条错误消息“Engine.exe 中 0x00E445A2 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000000。”,visual studio 指向 result = ...
线。在我的一生中,我无法弄清楚为什么要这样做。我什至不知道还要发布什么,所以我将列举一些我认为相关的内容:
ModelClass::ModelClass(ID3D11Device* device, VertexType* vertices, unsigned long* indices)
{
m_vertexBuffer = 0;
m_indexBuffer = 0;
SetVertices(device, vertices);
SetIndices(device, indices);
}
- 正在使用
ModelClass* cube1 = new ModelClass(d3d11Device, v, indices);
定义类,在全局范围内(目前),构造函数在上面的代码框中。 m_vertexBuffer
变量声明为ID3D11Buffer *m_vertexBuffer
在类头文件中,并在类构造函数中初始化为零。- Visual Studio 2013、Windows 8.1 64 位上的 DirectX 11
- 如果我将 SetVertices 函数的内容复制到我的主文件(其中包含大部分设置),它会立即运行而不会出现此错误。仅当我从类内部调用 CreateBuffer 时才会发生。这与我的索引缓冲区的工作方式完全相同,这表明它不是顶点结构的问题
- 类的所有函数和变量都是公开的
- CreateBuffer 仍然会抛出该异常,即使它的一个、多个或所有参数都设置为 NULL(即我认为这不是 m_vertexBuffer、数据或缓冲区描述的问题)
- 我的主要猜测是它与类如何使用这些函数有关,但我找不到我的代码有任何问题
拜托,如果您想查看其余文件,请发表评论,如果有必要,我会把整个文件粘贴进来,这已经让我感到沮丧了
最佳答案
很棒的网站,RasterTek .
无论如何,问题是你在全局范围内初始化这个东西——在 d3d11Device
被初始化之前。当程序以任意顺序启动时,在全局范围内声明的所有内容都会立即创建。另一方面,d3d11Device
在程序启动时并未初始化。
将其移出全局范围或重新添加教程中的Initialize
函数。问题解决了。
关于c++ - CreateBuffer 抛出 "Access violation reading location",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21223337/