tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
295
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    kickerxy123 kickerxy123 ist offline Mitglied Gold
    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
     

  2. #2
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.800
    Blog-Einträge
    5
    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

  3. #3
    kickerxy123 kickerxy123 ist offline Mitglied Gold
    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