字节数组初始化导致DirectX崩溃
Byte Array Initialization Causes DirectX to Crash
所以我正在尝试访问 GPU 上的顶点缓冲区。具体来说,我需要对顶点进行一些计算。因此,为了做到这一点,我尝试从 GPU 映射资源(顶点缓冲区),并将其复制到系统内存中,以便 CPU 可以访问顶点。我使用以下 SO 线程将代码放在一起:How to read vertices from vertex buffer in 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
returns 相当大。它 returns 343597386。根据我在下面列出的文档,它指出 DepthPitch 的 return 值是以字节为单位的 returned。如果我用更小的数字(如 10)替换初始化值,代码运行得很好。从我在这里读到的关于 Map() 函数的内容:https://docs.microsoft.com/en-us/windows/win32/api/d3d11/ns-d3d11-d3d11_mapped_subresource
它指出:
Note The runtime might assign values to RowPitch and DepthPitch that
are larger than anticipated because there might be padding between
rows and depth.
这可能与正在 returned 的大值有关吗?如果是这样,是否意味着我必须解析 DepthPitch 以删除任何不需要的数据?或者可能是 vert 初始化方式的问题?
没有顶点缓冲区绑定,因此您的 IAGetVertexBuffers
无法 return 任何事情。您必须创建一个 VB.
见Microsoft Docs: How to Create a Vertex Buffer
As someone new to DirectX 11, you should take a look at DirectX Tool Kit.
所以我正在尝试访问 GPU 上的顶点缓冲区。具体来说,我需要对顶点进行一些计算。因此,为了做到这一点,我尝试从 GPU 映射资源(顶点缓冲区),并将其复制到系统内存中,以便 CPU 可以访问顶点。我使用以下 SO 线程将代码放在一起:How to read vertices from vertex buffer in 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
returns 相当大。它 returns 343597386。根据我在下面列出的文档,它指出 DepthPitch 的 return 值是以字节为单位的 returned。如果我用更小的数字(如 10)替换初始化值,代码运行得很好。从我在这里读到的关于 Map() 函数的内容:https://docs.microsoft.com/en-us/windows/win32/api/d3d11/ns-d3d11-d3d11_mapped_subresource
它指出:
Note The runtime might assign values to RowPitch and DepthPitch that are larger than anticipated because there might be padding between rows and depth.
这可能与正在 returned 的大值有关吗?如果是这样,是否意味着我必须解析 DepthPitch 以删除任何不需要的数据?或者可能是 vert 初始化方式的问题?
没有顶点缓冲区绑定,因此您的 IAGetVertexBuffers
无法 return 任何事情。您必须创建一个 VB.
见Microsoft Docs: How to Create a Vertex Buffer
As someone new to DirectX 11, you should take a look at DirectX Tool Kit.