по-видимому, у меня есть проблема с отображением vertexBuffers в GPU с использованием memcpy
Это мой начальный код
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 (также в учебнике), которая использует указатель для получения данных в буфере и копирует данные напрямую, используя указатель в него
В основном, линия
float * vertices = (float *) MappedResource.pData
до тех пор
memcpy (вершины, данные, длина);
будет изменен на что-то вроде вышеупомянутого урока
Вот как сейчас выглядит мой код
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];
};
Я думаю, что проблема заключается в том, что всякий раз, когда я пытаюсь скопировать данные с помощью указателя, я не принимаю во внимание len, как это делает memcpy
Поскольку я сейчас изучаю 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;
делает, это скопировать указатель. Если вы хотите скопировать данные, на которые указывают, вы должны написать memcpy(p, q, size_of_data);
,
Других решений пока нет …