DirectX11在不使用memcpy的情况下映射顶点

DirectX11 mapping vertex without using memcpy

本文关键字:情况下 映射 顶点 memcpy DirectX11      更新时间:2023-10-16

显然,我在使用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);

相关文章: