DirectX 11,使用UpdatesUbresource更新常数缓冲区时会引发异常



所以我对DirectX非常新颖,并且正在尝试学习基础知识,但是我的恒定缓冲液遇到了一些问题。我正在尝试将带有三个矩阵的结构发送到Vertex着色器,但是当我尝试使用UpdatesUbresource更新缓冲区时,我会在Demo.exe中获得" exception":0xc0000005:访问侵犯读取位置,在0x710b5df3(d3dd11.dll)上抛出了异常。0x0000003c"。

我的结构:

struct Matracies
{
   DirectX::XMMATRIX projection;
   DirectX::XMMATRIX world;
   DirectX::XMMATRIX view;
};
Matracies matracies;

缓冲区创建:

ID3D11Buffer*  ConstantBuffer = nullptr;
D3D11_BUFFER_DESC Buffer;
memset(&Buffer, 0, sizeof(Buffer));
Buffer.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
Buffer.Usage = D3D11_USAGE_DEFAULT;
Buffer.ByteWidth = sizeof(Matracies);
Buffer.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
D3D11_SUBRESOURCE_DATA data;
data.pSysMem = &matracies;
data.SysMemPitch = 0;
data.SysMemSlicePitch = 0;
Device->CreateBuffer(&Buffer, &data, &ConstantBuffer);
DeviceContext->VSSetConstantBuffers(0, 1, &ConstantBuffer);

更新缓冲区:

DeviceContext->UpdateSubresource(ConstantBuffer, 0, 0, &matracies, 0, 0);

我不确定哪些信息可以解决这个问题,因此让我知道是否缺少任何信息。

欢迎来到DirectX的Wooly World!

调试任何DirectX程序的前两个步骤是:

(1)启用调试设备。请参阅此博客文章。这将在运行时生成其他调试输出,这给出了有关您上面存在的问题的提示。

(2)如果函数返回HRESULT,则必须在运行时检查成功或失败。如果可以安全地忽略返回值,它将返回void。请参阅此页面。

如果您完成了以上两者的操作,则会捕获从上面的CreateBuffer返回的错误,该错误导致ConstantBuffer在调用UpdateSubresource时仍然是NULLPTR。

失败的原因是您一般不能创建一个既是D3D11_USAGE_DEFAULTD3D11_CPU_ACCESS_WRITE的常数缓冲区。默认用法内存通常在视频内存中无法访问CPU。由于您使用的是UpdateSubresource而不是Map,因此应使用:

Buffer.CPUAccessFlags = 0;

您应该查看DirectX工具套件,并且是关联的教程。

相关内容

最新更新