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

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

1

08.08.2004, 18:40

Problem mit EMM-Files!

Hi!

Ich habe heute mal das EMM-SDK angesachaut und wollte es sofort mal austesten! Also hab ich ein Projekt mit der TriBase-Engine geöffnet und den Code eingebaut! Das mitgelieferte Modell wurde auch schon erfolgreich gerendert nur, wenn ich jetzt ein anderes Objekt rendern möchte, zum Beispiel ein Dreieck, dann hat es die falsche Textur, also am besten ich zeig hier mal meine Renderfunktion, damit ihr wisst, was ich meine:

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Render-Funktion

tbResult CFocus::Render(float fNumSecsPassed)
{
    HRESULT     hResult;
    tbMatrix    mRotation, mRotationX;      // Rotationsmatrix

    tbMatrix    mTranslation;   // Translationsmatrix

    tbMatrix    mWorld;         // Vereinende Weltmatrix

    tbMatrix    mCamera;
    

    mCamera = tbMatrixCamera(tbVector3(0.0f, 0.0f, 0.0f ),
                             tbVector3(0.0f, 0.0f, 1.0f ),
                             tbVector3(0.0f, 1.0f, 0.0f));


    // Rotations- und Translationsmatrix des Dreiecks erzeugen

    mRotation = tbMatrixRotationY(TB_DEG_TO_RAD(0.0f));
    mRotationX = tbMatrixRotationX(TB_DEG_TO_RAD(0.0f));
    mTranslation = tbMatrixTranslation(tbVector3(0.0f, 0.0f, Entfernung + 1.0f));
    
    // Beide Matrizen kombinieren und als Weltmatrix einsetzen

    mWorld = mRotation * mRotationX*mTranslation * mProjection;
    tbDirect3D::GetDevice()->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));
    

    // -------------------------------------------------------------

    /// Den Bildpuffer und den Z-Buffer leeren

    if(FAILED(hResult = tbDirect3D::GetDevice()->Clear(0,
                                            NULL,
                                            D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                                            D3DCOLOR_XRGB(0, 0, 63),
                                            1.0f,
                                            0)))
    {
        // Fehler beim Leeren!

        MessageBox(g_hWindow, "Fehler beim Leeren der Puffer!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }

        
    tbDirect3D::GetDevice()->SetRenderState( D3DRS_LIGHTING,FALSE);
    tbDirect3D::GetDevice()->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
    // Szene beginnen

    tbDirect3D::GetDevice()->BeginScene();

    tbDirect3D::GetDevice()->SetStreamSource(0, g_pDreieckVB->GetVB(),0,
                                             sizeof(SVertex));

    tbDirect3D::GetDevice()->SetIndices(g_pDreieckB->GetIB());

    tbDirect3D::SetTexture(0,g_pTexture);
    

    // Nun das Dreieck zeichnen

    if(FAILED(hResult = tbDirect3D::GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,   // Dreiecksliste

                                                      0,0,3,0, 1))) // Vertexgröße

    {
        // Fehler beim Zeichnen!

        MessageBox(g_hWindow, "Fehler beim Zeichnen des Dreiecks!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult, TB_STOP);
    }

    tbDirect3D::GetDevice()->EndScene();

     // Update the world state according to user input

    D3DXMATRIX matWorld;
    D3DXMATRIX matRotY;
    D3DXMATRIX matRotX;

    D3DXMatrixRotationX( &matRotX, 0 );
    D3DXMatrixRotationY( &matRotY, 0 );

    D3DXMatrixMultiply( &matWorld, &matRotX, &matRotY );
    
    if(GetAsyncKeyState(VK_UP))
        Entfernung += 1.0f;
    if(GetAsyncKeyState(VK_DOWN))
        Entfernung -= 1.0f;


    matWorld._41 = 0.0f;
    matWorld._42 = 0.0f;
    matWorld._43 = Entfernung + 400.0f;
    tbDirect3D::GetDevice()->SetTransform( D3DTS_WORLD, &matWorld );

        
    
    tbDirect3D::GetDevice()->SetRenderState( D3DRS_LIGHTING, TRUE );
    
        
    p_scene->getRootObject()->playAnimation("scene", TRUE, emmloader::AM_LOOP);
    p_scene->getRootObject()->move(g_fTime);
        

    tbDirect3D::GetDevice()->BeginScene();
    D3DXMATRIX m_View;
    m_View._11 = mProjection.m11;
    m_View._12 = mProjection.m12;
    m_View._13 = mProjection.m13;
    m_View._14 = mProjection.m14;
    m_View._21 = mProjection.m21;
    m_View._22 = mProjection.m22;
    m_View._23 = mProjection.m23;
    m_View._24 = mProjection.m24;
    m_View._31 = mProjection.m31;
    m_View._32 = mProjection.m32;
    m_View._33 = mProjection.m33;
    m_View._34 = mProjection.m34;
    m_View._41 = mProjection.m41;
    m_View._42 = mProjection.m42;
    m_View._43 = mProjection.m43;
    m_View._44 = mProjection.m44;


    emmloader::beginFrame(&m_View);
    p_scene->getRootObject()->render();
    
    // Szene beenden

    tbDirect3D::GetDevice()->EndScene();

    // Der große Moment: den Bildpuffer sichtbar machen

    tbDirect3D::GetDevice()->Present(NULL, NULL, NULL, NULL);

    return TB_OK;
}


Also das Dreieck wird gerendert, eben nur mit der falschen Textur, wobei ich eigentlich die richtige Textur setzten würde, wenn ich aber das Rendern von dem emm-Modell weg lasse, funktioniert es! Was mach ich den falsch? thx


cya,
Stefan

2

09.08.2004, 01:11

Ein paar sachen vorweg:
1) Es kostet unmenge an Zeit wenn man pro Frame mehrmals BeginScene und EndScene aufruft. Steht extra groß und breit in der Doku.

