1 registered members (AndrewAMD),
831
guests, and 5
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Re: Einzelne Objekte vor Postprocessing-Shader "schützen"
[Re: Superku]
#458037
02/13/16 20:34
02/13/16 20:34
|
Joined: Apr 2010
Posts: 172
wdlmaster
Member
|
Member
Joined: Apr 2010
Posts: 172
|
Die von Superku vorgeschlagene Methode hat den Nachteil, dass man eine zweite Kamera benötigt (Entities werden unnötigerweise noch mal gerendert) und die vom Postprocessing ausgeschlossenen Objekte werden immer VOLLSTÄNDIG ausgeschlossen, egal ob sie teilweise von nicht-auszuschließenden Objekten überlagert werden oder nicht.
Man nimmt sich einen Render-Target zur Hand und "maskiert" damit die Objekte, die ausgeschlossen werden sollen. Dazu erstellst du erstmal ne Bitmap, die die selbe Auflösung wie die Kamera hat. Dann setzt du den target1-Parameter der Kamera auf diese Bitmap. Dadurch kannste im Pixelshader per color1-Register in diese Bitmap schreiben (vorausgesetzt color1 wird noch nicht für andere Zwecke verwendet). In dem Shader, der auf die auszuschließenden Entities angewendet wird, fügst du im Kopf des Pixelshaders ne neue float4-Variable hinzu, die du dem color1-Register zuweist. Irgendwo im Pixelshader setzt du diese Variable dann einfach auf 1.
Im Postprocess-Shader nimmst du die oben erstellte Textur dann als "Maske", um alles, was schwarz (!) ist zu bearbeiten und den Rest nicht. Du musst also die Maske im Pixelshader invertieren. Das ist so gewählt, weil dadurch die Kompatibilität mit Objekten sichergestellt ist, die keine Shader sondern nur das Standardmaterial zugewiesen haben. Diese werden einfach mit solidem schwarz gerendert. Willst du stattdessen die "intuitive" Version, wo die auszuschließenden Objekte schwarz und der Rest weiß ist, müsstest du erstens JEDEM Objekt einen Shader zuweisen und zweitens in JEDEM Shader ins color1-Register schreiben.
Ein Nachteil dieser Methode ist, dass die sky_color unbedingt schwarz sein muss. Kannst also keine andere Farbe verwenden. Ansonsten ist dein Postprocessing von der Helligkeit des Hintergrunds abhängig.
|
|
|
Re: Einzelne Objekte vor Postprocessing-Shader "schützen"
[Re: Superku]
#458042
02/14/16 00:04
02/14/16 00:04
|
Joined: Sep 2005
Posts: 352 Germany
preacherX
OP
Senior Member
|
OP
Senior Member
Joined: Sep 2005
Posts: 352
Germany
|
Danke für die Antworten! Mal schauen ob ich das als absolute "Shader-Programmierer-Niete" hinkriege... ^°
|
|
|
Re: Einzelne Objekte vor Postprocessing-Shader "schützen"
[Re: preacherX]
#458046
02/14/16 08:50
02/14/16 08:50
|
Joined: Apr 2010
Posts: 172
wdlmaster
Member
|
Member
Joined: Apr 2010
Posts: 172
|
...da per NOENT-parent auch nur die tatsächlich benötigten Entitys gerendert werden...
Verwechsle nicht das bloße Schreiben von ein paar Pixeln in einen weiteren RAM Bereich mit dem kompletten Neurendern von Objekten. In der Render-Target-Methode wird garnichts neu gerendert, bei der NOENT-Methode schon. Ehe Acknex mit ihren lahmarschigen Algorithmen irgendwelche Entities aus den Views entfernt und im neuen View alle Matrizen und Parameter (überflüssigerweise) nochmals vorbereitet hat, hat die GPU die paar Pixel quasi im Vorbeigehen noch 100 mal geschrieben, mit null Performance-Verlust. Was ist, wenn ich mehr Masken benötige? In den Render-Target passen 4, also erstell ich noch 3 weitere Kameras und geh das Acknex-interne Prozedere noch 3 weitere überflüssige Male durch, wenn mir die GPU das selbe Ergebnis mit NULL Performance-Verlust direkt und ohne Engine-Umwege liefert? Hmmm...
|
|
|
Re: Einzelne Objekte vor Postprocessing-Shader "schützen"
[Re: tagimbul]
#462363
09/23/16 18:57
09/23/16 18:57
|
Joined: Apr 2010
Posts: 172
wdlmaster
Member
|
Member
Joined: Apr 2010
Posts: 172
|
Ist zwar ne späte Antwort meinerseits (ich schaue nur ganz selten mal hier vorbei) aber egal: hab ich das richtig verstanden? 1 view = 3 Channels
Nicht ganz. 1 View = 4 Render-Targets, 4 Kanäle pro Target (RGBA). Der "nullte" Target ist das normale Bild, was sowieso immer ausgegeben werden muss (COLOR0) + die 3 zusätzlichen Targets 1...3 (COLOR1...3) wenn ich einzelne effekte auf einem model haben will, wie z.B einen Bloom und einen Blur, dann mache ich ein material das model1 ins target1/COLOR1 packt für bloom, model2 ins target2/Color2 packt für blur, und die scene ohne model 1 und 2 in target3/COLOR3
Das ist zu viel unnötiger Overhead für dieses Vorhaben, weil du ja dafür gerade mal 2 Kanäle im ersten Target benötigst, die Targets 2 und 3 kannst du für zukünftige Effekte verwenden. Du hast in jedem Target 4 Kanäle zur Verfügung, in denen du beliebige Informationen ablegen kannst. Es kommt nur darauf an, wie diese Kanäle von deinem Post-Process-Shader interpretiert werden. Du packst die Maske für den Bloom in den Rot-Kanal und die Maske für den Blur in den Grün-Kanal. Mehr braucht der Post-Process-Shader nicht zu wissen. Da Bloom und Blur sowieso globale Effekte sind, die unabhängig von platzierten Objekten IMMER ausgeführt werden, brauchst du da nix irgendwelchen Targets zuzuweisen. Beim Blur interpolierst du einfach das gerenderte Bild (TargetMap) mit dem verwischten Bild (im Pixelshader berechnet) und nimmst den Grün-Kanal des ersten Targets als Faktor für die Interpolation. Allerdings ist es da auch nötig, die Maske selbst noch zu verwischen, da ansonsten das verwischte Bild zwar auf der Entity erscheint, aber nicht in benachbarte Pixel übergeht.
|
|
|
|