0

我有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]));

更新:
这在我刚刚使用 aarray而不是vector. 似乎我不必void*首先初始化,因为该示例运行良好。然后我把它改成a vector,它出错了。为什么我必须void*突然初始化并且这样做仍然会使我的应用程序崩溃。

memcpy (vbPtr, m_VertsBuff0.data(), sizeof(MyVertex) * m_VertsBuff0.size());
4

3 回答 3

1

使用m_VertsBuff0.size() * sizeof(MyVertex)代替sizeof(m_VertsBuff0) 并确保“vbPtr”指向正确分配的内存,例如:

void* vbPtr = new char[v.size() * sizeof(int)];
于 2013-08-27T08:10:06.217 回答
0

你必须初始化你的 vbPtr;

  void* vbPtr = new char[v.size() * sizeof(MyVertex)];
  memcpy (vbPtr, v.data(), v.size() * sizeof(MyVertex));
于 2013-08-27T08:11:57.430 回答
0

嗯,我认为您必须在调用 map 之前将 vbPtr 初始化为 NULL

于 2013-08-27T18:06:32.033 回答