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

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

1

30.10.2007, 19:16

Nebelfehler

Hallo,
tut mir leid, dass ich in letzer Zeit so viel Frage:

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
    // Die Szene beginnen

    tbDirect3D& D3D = tbDirect3D::Instance();


    D3D->Clear(0, 
                           NULL, 
                           D3DCLEAR_TARGET, 
                           D3DCOLOR_XRGB(1,1,1), 
                           1.0f, 
                           0);
    D3D->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(1,1,1), 1.0f, 0);
    D3D->BeginScene();
    
    // Projektionsmatrix erstellen und einsetzen

    mProjection = tbMatrixProjection(g_fFOV, D3D.GetAspect(), Clipping_near, Clipping_far);
    D3D.SetTransform(D3DTS_PROJECTION, mProjection);

    // Kameramatrix erstellen und einsetzen

    vCameraDir = tbVector3(sinf(g_fCameraRot) * cosf(g_fCameraUpDown),
                           sinf(g_fCameraUpDown),
                           cosf(g_fCameraRot) * cosf(g_fCameraUpDown));
    mCamera = tbMatrixCamera(g_vCameraPos, g_vCameraPos + vCameraDir);
    D3D.SetTransform(D3DTS_VIEW, mCamera);
    // ------------------------------------------------------------------

    
//  D3D.SetRS(D3DRS_ZENABLE, FALSE);

    g_pSkyBox->Render(g_vCameraPos);


    ZeroMemory(&Light, sizeof(D3DLIGHT9));
    Light.Type = D3DLIGHT_DIRECTIONAL;;
    Light.Diffuse = tbColor(0.3f, 0.3f, 0.3f);
    Light.Ambient = tbColor(1.0f, 1.0f, 1.0f);
    Light.Specular = tbColor(1.0f, 1.0f, 1.0f);
    Light.Direction = vCameraDir;

    D3D->SetLight(0, &Light);
    D3D->LightEnable(0, TRUE);

    D3D.SetTransform(D3DTS_WORLD, tbMatrixIdentity());

        // Linearer weißer Nebel!

    D3D.SetRS(D3DRS_FOGENABLE,      TRUE);
    D3D.SetRS(D3DRS_FOGVERTEXMODE,  D3DFOG_LINEAR);
    D3D.SetRS(D3DRS_FOGTABLEMODE, D3DFOG_NONE);
    D3D.SetRS(D3DRS_FOGCOLOR, tbColor(1.0f, 1.0f, 1.0f));
    D3D.SetRSF(D3DRS_FOGSTART,      3.0f);
    D3D.SetRSF(D3DRS_FOGEND,        6.0f);
    D3D.SetRS(D3DRS_RANGEFOGENABLE, FALSE)
    D3D->SetRenderState(D3DRS_LIGHTING, FALSE);

    // Datenquellen und Vertexformat setzen

    D3D.SetTexture(0, g_pEbeneTexture);
    D3D->SetStreamSource(0, g_pEbeneVB->GetVB(), 0, sizeof(SEbeneVertex));
    D3D->SetIndices(g_pEbeneIB->GetIB());
    D3D.SetFVF(SEbeneVertex::dwFVF);

    D3D->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0,
                                  4, 0,
                                  2);


    D3D->SetRenderState(D3DRS_LIGHTING, TRUE);


Ich hab mein Spiel jetzt schon auf 5 Rechnern getestet.
Bei meinem und noch einem anderen wird die Spiel-Ebene, die im obigen Codeauszug gerendert wird korrekt dargestellt, je höher ich mit der Kamera gehe desto weißer wird das ganze, da ja der Nebel angestellt ist.

Bei den anderen Rechnern ist allerdings das Problem, dass wenn sich die Kamera am Boden befindet ist der Boden komplett weiß. Wenn man jetzt aber mehr in die Vogelperspektive geht sieht man die güne Ebene wieder.
Zudem war es so, das je näher ich an einen der 4 Ecken der Ebene kam, ich das Grün wieder sehen konnte.

Ich hab das Problem, dass auf meinem Rechner das so läuft, wie ich es haben will, bei denen meiner Freunde aber nicht.
Wenn ich aber
D3D.SetRS(D3DRS_RANGEFOGENABLE, FALSE)
auf TRUE setze passiert es bei mir auf, dass der Boden in der Mitte ganz weiß ist. Allerdings ändert sich das nicht wenn ich in die Vogelperspektive gehe.

Hat jemand vielleicht schon irgendwie ne Idee wo das Problem liegen könnte und wie man es beheben kann. Bei 2 Rechnern lief es "normal", bei 3 nicht.

Viele Grüße
Andreas

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

2

25.08.2008, 00:27

das Problem mit dem Nebel hatten wir hier schoneinmal aber diesmal
vertippe ich micht nicht :D

also:
die renderstates brauchen einen DWORD wert. da du den float wert
direkt angibst, wird er auf 0 abgerundet, daher warscheinlich undefiniertes verhalten wenn start und end auf 0 sind.

du musst das ganze reincasten.

C-/C++-Quelltext

1
2
3
4
inline DWORD fToDw(float f)
{
    return *reinterpret_cast<DWORD *>(&f);
}

dann schreibst du einfach

C-/C++-Quelltext

1
2
D3D.SetRSF(D3DRS_FOGSTART,  fToDw(3.0f)); 
D3D.SetRSF(D3DRS_FOGEND, fToDw(6.0f));
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Andreas

Frischling

  • »Andreas« ist der Autor dieses Themas

Beiträge: 77

Beruf: Schüler

  • Private Nachricht senden

3

29.08.2008, 10:18

Hey,
vielen Dank für deine Antwort, jetzt funktionierts :-)

Viele Grüße
Andreas

Werbeanzeige