JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=be425c43d92d0ce7f90e59bc0fdc4769Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

ZBuffer Readback

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 09.06.2006, 16:26    Titel: ZBuffer Readback Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 09.06.2006, 21:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 10.06.2006, 20:01    Titel: Antworten mit Zitat

Wie würdest du es denn per Pixeshader lösen?

Pseudocode reicht schon Smile
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 11.06.2006, 00:00    Titel: Antworten mit Zitat

Das höchste was ich bisher mit Shadern gemacht habe, war die Fixed-Function-Pipline nachzumachen Wink
_________________
»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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 11.06.2006, 00:47    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 11.06.2006, 12:27    Titel: Antworten mit Zitat

Ich werde einfach mal das ganze implementieren dann kann ich sagen wie sehr die performance einbricht.

@DrBest: Der Geschwindigkeitsvorteil (sollte er denn existieren Wink) wird aber sehr schnell verloren gehen wenn du Scenen hast mit vielen tausenden sichtbaren Polygonen.

Aber danke hier her für die tips Smile
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 11.06.2006, 18:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum