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

Fluaflubfluc

unregistriert

1

20.12.2011, 13:36

Modelle werden nicht richtig gerendert

Hi alle,
Ich habe ein Problem mit dem Rendern von Objekten. Ich habe zwei Objekte in meinem Spiel: 1 UFO, 1 Modell mit einem Gebäude. Wenn ich das Modell mit dem Gebäude zuerst rendere, dann ist das Modell mit dem Gebäude immer im Vordergrund, auch, wenn du UFO direkt vor einem ist. Wenn ich das UFO zuerst rendere, dann ist dieses immer im Vordergrund. Ich programmiere schon eine Weile mit 3D, doch bei meinen vorherigen Programmen ist dieser Fehler nicht entstanden. Ich bin schon mehrmals durch den Quelltext durchgegangen.
Ich habe ein Verdacht, warum es so passiert. Ich habe vor dem Level noch ein Hauptmenu mit Highscore und Credits. Vielleicht habe ich irentetwas dort falsch eingetippt. Hier ist der Quelltext von der render Phase:

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
tbResult L1Render(float fTime){
    //Variablen
    tbMatrix World;
    tbMatrix Camera;
    tbMatrix Projection;
    D3DLIGHT9 Light;
    D3DLIGHT9 RedLight;

    tbDirect3D& D3D = tbDirect3D::Instance();
    D3D->Clear(0, NULL, D3DCLEAR_ZBUFFER, 0, 1.0f, 0); //Wenn ich auch noch TARGET STENCIL säubere, entsteht kein Unterschied
    D3D->BeginScene();

    // Projektionsmatrix erstellen und einsetzen
    Projection = tbMatrixProjection(TB_DEG_TO_RAD(80.0f), D3D.GetAspect(), 0.1f, 1300.0f);
    D3D.SetTransform(D3DTS_PROJECTION, Projection);

    L1CameraDir = tbVector3(sinf(L1CameraRot) * cosf(L1CameraUpDown),
                        sinf(L1CameraUpDown),
                                             cosf(L1CameraRot) * cosf(L1CameraUpDown));

    Camera = tbMatrixCamera(L1CameraPos,L1CameraPos + L1CameraDir);
    D3D.SetTransform(D3DTS_VIEW, Camera);

    //Skybox <Quelltext ist nicht nötig>

    //Licht
    ZeroMemory(&Light, sizeof(D3DLIGHT9));
    Light.Type          = D3DLIGHT_POINT;                               // Punktlicht
    Light.Diffuse       = tbColor(0.2f, 0.2f, 0.2f);                    // Weiße Streufarbe
    Light.Ambient       = tbColor(0.2f, 0.2f, 0.2f);                // Weiße Hintergrundfarbe
    Light.Specular      = tbColor(0.2f, 0.2f, 0.2f);                    // Weiße Glanzfarbe
    Light.Position      = tbVector3(0.0f,30.0f, 50.0f); // Position
    Light.Range     = 300.0f;                                       // 300 Einheiten Reichweite
    Light.Attenuation0  = 0.0f;                                         // Lichtabschwächung
    Light.Attenuation1  = 0.025f;                                       // ...
    Light.Attenuation2  = 0.0f;                                         // ...
    D3D->SetLight(0, &Light);
    D3D->LightEnable(0, TRUE);

    World = tbMatrixTranslation(tbVector3(0.0f,0.0f,0.0f));
    D3D.SetTransform(D3DTS_WORLD,World);
    L1Model->Render();

    World = tbMatrixTranslation(L1UFOPos);
    D3D.SetTransform(D3DTS_WORLD,World);
    L1UFO->Render();


    D3D->EndScene();

    return TB_OK;
}

Danke schon mal

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Fluaflubfluc« (25.12.2014, 22:07)


xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

20.12.2011, 13:50

So wie du den Fehler beschreibst wuerde ich mir den Z-Buffer mal genauer anschauen. Ich kenne die direkten Befehle aus der Tribase Engine dazu nicht, aber das Buch wird da beim Thema Z-Buffer sicher weiter helfen.

Ich vermute mal, dass der Fehler durch den Skybox code entsteht, zum Skybox rendern deaktiviert man ueblicherweise die Z-Buffer Tests.

Fluaflubfluc

unregistriert

3

20.12.2011, 13:53

Ich versuche nocheinmal, es zu rendern ohne Skybox

Fluaflubfluc

unregistriert

4

20.12.2011, 13:56

Es ist liegt nicht an der Skybox. :(

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Fluaflubfluc« (25.12.2014, 22:07)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

20.12.2011, 14:53

Irgendwas mit dem Z-Buffer wird es schon sein. Aber mich wundert, dass das *zuerst* gerenderte im Vordergrund bleibt. Also entweder ist die benutzte ZFunc falsch, oder beide Objekte haben falsche oder identische Z-Werte (keine Objekte, sondern nur Sprites?). Kann auch einiges anderes sein, aber das wären meine Favoriten.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

20.12.2011, 15:20

Wie sieht deine Projektionsmatrix aus?
Hast du überhaupt einen DepthBuffer?
Setzt du irgendwelche Renderstates die das Depth-Buffering betreffen (D3DRS_ZENABLE, D3DRS_ZWRITEENABLE, D3DRS_ZFUNC)?
Haben deine Modelle korrekte z-Werte?

Fluaflubfluc

unregistriert

7

20.12.2011, 15:29

Ne sorry, die Objekte, die zuletzt gerendert werden, sind im Vordergrund

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

20.12.2011, 16:14

Dann ist ziemlich sicher dein Depth-Buffer deaktiviert.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Fluaflubfluc

unregistriert

9

20.12.2011, 17:46

Danke Dot,xardias und BlueCobold. Es war der Z-Buffer. Keine Ahnung wie ich ihn verstellt haben konnte. Auf jeden Fall habe ich jetzt nur noch bei D3D->Clear den D3DCLEAR_BUFFER angewandt. Dann habe ich D3D.SetRS(D3DRS_ZENABLE,TRUE); und dann ging es.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Fluaflubfluc« (25.12.2014, 22:07)


Werbeanzeige