Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 09.06.2006, 15:26 Titel: ZBuffer Readback |
|
|
Hi, ich habe folgende Situation, um festzustellen ob eine Position im gerenderten Bild eine bestimmte Tiefe unterschreitet möchte ich mir eine ZBuffer Readback Funktion basteln.
Mit dieser Funktion möchte ich herausfinden wie viele Bildpunkte einen bestimmten Punkt mit Radius nicht verdecken.
Das ganze hat folgenden Sinn, wenn ich einen Lensflare Effekt haben möchte könnte ich einen TraceLine Test machen der mir sagt ob zur Lichtquelle freie Bahn besteht, das ist allerdings keine gute Lösung wie ich finde. Ich möchte viel mehr herausfinden wieviel Prozent der Lichtquelle verdeckt sind (also Punktlicht mi Radius).
Dazu verfolge ich diesen Ansatz:
Zitat: | Nachdem die Scene gerendert wurde (evtl noch kein Lensflare Effekt gerendert) sichere ich das aktuelle Bild in eine Textur (Orignal).
Nun wird die Scene schwarz gefärbt (evtl nur an der Ausleseposition).
Nun rendere ich an der Ausleseposition ein weisses Quad (evtl weisse Kreistextur) mit ZWrite=false und ZTest=LesserEqual.
An der Ausleseposition kopiere ich mir das gerenderte in eine neue Textur (ZBufferReadBackTextur) welche weisse Stellen dort hat an der die ZBufferWerte niedriger sind als meine Auslesepositionstiefe.
Nun Locke ich die ZBufferReadBackTextur und berechne die Anzahl der geschriebenen Pixel (weisse).
Anschliessend habe ich die Anzahl der unverdeckten Bildpunkte woraus ich dann auch den benötigten Prozentwert errechnen kann.
Nun kann ich noch die getestete Stelle mit der Orignal Textur wieder herstellen (muss nicht immer nötig sein)
|
Die Vorteile dieser Methode wäre:
- kein Tracelinetest um zu sehen ob das Licht sichtbar wäre
- ich kann AlphaTest Texturen problemlos nutzen
- die Methode kann auch verwendet werde um Lightshaft Texturen zu bekommen (ihr wisst schon, glotzt in ne Baumkrone zur Sonne und ihr seht Sonnenstrahlen)
Der Nachteile:
- benötigt extra Texturen
- Textur muss gelockt und ausgelesen werden
Soo und nun frage ich euch ob sich der Ansatz lohnt oder ob ihr einen besseren habt. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 09.06.2006, 20:20 Titel: |
|
|
Ich glaube das, das ganze ziemlich auf die Performance, geht. Vorallem das locken und auslesen. Aber kann man nicht schneller über einen Pixelshader lösen? _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 10.06.2006, 19:01 Titel: |
|
|
Wie würdest du es denn per Pixeshader lösen?
Pseudocode reicht schon _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 10.06.2006, 23:00 Titel: |
|
|
Das höchste was ich bisher mit Shadern gemacht habe, war die Fixed-Function-Pipline nachzumachen _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 10.06.2006, 23:47 Titel: |
|
|
Also ich hätte auch keine Ahnung wie man das mit Pixelshadern lösen könnte. Aber die Methode die du da genannt hast hört sich wirklich ziemlich ineffizient an. Und ich gehe mal schwer davon aus, dass du das in einer realtime Anwendung verwenden willst.
Also so lange es dir nur darum geht den Raytracingtest zu ersetzen halte ich es für unangebracht. Wenn ich das richtig verstanden habe geht es ja in erster Linie darum herauszufinden, wie viel Prozent einer Kreisförmigen Fläche sichtbar sind. Also wie wäre es denn zum Beispiel mit Folgendem?
Erstmal ermittest du welche Meshs den Kegel von der Kamera zu der kreisförmigen Fläche kontaktieren, zum Beispiel mit Bounding Boxen. Dann projezierst du die Vertices dieser Meshs zu Bildschirmkoordinaten. Und schließlich überprüfst du welche der Dreiecke in dem kreisförmigen Bereich sind und rechnest per Vektorprodukt deren Flächen zusammen. Ist nicht ganz präzise wenn man mehrere einander verdeckende Dreiecke hat und man müsste sich noch ein Verfahren überlegen um Dreiecke zu behandeln die nur partitiel in dem kreisförmigen Bereich liegen. Aber es ist allemal effizienter als die ZBuffer Readback Methode.
Wenn es dir aber um die andern beiden Vorteile des ZBuffer Readback, die du aufgelistet hast, geht halte ich das durchaus für angebracht. |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 11.06.2006, 11:27 Titel: |
|
|
Ich werde einfach mal das ganze implementieren dann kann ich sagen wie sehr die performance einbricht.
@DrBest: Der Geschwindigkeitsvorteil (sollte er denn existieren ) wird aber sehr schnell verloren gehen wenn du Scenen hast mit vielen tausenden sichtbaren Polygonen.
Aber danke hier her für die tips _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 11.06.2006, 17:16 Titel: |
|
|
Habs nun implementiert, es gibt keinen erkennbaren Geschwindigkeitsverlust.
und...
ich liebe C#
=)
Edit: wenn jemand möchte kann ich den ganzen Code mal posten, wäre dann C# oder wenn gewollt Pseudocode. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
|