DirectX11映射顶点而不使用memcpy

时间:2012-09-12 04:58:03

标签: c++ directx-11

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

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

1 个答案:

答案 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);