0

显然我有一些关于使用 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 和编程,如果我的解释有些不对,请纠正我。

对不起,糟糕的代码和糟糕的编程技巧,以及糟糕的英语,干杯!

4

1 回答 1

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);.

于 2012-09-12T06:39:35.473 回答