[dx9/c++]Modelltexturierung

kickerxy123

Erfahrenes Mitglied
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:
C++:
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:
C++:
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:
C++:
for (UINT i = 0; i < numMaterials; ++i) {
  pD3DDevice->SetMaterial(&pMeshMaterials[i]);
  pD3DDevice->SetTexture(0, pMeshTexture[i]);
  meshTest->DrawSubset(i);
}

Grüße, Matthias
 
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
 
Zurück