所以我对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_DEFAULT
和D3D11_CPU_ACCESS_WRITE
的常数缓冲区。默认用法内存通常在视频内存中无法访问CPU。由于您使用的是UpdateSubresource
而不是Map
,因此应使用:
Buffer.CPUAccessFlags = 0;
您应该查看DirectX工具套件,并且是关联的教程。