ERLEDIGT
JA
JA
ANTWORTEN
2
2
ZUGRIFFE
295
295
EMPFEHLEN
-
15.10.09 12:17 #1
- Registriert seit
- Mar 2008
- Beiträge
- 147
Hallo!
Ich habe eine Funktion geschrieben, mit der ich Modelle einlesen kann. Wenn dieses Modell aus nur einer Textur besteht, ist dies auch kein Problem. Jetzt habe ich allerdings ein etwas komplizierteres Modell (besteht aus 202 Punkten) und hat 6 unterschiedliche Texturen. Nun muss ich herausfinden, was mit welcher Textur gezeichnet werden soll! Die Datei liegt im .x Format vor.
Hier meine Einlesefunktion:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
bool loadModelFromFile(string path, LPD3DXMESH* pMeshData, int* anzahl, PDIRECT3DTEXTURE9 pTexture[]) { LPD3DXBUFFER pMaterialBuffer; LPD3DXMESH pMesh; DWORD numMaterials; HRESULT hr = D3DXLoadMeshFromX( path.c_str(), D3DXMESH_MANAGED, pD3DDevice, NULL, &pMaterialBuffer, NULL, &numMaterials, &pMesh ); if ( FAILED( hr ) ) { //fehler } D3DXMATERIAL* pMaterials = (D3DXMATERIAL*)pMaterialBuffer->GetBufferPointer(); D3DMATERIAL9 pMeshMaterials[numMaterials]; PDIRECT3DTEXTURE9 ppMeshTextures[numMaterials]; int startpos_counter = 0; for ( DWORD i = 0; i < numMaterials; i++ ) { ppMeshTextures[i]=NULL; pMeshMaterials[i] = pMaterials[i].MatD3D; pMeshMaterials[i].Ambient = pMeshMaterials[i].Diffuse; if( pMaterials[i].pTextureFilename ) { if ( FAILED( D3DXCreateTextureFromFile( pD3DDevice, pMaterials[i].pTextureFilename, &ppMeshTextures[startpos_counter] ) ) ) {//fehler } startpos_counter++; } } if(pMeshData) *pMeshData = pMesh; if(anzahl) *anzahl = numMaterials; if(pTexture) { for(int i = 0; i < startpos_counter;i++)pTexture[i] = ppMeshTextures[i]; } pMaterialBuffer->Release(); return true; }
ich habe mittels writeToLog() folgende Texturennamen ermittelt:
Groundco.jpg
Groundco.jpg
Vegetati.jpg
Fencing_.jpg
Brick_Pa.jpg
smoke.jpg
Cladding.jpg
(ja, die erste ist doppelt)
Weiterhin weiß ich, dass numMaterials = 202 ist.
Um jetzt den 202 Punkten jeweils eine Textur zuzuordnen, habe ich das "i"der for-Schleife immer dann ausgecoutet, wenn er ein Texturnamen gefunden hat.
Ausgabe:
185
187
193
194
195
198
199
ich weiß nicht, ob das Sinn macht....
Aber ich habe jetzt daraus gefolgert, dass von 0-185 die erste, dann die zweite, usw Textur zugeordnet wird.
Obwohl... der erste Abschnitt (bis 185) dürfte gar keine Textur enthalten?
Ich hoffe ihr versteht, was ich da mache, bzw was ich machen will
beim Zeichnen rufe ich dann dies auf:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
int i; for( i = 0; i < 185; i++) { pD3DDevice->SetTexture(0, NULL); meshTest->DrawSubset(i); } for( ; i < 187; i++) { pD3DDevice->SetTexture(0, pMeshTexture[0]); meshTest->DrawSubset(i); } for(; i < 193; i++) { pD3DDevice->SetTexture(0, pMeshTexture[1]); meshTest->DrawSubset(i); } for(; i < 194; i++) { pD3DDevice->SetTexture(0, pMeshTexture[2]); meshTest->DrawSubset(i); } for(; i < 195; i++) { pD3DDevice->SetTexture(0, pMeshTexture[3]); meshTest->DrawSubset(i); } for(; i < 198; i++) { pD3DDevice->SetTexture(0, pMeshTexture[4]); meshTest->DrawSubset(i); } for(; i < 199; i++) { pD3DDevice->SetTexture(0, pMeshTexture[5]); meshTest->DrawSubset(i); } for(; i < 202; i++) { pD3DDevice->SetTexture(0,pMeshTexture[6]); meshTest->DrawSubset(i); }
Ich hoffe ihr könnt mir helfen... Das Modell sieht auf diese Weise sehr "lustig" aus... z.T. passt es _einigermaßen_ z.B. sind alle Fenster weiß und die meisten Hecken grün (eine ist aber blau); Wände sind grün oder weiß.
Insgesamt ist es aber ein "Brei".
Mein Satzbau ist gerade nicht so astrein
Entschuldigung.
Vielen Dank schon einmal,
kickerxy
-
Hallo,
DrawSubset zeichnet doch schon alle Primitive des jeweiligen Subsets. Du musst also nur über alle Subsets laufen, die entsprechenden Texturen und Materialeigenschaften setzen und DrawSubset aufrufen. In etwa so:
Code cpp:1 2 3 4 5
for (UINT i = 0; i < numMaterials; ++i) { pD3DDevice->SetMaterial(&pMeshMaterials[i]); pD3DDevice->SetTexture(0, pMeshTexture[i]); meshTest->DrawSubset(i); }
Grüße, Matthias„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
16.10.09 23:38 #3
- Registriert seit
- Mar 2008
- Beiträge
- 147
danke für deine Antwort!
Ich glaube das Problem lag daran, dass ich noch zwischen dem Laden und dem Zeichnen CreateTexture() hatte. Das hat wohl alles zerstört
Zwar sieht es immer noch nicht richtig aus, aber es liegt vermutlich an meiner .x Datei, die ich -über Umwege- aus Google Sketchup konvertiert habe....
dennoch vielen Dank!
kickerxy





Zitieren

Login






