【问题标题】:DirectX 11, exception thrown when updating constant buffer with UpdateSubresourceDirectX 11,使用 UpdateSubresource 更新常量缓冲区时引发异常
【发布时间】:2018-12-19 18:34:19
【问题描述】:

所以我对 DirectX 非常陌生,并且正在尝试学习基础知识,但是我的常量缓冲区遇到了一些问题。我正在尝试将具有三个矩阵的结构发送到顶点着色器,但是当我尝试使用 UpdateSubresource 更新缓冲区时,我得到“在 Demo.exe 中的 0x710B5DF3 (d3d11.dll) 处引发异常:0xC0000005:访问冲突读取位置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);

我不确定哪些信息与解决此问题相关,因此如果缺少任何信息,请告诉我。

【问题讨论】:

    标签: buffer directx-11


    【解决方案1】:

    欢迎来到 DirectX 的毛茸茸的世界!

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

    (1) 启用调试设备。见this blog post。这将在运行时生成额外的调试输出,提供有关上述问题的提示。

    (2) 如果函数返回HRESULT,您必须在运行时检查它是否成功。如果忽略返回值是安全的,它将返回void。见this page

    如果您完成了上述任何一项或两项操作,您就会发现从上面的CreateBuffer 返回的错误导致当您调用UpdateSubresourceConstantBuffer 仍然是一个nullptr。

    失败的原因是您一般不能创建一个既是D3D11_USAGE_DEFAULT 又是D3D11_CPU_ACCESS_WRITE 的常量缓冲区。 DEFAULT 使用内存通常位于 CPU 无法访问的视频内存中。由于您使用的是UpdateSubresource 而不是Map,因此您应该只使用:

    Buffer.CPUAccessFlags = 0;
    

    您应该查看DirectX Tool Kit 及其相关教程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 2016-03-05
      相关资源
      最近更新 更多