2) Die Typen D3DXMATRIX und tbMatrix sind kompatible. Du must sie also nicht extra umkopieren. Eine Typkonvertierung reicht dicke aus.

3) Die Projections-Matrix ist nicht Teil der World-Matrix. Das ist wichtig da die Reihenfolge der Matrix-Multiplkation nicht egal ist.


Ansonsten kann ich keinen Fehler entdecken. Vieleicht später noch einmal :)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

09.08.2004, 01:55

Ruf mal vor dem Rendern des Dreiecks tbDirect3D::Capture auf.

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

4

09.08.2004, 10:15

Zitat

Ein paar sachen vorweg:
1) Es kostet unmenge an Zeit wenn man pro Frame mehrmals BeginScene und EndScene aufruft. Steht extra groß und breit in der Doku.


Ja, ist mir eigentlich klar, nur beim Testen ist das durch ewiges herumprobieren passiert, hauptsächlich weil mir aufgefallen ist, wenn ich BeginScene und EndScene vor und nach dem Modell-Rendern weg lasse, es trozdem gezeichnet wird!

Zitat


2) Die Typen D3DXMATRIX und tbMatrix sind kompatible. Du must sie also nicht extra umkopieren. Eine Typkonvertierung reicht dicke aus.

Sorry, ich weiß nicht genau, wie das funktioniert...da die Funktion emmloader::beginFrame(&m_View); ja einen Parameter von D3DXMATRIX benötigt, wie kann ich da einfach die tbMatrix verwenden?

Zitat


3) Die Projections-Matrix ist nicht Teil der World-Matrix. Das ist wichtig da die Reihenfolge der Matrix-Multiplkation nicht egal ist.

thx, also so mWorld = mRotation * mRotationX*mTranslation ;

Zitat


Ruf mal vor dem Rendern des Dreiecks tbDirect3D::Capture auf.

Hat leider nichts geändert!


hm, könnte es sonst vielleicht noch sein, das ich es falsch inizialisiere:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
emmloader::initialize(tbDirect3D::GetDevice());

    p_scene = new emmloader::Scene("scene.emm");
    if(p_scene->getError())
    {
        MessageBox(GetActiveWindow(), p_scene->getError(), "Error", MB_OK | MB_ICONEXCLAMATION);
        return TB_ERROR;
    }



C-/C++-Quelltext

1
emmloader::beginFrame(&m_View); 

Was macht das eingtlich ganz genau? Vielleicht hab ich da was falsch verstanden, wenn man es auskommentiert, ist trozdem noch alles gleich?


Ansonsten hab ich jetzt keine Ahnung mehr, was ich noch so alles ausprobieren könnte....

Hoffe ihr könnt mir weiterhelfen:)


cya,
Stefan

5

09.08.2004, 17:59

Zitat

