我有一个std::vector<MyVertex>
,其中MyVertex
是一个结构。我必须将此数据推送到Direct3D 9中的顶点缓冲区,我见过的示例使用memcpy
。不幸的是,memcpy
崩溃了我的申请,所以我肯定做错了。
std::vector<MyVertex> m_VertsBuff0;
void* vbPtr;
vertexbuffer->Lock (0, 0, &vbPtr, D3DLOCK_DISCARD);
memcpy (vbPtr, &m_VertsBuff0[0], sizeof(m_VertsBuff0)); // also tried sizeof(MyVertex)*m_VertsBuff0.size()
// std::copy(m_VertsBuff0.begin(), m_VertsBuff0.end(), vbPtr); // gives a compiler error void* unknown size
vertexbuffer->Unlock ();
device->SetStreamSource (0, vertexbuffer, 0, sizeof(m_VertsBuff0[0]));
更新:
这在我刚使用array
而不是vector
之前就已经开始了。我似乎不必首先初始化void*
,因为这个例子工作得很好。然后我将其更改为vector
并且出错了。为什么我必须突然初始化void*
,这样做仍然会导致我的应用程序崩溃。
memcpy (vbPtr, m_VertsBuff0.data(), sizeof(MyVertex) * m_VertsBuff0.size());
答案 0 :(得分:1)
使用m_VertsBuff0.size() * sizeof(MyVertex)
代替sizeof(m_VertsBuff0)
并确保'vbPtr'指向正确分配的内存,例如:
void* vbPtr = new char[v.size() * sizeof(int)];
答案 1 :(得分:0)
您必须初始化您的vbPtr;
void* vbPtr = new char[v.size() * sizeof(MyVertex)];
memcpy (vbPtr, v.data(), v.size() * sizeof(MyVertex));
答案 2 :(得分:0)
嗯,我想你必须在调用map
之前将vbPtr初始化为NULL