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

28.04.2006, 16:31

Stencil buffer Probleme

Hi

ich hätte eine kleine Frage:

Und zwar macht der Stencil buffer nicht das was ich möchte ;)
Ich bin ein riesen fan vom Retrospiel Pong, daher hab ich mich mal so eben dazu bewegt das Breakanoid aus dem buch von David Scherfgen umzuschreiben.

Alles lief super. Das erste Level spielt im einem Lagerraum, die KI ist dumm aber bewegt sich schon ;)

Nur leider zickt der stencil buffer und ich hab hinter dem spieler eine Lampe platziert die natürlich auch einen Schattenwirt. Leider funzt das ganze nicht. Hier ein bild aus dem spiel:

Not another Pong

hier ein der Auszug aus meiner quelltext mit dem stencil buffers

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    D3D->Clear(0,
               NULL,
               D3DCLEAR_STENCIL,
               D3DCOLOR_XRGB(0, 0, 0),
               1.0f,
               0);

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


    // Stencilbuffer initialisieren

    D3D->SetRenderState(D3DRS_STENCILENABLE, TRUE);
    D3D->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_ALWAYS);
    D3D->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_INCRSAT);
    D3D->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    D3D->SetRenderState(D3DRS_ZFUNC, D3DCMP_NEVER);

    // Stencilbuffer einstellen

    D3D->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS);


Ich hoffe ihr könnt mir helfen :crying:


mfg
hebi

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

28.04.2006, 16:43

Dieser Quelltext-Auszug ist ziemlich nichtssagend.
Erläutere doch mal das genaue Vorgehen!

PS: Und ändere bitte deinen Avatar, denn über 200 KB für das Bild sind eindeutig zu viel.

Sheddex

unregistriert

3

28.04.2006, 16:47

@David: Der Avatar ist der beste hier im Forum... und er ist ja nur verlinkt, also müllt er auch nicht deinen Server voll ;)

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

4

28.04.2006, 16:51

Es geht wohl eher darum, dass Modemuser (ja, sowas gibt es) ziemliche Ladezeiten haben, um diesen tollen Avatar zu sehen.

5

29.04.2006, 00:04

sorry für den Avatar, hab bloss an den Webspace gedacht und nicht an die modemuser :o

Ich weis leider nicht genau welche teil ich zeigen soll.

Ich würd gern das der stencil buffer den schatten schön berechnet.
Wie gesagt tut er leider nicht.
Sondern das er die meisten pixel rausschmeisst und sie leider nicht rendert.

Gibt es vielleicht eine art methode oder funktionen die man immer beachten sollte.
Ich habe mir den Teil im Buch öfters durchgelesen und leider nichts gefunden.

...
Stencil buffer leeren
Stencil schreiben
..
bild rendern

6

29.04.2006, 14:42

So nun hab ich zeit das Problem einwenig zu erläutern:
(hatte gestern leider viel zutun sorry)

Ich habe mir Kapitel 9 fortgeschrittene Technicken -> Schatten durchgelesen
habe mir dann das Beispiel aus der CD angeschaut um das neue wissen zu festigen(hoffnung stirbt immer zu letzt ;p )

Ich habe 4 Modelle:
player1model
player2model
ballmodel
levelmodel

dazu 4 instanzen der klasse tbShadowVolume
mit den zugehörigen klamottn für jeweils eins der 4 modelle:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
    // Schatten laden

    player1.g_pPaddleShadow = new tbShadowVolume;
    player1.g_pPaddleShadow->Init(player1.m_pPaddleModel);
    player2.g_pPaddleShadow = new tbShadowVolume;
    player2.g_pPaddleShadow->Init(player2.m_pPaddleModel);
    g_pBallShadow = new tbShadowVolume;
    g_pBallShadow->Init(m_pBallModel);
    g_pLevelShadow = new tbShadowVolume;
    g_pLevelShadow->Init(m_pLevelModel[0]);


Das steht in der Init level funktion die vor jedem lvl start ausgeführt wird.
In der Render Funktion habe ich folgendes eingetragen:
Zu beginn:

C-/C++-Quelltext

1
2
    D3D->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL,
               tbColor(0.0f, 0.0f, 0.0f), 1.0f, bCameraInShadow ? 1 : 0);

Und ganz am ende das rendern der einzelnen Shadowtexturen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    player1.g_pPaddleShadow->ComputeVolume(tbMatrixIdentity(), CamLight, 1000.0f, FALSE);
    player1.g_pPaddleShadow->RenderVolume(tbMatrixIdentity());
    player1.g_pPaddleShadow->RenderShadow(tbColor(0.0f, 0.0f, 0.0f, 0.5f));

    player2.g_pPaddleShadow->ComputeVolume(tbMatrixIdentity(), CamLight, 1000.0f, FALSE);
    player2.g_pPaddleShadow->RenderVolume(tbMatrixIdentity());
    player2.g_pPaddleShadow->RenderShadow(tbColor(0.0f, 0.0f, 0.0f, 0.5f));

    g_pBallShadow->ComputeVolume(tbMatrixIdentity(), CamLight, 1000.0f, FALSE);
    g_pBallShadow->RenderVolume(tbMatrixIdentity());
    g_pBallShadow->RenderShadow(tbColor(0.0f, 0.0f, 0.0f, 0.5f));

    g_pLevelShadow->ComputeVolume(tbMatrixIdentity(), CamLight, 1000.0f, FALSE);
    g_pLevelShadow->RenderVolume(tbMatrixIdentity());
    g_pLevelShadow->RenderShadow(tbColor(0.0f, 0.0f, 0.0f, 0.5f));

    // Szene beenden

    D3D->EndScene();

    return TB_OK;

Als Licht benutze ich das Richtungslicht(D3DLIGHT_DIRECTIONAL) der sich wie im breakoniod die Kamera als Richtung nutzt.

ich hoffe ihr könnt mir nun helfen.

mit freundlichen grüssen
hebi

7

29.04.2006, 16:20

So ich hab endlich das Problem lösen können

Für alle die irgendwann auch einmal vor diesem Problem stehen mein Lösungsansatz:

Guckt wo euer Licht steht :P
vor lauter sucherei wo der fehler im stencil ist, habe ich vergessen beim Licht nachzuschauen.


trozdem danke das ihr geantwortet habt :)

Werbeanzeige