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

Anonymous

unregistriert

1

24.04.2005, 11:49

Objekt ausblenden

Ich möchteein Modell langsam ausblende und dann verschwinden lassen. Das will ich wohl mit alpha-blending machen. Nur wie kann ich zur laufzeit einem Objekt einen alpha-wert zuweisen??

mfg

unsigned int

Alter Hase

Beiträge: 512

Wohnort: Bonn

Beruf: Schüler; C#-Programmierer in einer kleinen Firma

  • Private Nachricht senden

2

24.04.2005, 13:24

du kannst doch den VertexBuffer sperren, dann alle Vertices durchgehen und Farbe ändern und dann den Buffer wieder freigeben

Brauchste Code? ;)
"Tu es. Oder tu es nicht. Es gibt kein Versuchen."
StarWars

www.tron2d.de.vu

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

24.04.2005, 14:21

Einfacher geht es mit D3DTA_TFACTOR und D3DRS_TEXTUREFACTOR... kompletten VB sperren ist nicht gut, da langsam und da wahrscheinlich mehrere Objekte denselben VB benutzen, und die würden dann alle mit ausgeblendet.

C-/C++-Quelltext

1
2
3
4
// Alpha kommt aus Textur und wird mit dem Wert von D3DRS_TEXTUREFACTOR multipliziert

SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);


(Wenn Du das Alpha nicht aus der Textur haben willst, sondern aus der Diffuse-Farbe, dann nimm D3DTA_DIFFUSE anstatt D3DTA_TEXTURE.)

C-/C++-Quelltext

1
2
3
// Das Objekt soll zu 75% sichtbar sein

DWORD value = D3DXCOLOR(0.75f, 0.75f, 0.75f, 0.75f);
SetRenderState(D3DRS_TEXTUREFACTOR, value);

Anonymous

unregistriert

4

24.04.2005, 17:50

hmm...das hört sich ja ganz gut an, nur hab ich's nicht wirklich verstanden....

@ David Scherfgen
Woher weiß ich den jetzt welches Objekt den neuen Alphawert bekommt??

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

24.04.2005, 18:31

Bevor Du das Objekt zeichnest, das transparent sein soll, fügst Du meinen Code ein. Danach stellst Du die States wieder so ein, wie sie für die nicht-transparenten Objekte benötigt werden.

Anonymous

unregistriert

6

25.04.2005, 09:02

Achso....hätte ich mir auch selbst denken können :)

Schönen Dank!!!! Ich werdes nachher gleich mal probieren....

7

25.04.2005, 14:41

Nur mal so ne Frage: Kann man nicht einfach in der Renderfunktion des entsprechenden Objekts eine Zahl abfragen (= Alphawert) und wenn die Zahl != 100 ist (also nicht ganz opak), einen Effekt startet, der das ganze transparenter rendert *I LOVE EFFECTS*?

Das ist zwar zu langsam - ich weiß es ja - aber es wäre theoretisch möglich, oder?

Anonymous

unregistriert

8

25.04.2005, 15:51

Ich weiß nicht ob das unbedingt so viel Rechenzeit kostet.... gut, wenn du das mit 10 000 Objekten machst vieleicht...

Also ich wollte so ne Art Bomberman-Ego-Shooter schreiben...da könnten maximal 4 Kisten gleichzeitig transparent gerendert werden....

bassdscho

Alter Hase

Beiträge: 1 056

Wohnort: Heuchlingen

Beruf: Student - Technische Informatik

  • Private Nachricht senden

9

06.05.2005, 14:16

Ich hab bei meinem Spiel auch so was geproggt. Du müsstest aber nur den fTimer beim Initialisier auf einen Wert größer 6 setzen. und wenn deine Kiste langsam ausgeblendet werden soll ihn auf 0 setzen. Das ausblenden dauert hier 5 sek.

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
    tbResult Render(const float &fTime)
    {
        fTimer += fTime;
        if (fTimer < 6.0f)
        {
            float fProz = ((100.0f/5.0f) * fTimer) / 100.0f;
            cAlpha = tbColor(fProz, fProz, fProz, fProz);
        } // if

        else
            cAlpha = tbColor(1.0f, 1.0f, 1.0f, 1.0f);
        
        // WeltMatrix setzen

        tbDirect3D::SetTransform(D3DTS_WORLD, ObjectKlasse.m_mMatrix);

        // Alphablending anstellen

        tbDirect3D::SetRS(D3DRS_ALPHABLENDENABLE, TRUE);
        tbDirect3D::SetRS(D3DRS_SRCBLEND, D3DBLEND_BLENDFACTOR);
        tbDirect3D::SetRS(D3DRS_DESTBLEND, D3DBLEND_INVBLENDFACTOR);
        tbDirect3D::SetRS(D3DRS_BLENDFACTOR, cAlpha);
        tbDirect3D::SetRS(D3DRS_BLENDOP, D3DBLENDOP_ADD);

        // Modell darstellen

        if(this->mModel->Render())
            TB_ERROR("Rendern von Schiff hat nicht funktioniert",TB_ERROR);

        // Alpha ausschalten

        tbDirect3D::SetRS(D3DRS_ALPHABLENDENABLE, FALSE);

        return TB_OK;
    } // Render

Werbeanzeige