- #version 150 compatibility
- centroid in vec2 meNormal;
- void main(void)
- {
- gl_FragColor = Destination(gl_Position.X + meNormal.X, gl_Position.Y + meNormal.Y);
- }
DGL https://delphigl.com/forum/ |
|
Destination Pixel abfragen https://delphigl.com/forum/viewtopic.php?f=20&t=10785 |
Seite 1 von 2 |
Autor: | Knittel [ So Mär 10, 2013 20:48 ] |
Betreff des Beitrags: | Destination Pixel abfragen |
Hallo allerseits, Ich hab mal ne kurze Frage. Wie kann ich bei dem Fragment Shader den Destination Pixel abfragen. Also der Pixel der sich bereits im Framebuffer befindet? Danke schonmal. |
Autor: | Coolcat [ So Mär 10, 2013 21:55 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
Kurz: Das ist nicht möglich. ![]() Lang: Du kannst lediglich über Blend-Operationen den Dest-Pixel einfließen lassen. Das passiert aber erst nach dem Shader. Je nachdem was du machen willst kann auch ein FBO eine Option sein. Damit kannst aber natürlich nur auf Pixel zugreifen die zuvor in eine Textur gerendert wurden. Beachte aber das eine Textur niemals gleichzeitig Quelle und Ziel sein kann. Also du kannst nur etwas rendern, den FBO umhängen und wieder etwas rendern. Innerhalb eines Drawcalls funktioniert das nicht. |
Autor: | Knittel [ Mo Mär 11, 2013 00:25 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
Ok. Dankeschonmal. Ich denke ich werde dann ein FBO benutzen. Ich möchte nämlich einen Tarnmechanismus entwickeln, der das Objekt zwar tarnt aber nicht perfekt. Dafür hatte ich mir ungefäht überlegt, dass ich im Vertexshader die Normale durch die ModelviewProjectionMatrix jage und dann im Fragment Shader ich gl_Color gleich der Farbe setze von der destination um die normale verschoben. FragmentShader Psuedo Code: Code:
Habt ihr da vielliecht noch ne Vorschlag wie man das elegant lösen kann ohne, das wenn ich jetzt verschiedene solcher Objekte habe nicht jedesmal einen ganzen Framebuffer füllen muss. Idee: Würde sich dafür nicht sogar CopyTexImage eignen? Das ich ungefähr berechne welcher Teil hinter dem Objekt ist und dann von diesem Ausschnit CopyTexImage in eine neue Textur mache und was passiert eigentlich wenn ich mit CopyTexImage einen Teil des nicht sichtbaren Bereichs kopieren würde? |
Autor: | Shaijan [ Mo Mär 11, 2013 08:20 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
Hey, das hört sich stark nach Refraction an. Solche Effekte werden z.B. bei Wasser benutzt um den Hintergrund je nach Wellengang (oft anhand der Flechennormale berechnet) zu 'verzerren' oder bei Hitzeflimmern. Da hast du 2 Möglichkeiten: 1. Du renderst alles vorher in ein FBO und benutzt dieses um auf die Farbe zuzugreifen. (wie schon erwähnt) 2. Du renderst eine Refractionmap in ein extra FBO (etwa die Normalen des getarnten objektes) und benutzt diese um nach dem Rendern in einem Zusätzlichen pass den Effekt anzuwenden. Dazu musst du aber auch alles andere in ein FBO rendern. Das wäre dann Post Processing. Das eignet sich wahrscheinlich besser wenn du mehrere solche Objekte hast. |
Autor: | yunharla [ Mo Mär 11, 2013 12:20 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
Shaijan hat geschrieben: Hey, das hört sich stark nach Refraction an. Solche Effekte werden z.B. bei Wasser benutzt um den Hintergrund je nach Wellengang (oft anhand der Flechennormale berechnet) zu 'verzerren' oder bei Hitzeflimmern. Da hast du 2 Möglichkeiten: 1. Du renderst alles vorher in ein FBO und benutzt dieses um auf die Farbe zuzugreifen. (wie schon erwähnt) 2. Du renderst eine Refractionmap in ein extra FBO (etwa die Normalen des getarnten objektes) und benutzt diese um nach dem Rendern in einem Zusätzlichen pass den Effekt anzuwenden. Dazu musst du aber auch alles andere in ein FBO rendern. Das wäre dann Post Processing. Das eignet sich wahrscheinlich besser wenn du mehrere solche Objekte hast. Das wird nicht funktionieren... bzw sieht extrem haesslich aus. Die Copy Methode ist schon so ziehmlich das beste was man tun kann. In Pseudo siehts etwa so aus Code:
|
Autor: | Lord Horazont [ Mo Mär 11, 2013 12:22 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
Ich sehe gerade nicht, wie die größten Artefakte die mir gerade einfallen (Objekte, die vor der refraktierenden Ebene sind blenden in die Ebene mit rein) bei dir nicht auftreten? Oder meintest du was anderes mit „extrem hässlich“? grüße |
Autor: | yunharla [ Mo Mär 11, 2013 13:59 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
Lord Horazont hat geschrieben: Ich sehe gerade nicht, wie die größten Artefakte die mir gerade einfallen (Objekte, die vor der refraktierenden Ebene sind blenden in die Ebene mit rein) bei dir nicht auftreten? Oder meintest du was anderes mit „extrem hässlich“? grüße Ja den Fehler kann man bei beiden sehr leicht beheben ... einfach den Tiefenpuffer noch mit in den Shader packen. FBO ist vor allen hässlich weil es ja Normalen sind.... da muss ich wohl niemanden erklären welches Problem das mit sich bringt. |
Autor: | Lord Horazont [ Mo Mär 11, 2013 15:03 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
yunharla hat geschrieben: da muss ich wohl niemanden erklären welches Problem das mit sich bringt. Mir schon, sorry, ich steh da auf dem Schlauch. Was spricht dagegen, die Normalen in einen Float-FBO zu rendern? Ok, man verschwendet eine Kompontente an Platz, aber damit kann man leben. Da kann man ja ggf. noch irgendwas reinkodieren, was hilfreich ist (z.B. ne Intensität für eine Reflektion oder sowas).grüße |
Autor: | yunharla [ Mo Mär 11, 2013 17:02 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
Lord Horazont hat geschrieben: yunharla hat geschrieben: da muss ich wohl niemanden erklären welches Problem das mit sich bringt. Mir schon, sorry, ich steh da auf dem Schlauch. Was spricht dagegen, die Normalen in einen Float-FBO zu rendern? Ok, man verschwendet eine Kompontente an Platz, aber damit kann man leben. Da kann man ja ggf. noch irgendwas reinkodieren, was hilfreich ist (z.B. ne Intensität für eine Reflektion oder sowas).grüße Und wie siehts mit blending in diesen Fall aus? |
Autor: | Lord Horazont [ Mo Mär 11, 2013 17:57 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
Ich würde für das Normalen-Color-Attachment einfach den Alphakanal der Quelle auf 1.0 setzen. Damit ist man das Blending-Problem im normalfall (also mit glBlendFunc(…, GL_ONE_MINUS_SRC_ALPHA), für die relevanten Werte von …) schonmal los. grüße |
Autor: | Coolcat [ Mo Mär 11, 2013 18:30 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
Statt die Normale in eine RGB-Float-Textur zu rendern reicht es in diesem speziellen Fall wohl auch nur das Displacement zu rendern. Das wird ja üblicherweise ein kleiner Pixelwert sein, z.B. 5px. Da sollten 2 mal 8bit ausreichen ![]() |
Autor: | yunharla [ Mo Mär 11, 2013 19:03 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
Kein Plan ob ihr verstanden habt was ich mit Blending meine: Nehmen wir mal in deiner Szene läuft der Predator rum. Das dürfte tatsächlich wie beschrieben funktionieren. Nun kommt der Zweite Predator und verdeckt den ersten. Die Resultierende Normale wäre also z.B. Code:
und immer so weiter. Anonsten geht ja die Form vom ersten Predator total verloren. Ganz zu schweigen das man ja nicht mehr weiß welcher Pixel vor und hinter den Objekten liegt... |
Autor: | Shaijan [ Mo Mär 11, 2013 22:28 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
Dann würde sich die 1. Variante anbieten: 1. Standardmäßig alles in ein FBO rendern 2. opaque Geometrie rendern 3. Transparente Geometrie (incl getarntem objekt) von hinten nach vorne rendern 4. Vor dem Rendern des getarnten Objektes (also während 3.) das haupt-FBO in ein 2. blitten, dieses an den Shader binden und die Refraction durchführen Ergebnis: es können beliebig viele getarnte Objekte über einander gezeichnet werden, es können an den Rändern leichte Artefakte entstehen, da eventuell vor dem Objekt liegende Geometrie durch die Refraction mit rein gerendert wird, das ist aber vernachlässigbar bei kleineren offsets und sich bewegenden Objekten. Die 2. Variante preferiere ich dennoch. Eine Refractionmap lässt sich wunderbar in einer R8G8B8 Textur unterbringen, ohne dass störende Artefakte auftreten. Das Blending der Normals kann man ganz gut annähern durch additives blending (wenn ich mich recht erinnere, müsste das nochmal genau nachschaun). Ich verwende das 2. Verfahren für z.T. ziemlich starke Verzerrungen bei denen viele Partikel, die oft übereinander liegen, in die Normalmap gerendert werden und das Ergebnis ist überraschend gut. |
Autor: | Knittel [ Di Mär 12, 2013 09:18 ] |
Betreff des Beitrags: | Re: Destination Pixel abfragen |
Woah! Vielen Dank für die ganzen Antworten. Ich glaube ich schliesse mich am ehsten Shaijan an. Seine 2te Variante scheint mir am sinnvollsten (obwohl wahrscheinlich meistens nur ein getarntes Objekt da ist), aber ich bleible damit vorallem flexibel, falls ich später doch noch was durch den Shader jagen möchte. Nur eine Frage, wenn mein Objekt sagen wir mal halb von einer Wand verdeckt wird, wie krieg ich es da am besten hin, das der nicht sichtbare Bereich nicht auch noch verzerrt wird? Immoment hab ich 2 Ideen, bei denen mir aber die Durchführung schwer fallen würde (1. FBO: Szene, 2. FBO: Normalen-Textur): 1. Die Normale in das 2te FBO nur dann rendern wenn sie den Tiefentest vom ersten besteht. (z.B. durch kopieren des Tiefenbuffers von FBO 1 -> FBO 2) 2. In den Shader den Tiefentest einbauen, dass ich irgendwie den Tiefenbuffer des ersten FBOs binde und die Verschiebung nur dann durchführe wenn Tiefenwert FBO 2 < FBO 1. Könnt ihr mir da nochmal weiterhelfen? ![]() |
Autor: | yunharla [ Di Mär 12, 2013 10:12 ] | ||
Betreff des Beitrags: | Re: Destination Pixel abfragen | ||
Shaijan hat geschrieben: Ich verwende das 2. Verfahren für z.T. ziemlich starke Verzerrungen bei denen viele Partikel, die oft übereinander liegen, in die Normalmap gerendert werden und das Ergebnis ist überraschend gut. das funktioniert auch gut mit wenigen Partikel. (die Partikel selbst sind noch wie im Original + shader) ![]()
|
Seite 1 von 2 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |