显然我有一些关于使用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中)的方式,就像在here上指向类似于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和编程,如果对我的解释有些不对,请纠正我。
对不好的代码和错误的编程技巧以及糟糕的英语,干杯!
答案 0 :(得分:0)
所以你想要这样的东西?
VertexBuffers *dataPtr;
dataPtr = (VertexBuffers *)MappedResource.pData;
dataPtr->pBuffers[i] = s_vertexBuffers.pBuffers[i].Get();
dataPtr->pSizes[i] = s_vertexBuffers.pSizes[i];
dataPtr->pStrides[i] = s_vertexBuffers.pStrides[i];
if (i != VERTEX_BUFFER::COLOR)
{
dataPtr->pStrides[i] *= total;
}
memcpy(dataPtr->pData[i], s_vertexBuffers.pData[i], dataPtr->pStrides[i]);
当你发现有两个指针(比如p和q)时,所有p = q;
都会复制指针。如果要复制指向的数据,则应编写memcpy(p, q, size_of_data);
。