Problem mit Alphablending



  • Hallo zusammen
    Ich habe irgendwie ein ganz generelles Problem mit Alphablending, und zwar sollte man ja IMHO die Objekte von Hinten nach vorne sortieren, um ein korrektes Blending zu erhalten. Das Problem ist aber nun, dass ich im Zusammenhang mit Planzen und Bäumen das gar nicht machen kann, da habe ich flache Ebenen übereinandergekreuzt, welches soll ich da bitte schön zuerst rendern? :p

    Ich habe mal folgendes versucht:

    // enable alpha testing
     pDev->SetRenderState(D3DRS_ALPHATESTENABLE,true);
     pDev->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_GREATER);
     pDev->SetRenderState(D3DRS_ALPHAREF,0xf0);
    
     // render only the opaque parts
     pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4*cPtc,0,2*cPtc);
    
     // now inverse the alpha testing function, enable alphablending and
     // disable z-writing (but still don't draw pixel which are behind already rendered ones)
     pDev->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_LESSEQUAL);
     pDev->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
     pDev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
    	pDev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
     pDev->SetRenderState(D3DRS_ZWRITEENABLE,false);
    
     // now render the transparent fringe
     pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4*cPtc,0,2*cPtc);
    
     // finally restore all render states
     pDev->SetRenderState(D3DRS_ALPHAREF,0x00000000);
     pDev->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_NOTEQUAL);
     pDev->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
     pDev->SetRenderState(D3DRS_ZWRITEENABLE,true);
    

    Jedoch habe ich damit nur mässigen Erfolg erzielen können 😞

    Gibt es da wirkungsvollere Ansätze?



  • versuchs mit OpenGL. Das ist einfacher.



  • @neoexpert
    Also ich kenne OpenGL auch gut (mussten wir an der Uni lernen) finde ich aber überhaupt nicht einfacher, sobald es etwas über ein "YEEAAHH, ich kann eine Pyramide zeichnen" hinausgeht.

    Aber ich verstehe jtzt nicht ganz, was das mit meiner Frage zu tun hat, in OpenGL hat man IMHO genau dasselbe Problem



  • Ja gut da habe ich mist gebaut. Entschuldigung.
    EDIT:
    vielleicht hilft dir das weiter:
    http://wiki.delphigl.com/index.php/Tutorial_Lektion_7#Blending-Verfahren



  • Ja, das is ein allgemein bekanntes Problem. Zum Teil ist eine Lösung nur mit größerem Aufwand zu erziehlen (wenn überhaupt). Allgemein ist die Vorgehensweise:

    o sortieren der surfaces nach translucenten und opaque
    o zwrite enable
    o rendern der surfaces mit opaque flag
    o zwrite disable
    o enable blending
    o rendern der translucenten surfaces
    

    So besteht natürlich immer noch das Problem das translucente Objekte ggf falsch gerendert werden wenn sie nicht in der korrekten Reihenfolge vorliegen (Tiefensortierung). Du kannst also versuchen die Objekte zu sortieren (z.B. Spatial Sorting per BSP/Octree) und triffst dann aber unweigerlich auf Fälle wo es keine korrekte Sortierung gibt. In dem Fall kannst du versuchen die Polygone nochmals extra splitten. Aber selbst dann gibt es Fälle wo es nicht möglich ist Polygone korrekt zu sortieren.

    Eine Möglichkeit ist es alle potentiellen Fehler zu ignorieren und im Leveldesign dafür zu sorgen das Renderfehler nicht auftreten können. Oder einen Ansatz zu verwenden der nicht auf Tiefensortierung basiert (z.B. Depth Peeling).



  • Es gäbe da noch eine Methode: "Alpha-To-Coverage"
    Der Nachteil besteht leider darin, dass erst ab 8x Multisampling das Ergebnis zufriedenstellend ist.


Anmelden zum Antworten