字节数组初始化会导致 DirectX 崩溃
Byte Array Initialization Causes DirectX to Crash
所以我正在尝试访问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文档:如何创建顶点缓冲区
作为 DirectX11 的新手,您应该查看 DirectX 工具包。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 程序崩溃并显示"std::out_of_range"错误
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 为什么所有C++编译器都会崩溃或挂起此代码
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我的多线程作业队列崩溃
- 如何在directx/c++中进行平移/缩放操作
- ExtractIconEx:可以工作,但偶尔会崩溃
- 为什么引用传递会导致此崩溃(C++)
- 试图创建流或fopen时程序崩溃
- 类对象数组的问题会导致崩溃
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 字节数组初始化会导致 DirectX 崩溃
- 如何处理 DirectX 11 驱动程序崩溃
- DirectX崩溃最小化
- DirectX 11:运行简单DirectX应用程序时运行时崩溃
- 清理DirectX应用程序时崩溃