Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.08.2009, 11:39

[gelöst]Modelle zeichnen (DrawSubset()) - Texturenbug

Hallo!

also ich habe bereits eine Render()- Routine, die auch ohne Probleme Primitive zeichnet (DrawPrimitiveUP()). Wenn ich nun aber ein Modell mitzeichnen möchte (mittels DrawSubset()) werden alle Texturen "verbuggt", d.h. z.B. der Boden, der vorher aus einer Rasentextur bestand, wird einheitlich grün! Das Modell wird allerdings gezeichnet (simple Kugel).

hier meine Zeichenroutine:

C-/C++-Quelltext

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
bool DrawScene(void)
{

pD3DDevice->LightEnable(0,FALSE);
pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
pD3DDevice->BeginScene();
if(FAILED(pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,63),1.0f,0)))
{
         MessageBox(NULL, "Fehler beim Leeren des Bildpuffers oder Z-Puffers",
         "Fehler",MB_OK|MB_ICONEXCLAMATION);
        writeToLog("Fehler beim Leeren des Bildpuffers oder Z-Puffers");
         return false;              
}
pD3DDevice->SetTexture(0, pTreeTexture);
if(FAILED(pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,
                                                1,                           //anzahl der Dreiecke

                                                triangleVertex,
                                                sizeof(SVertex))))
{
        ccout("Fehler beim Zeichnen. Ungültige Vertices oder Formate?");
        writeToLog("Fehler beim Zeichnen. Ungültige Vertices oder Formate? Oder Szene wurde nicht ordnungsgemäß geöffnet/ geschlossen!");
        return false;            
}
pD3DDevice->SetTexture(0, pGroundTexture);
if(FAILED(pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,
                                                1,                           //anzahl der Dreiecke

                                                ground,
                                                sizeof(SVertex))))
{
        ccout("Fehler beim Zeichnen. Ungültige Vertices oder Formate?");
        writeToLog("Fehler beim Zeichnen. Ungültige Vertices oder Formate? Oder Szene wurde nicht ordnungsgemäß geöffnet/ geschlossen!");
        return false;              
}
//pD3DDevice->SetTexture(0, pMesh);

for(int i = 0; i < meshCounter; i++)
{
//meshTest->DrawSubset(i);

}

pD3DDevice->EndScene();

pD3DDevice->Present(NULL, NULL, NULL, NULL);
return true;
}


ich bin sicher ihr könnt mir helfen ;) Wenn ihr noch weitere Informationen braucht, könnt ihr die haben ;)

lg und danke
kickerxy

2

14.08.2009, 11:52

Erstmal solltest du BeginScene nach Device->Clear setzen.
Das wird allerdings nicht die Lösung deines Problems sein.

Hast du die Kugel mittels DX-Funktion (D3DXCreateSphere) erstellt?
Dann besitzen die nämlich keine Texturkoordinaten.
fka tm

3

14.08.2009, 12:44

nein, ich habe diese Funktion zum Laden genommen

C-/C++-Quelltext

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
ool 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 ) ) 
{
writeToLog("D3DXLoadMeshFromX – Failed"); 
return false;
}

D3DXMATERIAL* pMaterials = (D3DXMATERIAL*)pMaterialBuffer->GetBufferPointer();
D3DMATERIAL9 pMeshMaterials[numMaterials]; 
PDIRECT3DTEXTURE9 ppMeshTextures[numMaterials];

for ( DWORD i = 0; i < numMaterials; i++ ) 
{
pMeshMaterials[i] = pMaterials[i].MatD3D; 
pMeshMaterials[i].Ambient = pMeshMaterials[i].Diffuse; 
 
if( pMaterials[i].pTextureFilename ) 
{
if ( FAILED( D3DXCreateTextureFromFile( pD3DDevice, pMaterials[i].pTextureFilename, &ppMeshTextures[i] ) ) ) 
{
writeToLog("Failed to load mesh texture"); 
return false;
}
}
}
if(pMeshData) *pMeshData = pMesh;
if(anzahl)    *anzahl    = numMaterials; 
if(pTexture)  *pTexture  = ppMeshTextures[0];
pMaterialBuffer->Release();
return true;
}

Die Textur des Modells ist mir auch (erstmal) egal, ich hab auch mal pMesh auf Null gesetzt (dann ist es ja weiß), aber die anderen Texturen gehen ja dabei kaputt, die mit DrawPrimitiveUP gezeichnet werden :?

Reihenfolge habe ich geändert.

#edit habe grade 2 screenshots erstellt:
http://img20.imageshack.us/gal.php?g=bild1vau.jpg
Das erste Bild ist korrekt (aber ohne Kugel) Das Zweite, ohne Texturen, aber dafür wird die Kugel angezeigt

4

14.08.2009, 13:05

Im Modelviewer (z.B. den von DirectX) wird das Modell inkl. Texturen korrekt dargestellt?

Mit deinem ZBuffer alles Ok?
(Bufferformat, ZWriteEnabled usw.)

Setzt du das Material und die Textur entsprechend vor DrawSubset?

Hast du die TextureStageStates und Renderstates gesetzt?

Zum Beispiel:

C-/C++-Quelltext

1
2
3
Device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
Device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TEXTURE );
Device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
fka tm

5

14.08.2009, 18:19

Okay, du hattest Recht, es lag an den RenderStates, danke dir ;)
hm mit welchen Funktionen kann ich denn diese Modelle bearbeiten, also verschieben, verkleinern etc?


mfg kickerxy123

6

14.08.2009, 18:32

Verschieben etc. via Matrixfunktionen:

D3DXMatrixScaling
D3DXMatrixTranslation
D3DXMatrixRotationYawPitchRoll
usw.

Das Geraffel multiplizieren:

D3DXMatrixMultiply

Matrix setzen:
Device->SetTransform(D3DTS_WORLD, &World);
fka tm

7

14.08.2009, 20:30

cool =) ich muss echt aufm Schlauch gestanden haben, als ich mit DirectX angefangen habe.. Jetzt habe ich das System mit Matrizen, Vektoren, RenderStates, Texturen usw WESENTLICH besser verstanden =)

Jetzt grade kommt mir die Frage, wie ich ein Modell verschiebe, etc. gradezu lächerlich vor.

Bei mir hats grad einfach "klick" gemacht (naja nachdem ich n bissl mehr gelesen habe ;) )

Das ist ja unwahrscheinlich genial mit diesen Matrizen und den Kombinationen (View, Projektion, World) :D

Naja ich bin ja noch am lernen. Ich hab mir als Ziel gesetzt in 2-3 Jahren nen gutes Spiel programmieren zu können. Cpp- Kenntnisse habe ich schon seit 3/4 Jahren.

Danke jedenfalls für dein Posting, hat mir geholfen die DirectX Logik zu verstehen =)

lg kickerxy

8

14.08.2009, 22:00

Jou, hau rein! ;)
Werden zwar noch etliche Stolpersteine kommen, aber wenn du dein momentanes Engagement durchhälst, sehe ich da keine Probleme.
Ok, ein paar kleine vielleicht. Deine Ordnung z.B.. ;)
fka tm

9

14.08.2009, 22:34

Zitat von »"TrikkieMikkie"«

Ok, ein paar kleine vielleicht. Deine Ordnung z.B.. ;)


Da musste ich glatt grinsen :D

Aber Recht hast du ;=) na mal sehen

Werbeanzeige