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 Format D3DFMT_A8R8G8B8 , die ich vor jedem rendern weiß cleare. Wenn ich jetzt ein transparentes Dreieck draufzeichnen möchte, mit der Farbe D3DCOLOR_ARGB(0,0,0,0) sehe ich immer ein schwarzes Dreieck.
    Das blending bei der Textur habe ich so versucht zu lösen

    m_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 🙂


Log in to reply