PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sprites, Alphakanal und Directx 9


Gast
2009-07-05, 17:33:01
Hallo.
Ich habe ein Problem.

Ich habe einen BMP file mit gimp bearbeitet(Ebene->Transparent->Farbe zu Transparent) dort R,G,B jeweils auf 0 gesetzt.
In GIMP sieht der Sprite ja so aus wie ich es haben wollte und in der Datei befindet sich jetzt auch der Alphawert. Was ich sehe wenn ich gimp Schliese und die Datei dann wieder mit GIMP öffne immer noch transparent.

Wenn ich den Spirte aber nun in mein Spielproject einbaue, ist er vor dunklem hintergrund gut zu sehen aber vor hellem Hintergrund ist er "fast" volkommen Transparent.
In meinem Code habe ich Alpha folgendermassen integriert.

_3DOT_Engine->pD3DDev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_INVSRCALPHA);
_3DOT_Engine->pD3DDev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_SRCALPHA);
_3DOT_Engine->pD3DDev->SetRenderState(D3DRS_BLENDOP,D3DBLENDOP_MAX);

Dies ist die einzige kombination die den Sprite überhaupt ohne den schwarzen hintergrund auf den Bilschirm bringt.

Ich weiss nicht ob ich vieleicht noch irgendwelche TexturStages setzen.
Wenn ja weiss ich nicht welche.

Kann jemand helfen ?

Danke

Demirug
2009-07-05, 18:03:31
Für D3DX hat eine BMP Datei niemals einen Alphakanal da dieser nicht zum Standard gehört. Für Bilder mit Alphakanal muss man ein anderes Format nehmen. PNG oder DDS bieten sich an.

Gast
2009-07-05, 18:17:32
Danke dir werd es probieren.

Neomi
2009-07-05, 18:21:42
Wie Demirug schon sagt, du benötigst eine Textur, die einen passenden Alphakanal auch nach dem Ladevorgang behält. Üblicherweise ist in Alpha nicht die Transparenz, sondern die Deckung enthalten. Bei 8 Bit also 0 -> komplett transparent und 255 -> komplett deckend.

Die üblichen States für normales Alphablending (Non-Premultiplied) sind dann:

SrcBlend = SrcAlpha
DstBlend = InvSrcAlpha
BlendOp = Add

Gast
2009-07-05, 21:50:15
Ich Danke euch !!!
Das hat mir viel gebracht. Jetzt funzt es wie ich es haben möchte.

Vieleicht kann mir mal jemand etwas veraten.
Ich weiss was ADD und SUBTRACT bedeuten, aber für was steht bei AlphaOP Max und Min.

vieleicht verstehe ich danach ein bischen was mehr.

Danke.

Neomi
2009-07-05, 21:59:20
Max und Min nehmen jeweils das Maximum bzw. Minimum pro Farbkomponente. Natürlich erst nachdem Src (der Output vom Pixelshader) und Dst (der bisherige Framebuffer-Inhalt) per SrcBlend bzw. DstBlend modifiziert wurden.

Wenn die Farben 255/0/0 (rot) und 0/255/0 (grün) verrechnet werden, dann kommt dabei das raus...

Maximum: die hellere Farbkomponente wird übernommen -> 255/255/0 (gelb)
Minimum: die dunklere Farbkomponente wird übernommen -> 0/0/0 (schwarz)

Deshalb konntest du deinen Sprite auch nur auf dunklem Hintergrund gut sehen. Bei deinem initialen Setup wurden nämlich nur die Teile deines Sprites übernommen, die heller waren als der Hintergrund.