Ja, ich habe noch einen anderen Thread am laufen :)
Aber dieses Thema hier hat absolut nichts mit meiner anderen Frage zu tun, also vergebt mir wenn ich einen extra Thread dafür eröffne.
Ich benutze ASSIMP um unter DirectX10 (C++) ein .x -File zu lesen und die darin enthaltene Geometrie zu rendern.
Da es mir zu Beginn sehr schwer fand mich einzulesen habe ich mich entschlossen ein File zu laden dass eine Kugel enthält, die nur aus einem Mesh besteht.
So umgehe ich erstmal die ganzen dynamischen Anpassungen und mach alles "von Hand", um ein wenig damit experimentieren zu können, und implementiere das später anständig.
Es ist mir gelungen Vertex und Indexdaten zu extrahieren, Vertexdaten auch offensichtlich richtig, wenn ich sie POINTLIST rendere erhalte ich eine Kugel (bestehend aus Punkten natürlich).
Wenn ich nun aber meine extrahierten Indices dazu nehme, und DrawIndexed verwende, kommt Murks raus. Es funktioniert, aber das Ergebniss ist keine Kugel, gerade so als würden Vertices und Indices nicht zusammenpassen.
Hier mein (etwas unschöner) Code:
erst die Vertices:
Code: Alles auswählen
scene = importer.ReadFile("kugel.x",
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType);
if (!scene)
ISENEXCEPTION("importer.ReadFile");
const aiMesh* mesh = scene->mMeshes[0]; // Der Einfachheit halber erstmal nur Mesh[0] auslesen
m_numVertices = mesh->mNumVertices;
m_numFaces = mesh->mNumFaces;
// Vertexbuffer erstellen
D3D10_BUFFER_DESC vbd;
vbd.Usage = D3D10_USAGE_DYNAMIC;
vbd.ByteWidth = sizeof(VERTEX) * m_numVertices; // grösse des buffer abhängig von anzahl d. vertices und grösse d. vertexstruktur
vbd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
vbd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
vbd.MiscFlags = 0;
if(FAILED(m_pDevice->CreateBuffer(&vbd, NULL, &m_vertexBuffer)))
ISENEXCEPTION("m_pDevice->CreateBuffer");
// Vertices erstellen
void* pVoid;
VERTEX *Vertices = new VERTEX[m_numVertices];
for(int a = 0; a < m_numVertices; ++a)
{
Vertices[a].Position.x = mesh->mVertices[a].x;
Vertices[a].Position.y = mesh->mVertices[a].y;
Vertices[a].Position.z = mesh->mVertices[a].z;
Vertices[a].Color = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);
}
// Kopiere Vertices in Vertexbuffer
if(FAILED(m_vertexBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &pVoid))) // map the index buffer
ISENEXCEPTION("m_vertexBuffer->Map");
memcpy(pVoid, Vertices, sizeof(VERTEX)*m_numVertices ); // copy the indices to the buffer
m_vertexBuffer->Unmap();
delete Vertices;
Vertices = NULL;
bis hierhin scheint alles gut zu laufen, die Daten passen zumindest mal....
nun die Indices (selbe Funktion)
Code: Alles auswählen
// Indexbuffer erstellen
D3D10_BUFFER_DESC ibd;
ibd.Usage = D3D10_USAGE_DYNAMIC;
ibd.ByteWidth = sizeof(DWORD) * m_numFaces*3; // welche grösse -> wie viele indices *2 wegen doppelt so vielen dreiecken
ibd.BindFlags = D3D10_BIND_INDEX_BUFFER;
ibd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
ibd.MiscFlags = 0;
m_pDevice->CreateBuffer(&ibd, NULL, &m_indexBuffer);
// Extrahiere Indices
DWORD* Indices = new DWORD[m_numFaces*3];
int tmp = 0;
for(int a = 0; a < m_numFaces; ++a)
{
Indices[tmp] = mesh->mFaces[a].mIndices[0];
Indices[tmp+1] = mesh->mFaces[a].mIndices[1];
Indices[tmp+2] = mesh->mFaces[a].mIndices[2];
tmp+=3;
}
// Kopiere Indices in Indexbuffer
m_indexBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &pVoid); // map the index buffer
memcpy(pVoid, Indices, sizeof(Indices)); // copy the indices to the buffer
m_indexBuffer->Unmap();
delete Indices;
Indices = NULL;
Aber egal wie oft ich das kontrolliere, für mich macht es absolut Sinn. Vielleicht habe ich auch einfach etwas falsch verstanden?