Direct3D - Alphabereich eines Face macht darunterliegendes Face auch transparent



  • Hi,

    ich hab mal eine Frage zu Alpha Blending mit DirectX - im speziellen Direct3D. Ich nutze folgende Funktionen:

    // Alpha Blending anschalten 
    m_lpD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
    
    m_lpD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    m_lpD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    
    // Alpha Blending ausschalten
    m_lpD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
    

    Wenn ich nun auf den Bereich des Faces schaue, wo das Alpha wirkt, ist nicht nur das Face transparent sondern auch das Face direkt darunterliegend. Wie kann ich diesen hässlichen Effekt vermeiden?

    Würde mich sehr über eine Antwort freuen!

    VG
    Axel



  • Dazu wäre ein Bild denke ich ganz hilfreich, um zu sehen wie das ganze genau aussieht.



  • Hier ist eins Bild zu meinem Problem. Würde mich freuen, wenn es weiterhilft:
    http://www.amonse.htwm.de/meinbild.jpg



  • OK das ist gut ersichtlich, also deine Wände sind massiv und dein Dach ist Transparent mit Alpha1 an den Normalen Stellen und Alpha 0 an den durchsichtigen Stellen. Was mir dazu einfällt wäre folgendes. Hast du beim Rendern an die richtige reihenfolge gedacht, dh erst die Wände gerendert und dann das Dach? Das ganze sieht nämlich irgendwie so aus als wurde erst die Seitenwand gerendert, dann das Dach (mit ZWriteEnable) und als dann die vordere wand dran war wurde das Wandstück unetrschlagen weil das Dach inkl Durchsichtigem Teil im Vordergrund stand. Das soltlest du erstmal prüfen.



  • Xebov schrieb:

    Hast du beim Rendern an die richtige reihenfolge gedacht, dh erst die Wände gerendert und dann das Dach?

    Aber natuerlich nicht. f'`8k

    Autocogito

    Gruß, TGGC (Das kommt gut)



  • ^^^Hey, was soll die Vorverurteilung? Ich habe an die richtige Reihenfolge gedacht...Der Eindruck entsteht nur, weil ich CULLMODE auf D3DCULL_NONE gesetzt habe, bei D3DCULL_CCW tritt das gleiche Problem auf (die Seitenwand ist dann aber nicht zu sehen! Die Z-Buffereinstellung scheinen auch zu stimmen...



  • OK, ganz dumme Frage, Ist das Haus ein Model das du komplett mit Alphablending renderst?



  • Ja, ist das in diesem Fall schlimm?



  • Ja weil du die Reihenfolge nicht beachtest. Du hast folgendes Problem, Dein dach ist eine schräge die Teilweise transparent ist und die die Wand überragt. Ob die Pixel transparent sind oder nicht spielt für den z-Bufefr keine Rolle damit wäre es so als wäre das dach massiv. Du hast 2 Möglichkeiten es zu lösen, du kannst die Wände vor dem Dach rendern, oder du stellst es ein das Pixel ab bestimmten Alphas nicht gezeichnet werden, wie letzteres geht hab ich leider gerade nicht im Kopf.



  • ROFL

    Du bist ulkig 🙂

    Natürlich renderst du falsch rum, wie soll sonst dieses Bild entstehen?

    Und wenn du das ganze Haus mit Alpha-Blending renderst bedeutet das dass du nochdazu den Z-Write eingeschaltet hast, was bei Alpha-Blending volle Kanne für die Fische is, gelle. Du musst nämlich sowieso nen Z-Sort machen. Bloss... so wie deine Geometrie vermutlich aussieht wird der Z-Sort nicht aus jedem Winkel das passende Ergebnis liefern...

    Das sind alles Basics.



  • Warscheinlich habt ihr mich falsch verstanden.

    Hab jetzt grad D3DRS_ALPHATESTENABLE SetRenderState zugewiesen und es geht...Trotzdem danke der Mithilfe!
    VG
    Axel



  • Ne es war eher umgedreht. Wenn du Alphatesting benutzt und ZWriteenable true ist dann werden alle Pixel gezeichnet auch die die 100%ig durchsichtig sind. Da dein dach vor der Wand gezeichnet wurde war die stelle wo du die Wand nicht gesehen hast schon vorbelegt mit transparentem Dach da die Mauer dahinter liegt kontne sie nicht durch den Z-Buffer kommen. Das Alphatest was du hier nimmst war das was ich meinte, damit verhinderst du das Pixel mit bestimmten Alphawerten gezeichnet werden. Du soltest dich nochmal eingehend mit dem Z-Buffer beschäftigen.



  • Okay, danke vielmals, Xebov! Werd mich nochmal mit dem Z-Buffer intensiver beschäftigen. 🙂


Anmelden zum Antworten