ich hab mal eine Frage wie man genau Decals in die Szene projeziert. Wie genau definiert man die Position und ausrichtung des Projektors? Müsste ja immer irgendwie 90° zur gewählten Weltposition sein? So ins blaue würd ich schätzen das da die Normale noch eine Rolle spielt. Hab schon bissl gesucht doch noch kein Beispiel gefunden.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Bin mir grad nicht sicher ob du Lichter oder den Partikeleffekt meinst. Beim Licht nutzt man einfach die relative Lichtrichtung als Texturkoordinaten. Für die Partikel gibt es unterschiedliche Ansätze in jeden Fall musst du aber erst berechnen welche Oberflächen du bearbeiten willst. Das einfachste ist es nun diese Oberflächen mit entsprechenden Blendoptionen,Texturcoordinaten und Wiederholungsmodus einfach noch einmal zu zeichnen. Etwas schwieriger ist das sogenannte Stainmapping. Hier hast du wie bei Lightmaps Texturen die deine Oberflächen umhüllen, und zeichnest deine Decals einfach dort rein. Beide Methoden haben ihre Vor und Nachteil. So hast du zwar bei der ersten Methode eine ziehmlich hohe Qualität aber dafür ist es bei der zweiten egal wie viele Decals du zeichnest und du hast die Pixeldaten vor dem Vertexshader.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@yunharla: Zumindest deine Frage lässt sich beantworten: Weder Lichter noch Partikel, sondern Decals.
Das Prinzip wird nicht anders sein als bei projezierten Schatten. Wenn das hier jemand erklären könnte, wäre es nett wenn ihr mit erklärt wie man diese Informationen am besten in der Szene speichert. (Also "wo" sind Blutflecken/Löcher etc.)
_________________ Blog: kevin-fleischer.de und fbaingermany.com
ja es geht um Decals, keine Lichter Das Prinziep muss ja gleich sein wie bei einer Lichtprojektion. Ein Decal dürfte nicht mehr infos haben wie die 3D - WeltPosition, also genau auf der Fläche. Also ich Pick mir dir 3D-Mausposition und erzeuge mir dort ein neues Decal. Ich müsste nur wissen wo sich der Projektor befindet. Gerichtet wäre er ja genau auf die position des decals (gluLookAt). Über die Projektionsmatrix könnte man ja die größe skalieren.. Doch wie bekomm ich die Position des Projektors?
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Da gabs wohl nen missverständniss, ich zähl Decals immer zu Partikel weil sie ja letztenendes vom Partikelsystem erzeugt werden.... naja wie auch immer. Ich würde dir von der Projektion deiner Decals abraten und dir empfehlen lieber eine der genannten Methoden zu verwenden. Projektion würde letztenendes nur Vorteile in einer einfachen und vor allen statischen Szene bieten (wobei auch hier die anderen Verfahren schneller wären...). Ansonsten würdest du eine ganze Reihe an Mehraufwand haben um alle Probleme dabei zu eleminieren (schon alleine einfache Sachen wie Verdeckung).
Übrigens das was man dort bei Humus sieht ist ein sehr schlechter Ansatz. Denn es braucht in jedenfalle mehr Speicher und ist langsamer als z.B. Stainmapping (womit man selbst auf ner kack 3dfx Karte unendlich viele Decals zeichnen kann). Außerdem funktioniert es ebenfalls nicht mehr bei Animationen
nun da ich eh eine Deferred Shading Pipeline habe, denk ich das Projektion vielleicht doch nicht allzu dumm ist...Wollte da eigentlich keine Wissenschaft draus machen.. Lediglich paar Details in die Szene bringen
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Thmfrnk hat geschrieben:
nun da ich eh eine Deferred Shading Pipeline habe, denk ich das Projektion vielleicht doch nicht allzu dumm ist...Wollte da eigentlich keine Wissenschaft draus machen.. Lediglich paar Details in die Szene bringen
so Wissenschaftlich ist das garnicht in kurz: Du müsstest auf forward Rendering setzen da dir, bei einen Decal, die Tiefenwerte ja föllig egal bzw sogar hinderlich sind. Ansonsten wirst du nicht nur deine Decals auf falsche Flächen zeichnen sondern du würdest auch eine ganze Ecke an Vielfalt verlieren (z.B. bei der Art der Mischung, Überlappung von Decals.....)
versteh ich überhaupt nicht. Ob ich nun mein Licht projeziere oder eine Decal Textur, wo ist der unterschied? Warum Tiefe hinterlich? Decals die von anderen Objekten verdeckt werden sieht man ja auch nicht. Ich denke man müsste den Projektor 90° über der Position des Decals Positionieren und drauf projezieren. Kann man dazu nicht einfach die Normale an der Position nutzen? In meinem Deferred Pass hab ich doch am Ende die 3D Position und die Normale. ForwardRendering kommt mir nicht ins Haus
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
yunharla hat geschrieben:
Da gabs wohl nen missverständniss, ich zähl Decals immer zu Partikel weil sie ja letztenendes vom Partikelsystem erzeugt werden.... naja wie auch immer.
Das musst du mal kurz erklären. Was haben Partikel mit Decals zu tun? Partikel sind vergängliche, animierte Kleinteile im freien Raum. Decals sind dauerhafte oder mindestens temporäre statische Abbildungen auf Oberflächen.
Wie passt das zusammen?
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Flash hat geschrieben:
yunharla hat geschrieben:
Da gabs wohl nen missverständniss, ich zähl Decals immer zu Partikel weil sie ja letztenendes vom Partikelsystem erzeugt werden.... naja wie auch immer.
Das musst du mal kurz erklären. Was haben Partikel mit Decals zu tun? Partikel sind vergängliche, animierte Kleinteile im freien Raum. Decals sind dauerhafte oder mindestens temporäre statische Abbildungen auf Oberflächen.
Wie passt das zusammen?
Wenn du z.B. ne Rackete abfeuerst entsteht ein Decal an der Selben stelle wie die Explosion... Ich weiß blah keks ist nicht immer so .... who cares?
Thmfrnk hat geschrieben:
versteh ich überhaupt nicht. Ob ich nun mein Licht projeziere oder eine Decal Textur, wo ist der unterschied? Warum Tiefe hinterlich? Decals die von anderen Objekten verdeckt werden sieht man ja auch nicht. Ich denke man müsste den Projektor 90° über der Position des Decals Positionieren und drauf projezieren. Kann man dazu nicht einfach die Normale an der Position nutzen? In meinem Deferred Pass hab ich doch am Ende die 3D Position und die Normale. ForwardRendering kommt mir nicht ins Haus
Der Unterschied ist das du beim Licht ein homogen gefülltest Volumen definiert hast und bei Decals eine nicht homogen gefüllte Fläche innerhalb eines bestimmten Polygons. Soll heißen, deine Tiefenwerte bleiben nur korrekt solange sie von einer Projektionsebene die parallel zu diesen Polygon liegt ausgehen. Ansonsten machen dir die Parallaxen, im wahrsten Sinne des Wortes, einen Strich durch die Rechnung (lol komm ders gut). Da der Abstand von Projektionsebene zur Ebene des Polygons immer gleich bleibt, sind damit auch deine Tiefenwerte sinnlos und, sofern sie nicht 0 sind, sogar durch ihre limitierte Präzision hinderlich. Also nimmst du am besten gleich die Ebene von diesen Polygon. Anschließend musst du noch die Punkte bestimmen die innerhalb der Eckpunkte liegen. Man will ja schließlich nicht den Decal auf alle Punkte der Selben Ebene zeichen
Fazit: der einzige Unterschied ist das du eine ganze Ecke von Optimierung der Vertexdaten auf die CPU auslagern müsstest. Und dein Shader an sich schon etwas langsamer wäre.... Diese Leistungseinbußen würde ich persöhnlich lieber in impliziete Pixeldaten der Decals investieren dann kann man sie nämlich hübsch skalieren
Ich meinte licht nicht im Sinne von Punktlichter o.ä. Sondern projezierte Texturen (deferred). Genauso kann ich doch den gleichen Pass für die Deacals nutzen, allerdings mit einer ortho Projektion?
Registriert: Di Aug 09, 2011 07:33 Beiträge: 163
Programmiersprache: C/C++
Wenn ich denn mal hier auch mal eine Frage stellen darf: Was wäre denn die effektivste Möglichkeit die Position für ein decal zu bestimmen?
Aktuell mache ich es wie folgt: Für jedes Dreieck in der Szene erstelle ich eine Ebene mit dem Kreuzprodukt. Aus meiner Kamera-Position + Forword Vektor habe ich eine Gerade wodurch ich dann den Durchstoßpunkt Gerade Ebene ermittle. Ist das getan, überprüfe ich noch ob der Durchstoßpunkt im Dreieck liegt. Klappt zwar ehrlich gesagt gut aber wenn ich mir die Performance angucke, dann ist das doch alles crap Man stelle sich eine Szene mit 500.000 Polys vor. Da bei jedem einzelnem Dreickeck die ganzen Sachen durchgehen ist schon ein enormer Aufwand.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Naja ist ja nur die Erstellung in deinen Fall von daher sollte es nicht sooo Stark ins Gewicht fallen. Wenn dein Baum aber an sich zu Lange zum durchlaufen braucht solltest du mal über k-d Bäume nachdenken.
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Ich möchte mich auch mal einmischen.
Ich habe die Diskussion jetzt schon ein paar Tage beobachtet, für mich ist die eigentliche Fragestellung noch völlig unklar. Und mir kommt es so vor, als ob hier einige völlig aneinander vorbeireden.
Vielleicht sollte man erstmal den genauen Verwendungszweck des Gewünschten bzw die Definition von Decals klarstellen?
Für mich sind Decals relativ kleine, dynamisch erzeugte Objekte (meist Quads) wie etwa Einschusslöcher, Fussabdrücke etc. , die ausserdem noch eine relativ geringe Lebenszeit haben (sieht man in jedem aktuellen Spiel, dass die Dinger nicht ewig an den Wänden kleben). Insofern kommt dabei das Handling durch ein Partikelsystem am ehesten in Frage. Und zur Berechnung wird dazu nur eine Position und die Normale benötigt. Natürlich kann man den Begriff Decal auch auf andere Transparente Objekte ausweiten, z.B. Kratzer auf dem Boden, abgeplatzter Putz auf Wänden oder Graffiti. Allerdings haben solche Objekte keine beschränkte Lebenszeit und werden in der Regel auch nicht dynamisch über die Szene verteilt. So etwas gehört dann IMHO direkt in die Szene, als statische Geometrie.
Zitat:
Man stelle sich eine Szene mit 500.000 Polys vor. Da bei jedem einzelnem Dreickeck die ganzen Sachen durchgehen ist schon ein enormer Aufwand.
Da wäre sicherlich die Verwendung eines Scenegraph ratsam um mögliche Kollisions-/Intersektionsberechnungen gering zu halten.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
genau, also mir kommt es eher auf die statische Variante an. Ich möchte halt rel. einfach statische Detaileffekte in die Szene bringen. Wie z.b. Fitzen auf dem Boden, Dreck an den wänden oder sonstiges.. Problem ist aktuell das ich noch kein gescheites Austauschformat gefunden habe, welches Multitexturing unterstützt (nutze aktuell 3ds files). Daher wollte ich diese Effekte in meinem Welteditor einbringen. Ich dachte da an Projektion um auch auf komplexe Szenerie rel. einfach so einen Effekt zu pappen. Auch die Anzahl der "Decals" wäre nicht so hoch, vielleicht 5-10 Stk.
Bei einer normalen Projektion hab ich aber grad bedenken, da ich ja hier auch eine Schattenberechnung mit einbauen muss, damit ich nicht auf dahinter liegende Objekte projeziere.
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.