どうやら 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 とプログラミングを学んでいるので、私の説明が正しくない場合は修正してください。
下手なコードと下手なプログラミング スキル、そして下手な英語でごめんなさい、乾杯!