显然我有一些关于使用 memcpy 将 vertexBuffers 映射到 GPU 的问题
这是我的初始代码
D3D11_MAPPED_SUBRESOURCE MappedResource;
ID3D11Buffer *pBuffer = s_vertexBuffers.pBuffers[i].Get();
HRESULT hr = s_d3dContext->Map(pBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource);
float *vertices = (float *) MappedResource.pData,
*data = (float *)s_vertexBuffers.pData[i];
int len = s_vertexBuffers.pStrides[i];
if (i != VERTEX_BUFFER::COLOR)
{
len *= total;
}
memcpy(vertices, data, len);
s_d3dContext->Unmap(pBuffer, 0);
我要改变的是使用指针进行映射(将数据从缓冲区复制到 GPU)的方式,就像这里指出的那样,变成类似于 SetShaderParameters 函数(也在教程中),它使用指针来获取数据在缓冲区中并使用指针直接将数据复制到其中
基本上,行 float *vertices = (float *) MappedResource.pData 直到 memcpy(vertices, data, len);
将更改为类似于上述教程指出的内容
这就是我的代码现在的样子
VertexBuffers *dataPtr;
dataPtr = (VertexBuffers *)MappedResource.pData;
dataPtr->pBuffers[i] = s_vertexBuffers.pBuffers[i].Get();
dataPtr->pData[i] = s_vertexBuffers.pData[i];
dataPtr->pSizes[i] = s_vertexBuffers.pSizes[i];
dataPtr->pStrides[i] = s_vertexBuffers.pStrides[i];
if (i != VERTEX_BUFFER::COLOR)
{
dataPtr->pStrides[i] *= total;
}
struct VertexBuffers 和 VERTEX_BUFFER 命名空间内容是
namespace VERTEX_BUFFER
{
enum : int
{
POSITION,
COLOR,
TEXCOORD,
COUNT
};
}
struct VertexBuffers
{
ComPtr<ID3D11Buffer> pBuffers[VERTEX_BUFFER::COUNT];
void* pData[VERTEX_BUFFER::COUNT];
UINT pStrides[VERTEX_BUFFER::COUNT];
UINT pSizes[VERTEX_BUFFER::COUNT];
};
我认为问题是每当我尝试使用指针复制数据时,我都没有像 memcpy 那样考虑 len
由于我目前正在学习 DirectX 和编程,如果我的解释有些不对,请纠正我。
对不起,糟糕的代码和糟糕的编程技巧,以及糟糕的英语,干杯!