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

私が変更しようとしているのは、データを取得するためにポインタを使用している SetShaderParameters 関数 (これもチュートリアルにあります) に似たものにここで指摘されているように、ポインタを使用してマッピング (バッファから GPU にデータをコピー) する方法です。バッファ内でポインタを使用して直接データをコピーする

基本的には行 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]);

2 つのポインター (p と q など) がある場合にわかったようにp = q;、ポインターをコピーするだけです。指しているデータをコピーしたい場合は、memcpy(p, q, size_of_data);.

于 2012-09-12T06:39:35.473 に答える