显然,我在使用memcpy 将vertex缓冲区映射到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*顶点=(float*)MappedResource.pData直到memcpy(顶点、数据、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;
}
结构体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和编程,如果我的解释有什么不正确的地方,请纠正我。
为糟糕的代码和糟糕的编程技巧感到抱歉,也为糟糕的英语感到抱歉,干杯!
你想要这样的东西吗?
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);
。