Sorry, ich weiß nicht genau, wie das funktioniert...da die Funktion emmloader::beginFrame(&m_View); ja einen Parameter von D3DXMATRIX benötigt, wie kann ich da einfach die tbMatrix verwenden?
??? Bitte Buch holen und nach "Variablen Konvertierung" oder "Cast" nachschauen. Das sollte man aber wissen.


Ist aber schon richtig das dein Dreieck eine Falsche Textur hat und nicht deine EMM-Szene. Wie siehte denn deine EMM-Szene aus? Vieleicht sieht es ja auch nur so aus.
Da du dein Dreieck ja als erstes Zeichnest sollte deine EMM-Szene keinen einfluß mehr auf das Dreieck haben.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

6

09.08.2004, 18:26

Zitat von »"DragonMaster"«


Bitte Buch holen und nach "Variablen Konvertierung" oder "Cast" nachschauen. Das sollte man aber wissen.

Sorry, stimmt! kA warum ich das vergessen habe...

Zitat


Ist aber schon richtig das dein Dreieck eine Falsche Textur hat und nicht deine EMM-Szene. Wie siehte denn deine EMM-Szene aus? Vieleicht sieht es ja auch nur so aus.
Da du dein Dreieck ja als erstes Zeichnest sollte deine EMM-Szene keinen einfluß mehr auf das Dreieck haben.


Ja, mein Dreieck hat die falsche Textur und wird auch zuerst gerendert...
Also hier nochmal damit es ganz klar wird zwei Bilder:


(Link)

Also das Bild zeigt, wie es mit dem oberen Code in meinem ersten Post aussieht!

Lasse ich nun aber:

C-/C++-Quelltext

1
2
emmloader::beginFrame((D3DXMATRIX*)(&mProjection)); 
  p_scene->getRootObject()->render(); 


weg, sieht das Dreieck so aus:

(Link)


Also muss ja irgenwas in meinem Code falsch sein! Hoffe jetzt ist das Problem ganz klar geworden!


cya,
Stefan

7

10.08.2004, 01:03

Ich glaub ich hab die Lösung. Das kann an dem fehlenden SetFVF() liegen. Denn wenn du die EMM-Szene renderst hat dein dreick nicht nur eine Falsche Textur es hat auch komischerweise Vertexfarben.

Setze mal das FVF für dein Dreieck. Das EMM-System setzt 100% sein eigenes FVF.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

8

10.08.2004, 11:13

danke für deine Mühe! Also jetzt setzte ich das FVF für mein Dreieck, nun wird es aber komplett in weiß gezeichnet! Aber ganz am Anfang beim starten ist es ganz ganz kurz mit der richtigen Textur zu sehen, das muss glaube ich beteuten, dass das Modell-Rendern, noch ein RenderState oder so was verändert...nur was für einen!?....


cya,
Stefan

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

10.08.2004, 13:22

Setz die Texture-Stage-States wieder so, wie sie normalerweise sind.

Habe aber eine bessere Lösung, die Dir das alles erspart:
Erzeuge einen D3D-State-Block (ganz am Anfang, bevor irgendwas gerendert wird). Direct3D merkt sich dann alle Render-States, Texture-Stage-States usw.. Dann aktivierst Du den State-Block in jedem Frame nach dem Rendern des EMM-Modells. Direct3D setzt dann alle States wieder zurück in den ursprünglichen Zustand.

Dokumentation:
IDirect3DStateBlock9
IDirect3DDevice9::CreateStateBlock

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

10

10.08.2004, 14:32

danke, aber jetzt versteh ich leider gar nichts mehr..
Also ich erzeuge den D3D-State-Block bevor ich in die tbDoMessageLoop-Funktion gehe! In der Render Funktion setzte ich nach dem Rendern des Modell wieder alle States zurück, scheint auch zu gehen, da er zum Beispiel D3DRS_LIGHTING wieder auf FALSE setzt! Leider ist das Dreieck aber immer noch weiß, nur was mir aufgefallen ist, davor war es sogar noch transparent, was es aber auch nicht sein sollte! Also wieder ein Fehler weniger, aber jetzt kommt der Punkt, wo ich es nicht mehr verstehe: Ich lasse das rendern des Modells weg und setzte immer noch jeden Frame alle States zurück, wäre logisch ,dass es mit der Textur gezeichnet wird, aber es ist immer noch weiß...??? lass ich das zurücksetzten weg, ist alles richtig...also ich versteh es echt nicht mehr...

Werbeanzeige