Transparent auf Texture rendern in D3D9
-
Hi liebe community,
ich verzweifle gerade daran, wie man transparent auf eine Textur zeichnet
Also ich habe eine Textur vom FormatD3DFMT_A8R8G8B8
, die ich vor jedem rendern weiß cleare. Wenn ich jetzt ein transparentes Dreieck draufzeichnen möchte, mit der FarbeD3DCOLOR_ARGB(0,0,0,0)
sehe ich immer ein schwarzes Dreieck.
Das blending bei der Textur habe ich so versucht zu lösenm_D3dd->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); m_D3dd->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); m_D3dd->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
So steht es auch in der MSDN, aber irgendwie klappt es bei mir nicht
-
IIRC macht es diesbezüglich keinen Unterschied ob du auf den Back-Buffer zeichnest oder auf ein Render-Target.
D3DFMT_A8R8G8B8 ist OK, D3DFMT_X8R8G8B8 würde es aber auch tun - du willst den Alpha-Kanal der Ziel-Textur (Destination-Alpha) ja nicht verwenden, sondern nur Source-Alpha.
Die drei SetTextureStageState sind auch nicht nötig.
Ich glaube mich aber zu erinnern, dass du Alpha-Blending am Device erstmal aktivieren musst. Und die Blending-Modes passend setzen (wobei die per Default glaub' ich eh passen, also D3DBLEND_SRCALPHA und D3DBLEND_INVSRCALPHA).
d3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); // alpha blending einschalten d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); // source mit source-alpha gewichten d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); // destination (render-target) mit (1 - source-alpha) gewichten // sollte reichen
p.s.: willst du wirklich die Fixed-Function Pipeline verwenden (SetTextureStageState etc.)? Ich sehe da eigentlich nur Nachteile. Einfache Shader programmieren ist nicht schwer. IMO viel einfacher als das selbe über die Texture-Stages zu machen.
-
Danke, hat geklappt