VBO Transparenz



  • Guten Morgen

    hier nochmal eine Frage bezuglich VBO und Transparenz

    Ich habe 3 verschiedene primitive Würfel, Kugel, Zylinder deren räumliches
    Zentrum bei 0,0,0 liegt.
    Jedes ist in einem VBO abgelegt das Koordinaten, Normale, und Farbe für jeden
    Vertex enthält.
    Der Alpha Anteil Würfel = 64 Kugel = 64 Zylinder = 255

    Wenn ich den Zylinder zuletzt zeichne ist er nicht sichtbar -
    Zeichne ich ihn zuerst ist er sichtbar
    seine Kontur ist vollständig innerhalb des Würfels.

    Was habe ich falsch gemacht??

    Gruss Peter



  • Wenn du erst den Würfel zeichnest schreibt dieser in den Tiefenbuffer.
    Wenn du nun den Zylinder zeichnest stellt dieser fest, dass er verdeckt ist (z-test failed für alle Fragmente) und er wird nicht gezeichnet.

    Für korrekte Transparenz:
    Objekte (bei nested objects - wie bei dir - Dreiecke) sortieren und von hinten nach vorne zeichnen!



  • Das kann ich nachvollziehen - aber der Würfel ist transparent alpha = 64,
    das heisst das System müsste den dahinterliegenden ( bzw darin liegenden ) Körper wegen der Transparenz des vorderen Körpers darstellen.



  • Was meinst du mit "das System"? Falls du damit OpenGL meinst: Nope, das sortiert deine Dreiecke nicht für dich. Wie mein Vorposter schon geschrieben hat: Wenn du korrekte Transparenz willst, musst du transparente Objekte von hinten nach vorne rendern, also eben Objekte, die weiter hinten sind, zuerst zeichnen...auch das funktioniert aber nur bedingt...



  • Schade - danke für die Antworten

    Gruss Peter



  • Um solche transparenten Sachen zu rendern macht man meist folgendes:

    1.Zuerst alles nicht transparente rendern!

    Nun kommt es darauf an welche Arten von Transparenz du benutzt. Wenn es nur addierend/subtrahieren ist kannst du dir das Sortieren ersparen.

    2.Ansonsten wird jetzt von der Blickrichtung aus sortiert. So dass die weiter entfernten Sachen zuerst gerendert werden.

    Da es zu aufwändig wäre jeden einzelnen Polygonen zu sortieren (Außer es sind nur sehr wenige), sollten 3d-Objekte sortiert werden. Dies kann zwar zu Grafikfehlern führen wenn diese Objekte überlappen, ist aber in den meisten Fällen vermeidbar und man erkauft sich so sehr viel weniger Rechenaufwand.

    3.Die transparenten Sachen werden nun mit eingeschaltetem Tiefentest gerender, jedoch wird nicht in den Tiefenpuffer geschrieben!

    Und bitte bedenken dass Transparenz deutlich mehr GPU Leistung verbraucht als "normales" Flächenfüllen.



  • Osbios schrieb:

    Da es zu aufwändig wäre jeden einzelnen Polygonen zu sortieren (Außer es sind nur sehr wenige), sollten 3d-Objekte sortiert werden. Dies kann zwar zu Grafikfehlern führen wenn diese Objekte überlappen, ist aber in den meisten Fällen vermeidbar und man erkauft sich so sehr viel weniger Rechenaufwand.

    Ein Trick ist, jedes Objekt zweimal zu rendern, zuerst die Backfaces und dann die Frontfaces. Das stimmt zwar nur für konvexe Objekte zu 100%, aber es sieht zumindest besser aus als gar nicht sortiert. Und im Fall des konkreten Problems hier, hilft es wohl leider gar nix...

    Osbios schrieb:

    Und bitte bedenken dass Transparenz deutlich mehr GPU Leistung verbraucht als "normales" Flächenfüllen.

    Das kann man so allgemein wohl nicht unbedingt sagen...

    Auch ist es auf modernen GPUs möglich, echte Order Independent Transparency hinzubekommen (Alpha to Coverage, Per Pixel Linked Lists). Das sind dann aber schon relativ fortgeschrittene Techniken...



  • Hallo

    nochmal danke für die Tipps, es sieht wohl so aus als wenn es den globalen
    Lösungsweg nicht gibt - ist immer anwendungsspezifisch.

    Gruss Peter


Log in to reply