字节数组初始化会导致 DirectX 崩溃

Byte Array Initialization Causes DirectX to Crash

本文关键字:DirectX 崩溃 字节数 数组 初始化 字节      更新时间:2023-10-16

所以我正在尝试访问GPU上的顶点缓冲区。具体来说,我需要对顶点进行一些计算。因此,为了做到这一点,我尝试从 GPU 映射资源(顶点缓冲区(,并将其复制到系统内存中,以便 CPU 可以访问顶点。我使用以下 SO 线程将代码放在一起:如何从 Direct3d11 中的顶点缓冲区读取顶点

这是我的代码:

HRESULT hr = pSwapchain->GetDevice(__uuidof(ID3D11Device), (void**)&pDevice);
if (FAILED(hr))
return false;
pDevice->GetImmediateContext(&pContext);
pContext->OMGetRenderTargets(1, &pRenderTargetView, nullptr);
//Vertex Buffer
ID3D11Buffer* veBuffer;
UINT Stride;
UINT veBufferOffset;
pContext->IAGetVertexBuffers(0, 1, &veBuffer, &Stride, &veBufferOffset);
D3D11_MAPPED_SUBRESOURCE mapped_rsrc;
pContext->Map(veBuffer, NULL, D3D11_MAP_READ, NULL, &mapped_rsrc);
void* vert = new BYTE[mapped_rsrc.DepthPitch];     //DirectX crashes on this line...
memcpy(vert, mapped_rsrc.pData, mapped_rsrc.DepthPitch);
pContext->Unmap(veBuffer, 0);

在C++方面,我有点新手。所以我的假设可能是不正确的。初始化值

mapped_rsrc.DepthPitch  

回报相当大。它返回343597386。根据我在下面列出的文档,它指出 DepthPitch 的返回值以字节为单位返回。如果我用一个小得多的数字(如 10(替换初始化值,代码运行良好。从我在这里读到的关于 Map(( 函数的内容来看:https://learn.microsoft.com/en-us/windows/win32/api/d3d11/ns-d3d11-d3d11_mapped_subresource

它指出:

注意 运行时可能会将值分配给 RowPitch 和 DepthPitch 比预期的要大,因为两者之间可能有填充 行和深度。

这可能与返回的大值有关吗?如果是这样,这是否意味着我必须解析 DepthPitch 来删除任何不需要的数据?或者也许是 vert 初始化方式的问题?

没有顶点缓冲区绑定,因此您的IAGetVertexBuffers无法返回任何内容。您必须创建一个 VB。

请参阅Microsoft文档:如何创建顶点缓冲区

作为 DirectX

11 的新手,您应该查看 DirectX 工具包。