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

17.07.2009, 12:01

Transformierte Vertizes und alpha-blending

Ich habe folgendes Problem.
Ich möchte für mein Spiel Direct3D zum Spielende aus einer .png-Datei den Schrifftzug Game Over einblenden.
Der Hintergrund der Textur ist schwarz.
Ich möchte diesen Schriftzug langsam aus vollkommen durchsichtig in undursichtig einblenden. So das durch den schwarzen Hintergrund alles immer dunkler wird und der Schrifftzug aus der Transparenz hervorkommt.
Da es sich hierbei um einen transformierte Vertizes handelt (wird nicht beleuchtet) imuss quasi Vertexfarben einsetzen.

Diese habe ich mit D3DCOLOR_ARGB((byte)a,r,g,b) festgelegt und eine Schleiffe eingeführt, welche a mit bezug auf die Zeit in 3 Sekunden von 255.0f auf 0.0f herunterrechnet. a als float, weill sonst die Rechnung a*time nicht richtig funzt.
Jetzt passiert volgendes. Der Schriftzug wird aber nur undurchsichtig dargestellt.

_3DOT_Engine->pD3DDev->SetRenderState(D3DRS_ZENABLE,FALSE);
_3DOT_Engine->pD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
_3DOT_Engine->pD3DDev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
_3DOT_Engine->pD3DDev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
_3DOT_Engine->pD3DDev->SetRenderState(D3DRS_BLENDOP,D3DBLENDOP_ADD);

_3DOT_Engine->pD3DDev->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1);

Frage: wie kann ich Vertexfarben transparent machen ?

2

17.07.2009, 12:19

Sorry habe einen Fehler gemacht.
Bin fälschlicherweisse von Transparenz=255 und Nichttransparent=0 ausgegangen. Allso ich muss von 0 auf 255 hochaddieren.
Funktioniert aber trotzdem nicht ergebniss ist das selbe.

3

17.07.2009, 12:47

Folgendes Codefragment sollte helfen:

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
// Loop


// Farbkomponenten, hier RGBA identisch

static float fBlendValue   = 0.0f; // Transparent


// Sichtbarkeit Vertexquad

static DWORD dwBlendFactor = D3DXCOLOR( fBlendValue, fBlendValue, fBlendValue, fBlendValue );   

// Renderstates setzen (Licht aus!?)

_3DOT_Engine->pD3DDev->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_BLENDFACTOR );
_3DOT_Engine->pD3DDev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVBLENDFACTOR );
_3DOT_Engine->pD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); 

_3DOT_Engine->pD3DDev->SetRenderState( D3DRS_BLENDFACTOR, dwBlendFactor );


// Deine Renderfunktion hier



if (fBlendValue <= 1.0f) // Noch nicht Opaque ?

    fBlendValue += pDeinTimer->GetElapsedTime() * 0.20f; // ms, mit deinem Faktor multiplizieren


// Ende Loop
fka tm

4

17.07.2009, 13:39

Herlichen Dank.
Werde es so versuchen. :)

5

17.07.2009, 14:15

Funktioniert jetzt perfect.

Nochmal Danke !

Werbeanzeige