std::vector und IndexBuffer
-
Hey!
Was stimmt hier nicht? Es wird nur eine Linie angezeigt.
... // Struct Map struct Vertex { float x, y, z; }; ... Vertex* vertex = new Vertex[4]; std::vector<unsigned short> index; ... // Wo anders direct3DDevice->CreateVertexBuffer(vertices * sizeof(Map::Vertex), D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, &map.direct3DVertexBuffer, NULL); void* vertex; map.direct3DVertexBuffer->Lock(0, vertices * sizeof(Map::Vertex), (void**)&vertex, 0); memcpy(vertex, map.vertex, vertices * sizeof(Map::Vertex)); map.direct3DVertexBuffer->Unlock(); direct3DDevice->CreateIndexBuffer(vertices * sizeof(unsigned short), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &map.direct3DIndexBuffer, NULL); void* indices; map.direct3DIndexBuffer->Lock(0, vertices * sizeof(unsigned short), (void**)&indices, 0); memcpy(indices, &map.index, vertices * sizeof(unsigned short)); //Liegt hier der Fehler? map.direct3DIndexBuffer->Unlock(); ...Hat früher funktioniert, aber seitdem index ein vector ist, gehts nimmer.
MfG
-
memcpy(indices, &map.index, vertices * sizeof(unsigned short)); //Liegt hier der Fehler?was hat map.index für nen typ?
warum verwendest du hier die adresse davon (und bei den vertices nicht)?was für eine art geometrie zeichest du?
linestrip?
wenn nicht solltest du dir mal überlegen, ob du wirklich gleich viele vertices wie indices hast.
-
Hey!
Oh, komisch. So sieht es jetzt aus.
direct3DDevice->CreateVertexBuffer(vertices * sizeof(Map::Vertex), D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, &map.direct3DVertexBuffer, NULL); void* vertex; map.direct3DVertexBuffer->Lock(0, vertices * sizeof(Map::Vertex), (void**)&vertex, 0); memcpy(vertex, map.vertex, vertices * sizeof(Map::Vertex)); map.direct3DVertexBuffer->Unlock(); direct3DDevice->CreateIndexBuffer(38 * sizeof(unsigned short), D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &map.direct3DIndexBuffer, NULL); void* indices; map.direct3DIndexBuffer->Lock(0, 38 * sizeof(unsigned short), (void**)&indices, 0); memcpy(indices, &map.index, 38 * sizeof(unsigned short)); map.direct3DIndexBuffer->Unlock();map.index ist eben dieses std::vector<unsigned short> index;, deshalb schrieb ich oben struct Map dazu.
Funzt immer noch nicht, nur ein horizontaler Strich zu sehen. Soll ein Trianglestrip sein.MfG
-
Du darfst nicht die Adresse des std::vector übergeben!
Im std::vector wird nur eine Adresse gespeichert auf den Bereich, wo die Daten liegen, und die Anzahl der Einträge (vielleicht sonst noch was). Überleg doch mal ... wie soll das gehen?Nimm die Adresse des ersten Elements vom std::vector, also &map.index[0]!
Ich weiß aber nicht, ob man davon sich darauf verlassen darf, dass bei einem std::vector alle Elemente im Speicher hintereinander stehen.
-
Danke, es funktioniert. Allerdings kann man sich ja nicht wirklich drauf verlassen. Alternative?
MfG
-
Doch, man kann sich drauf verlassen:
http://www.parashift.com/c++-faq-lite/containers.html#faq-34.3