Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jun 17, 2024 16:37

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Destination Pixel abfragen
BeitragVerfasst: So Mär 10, 2013 20:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: So Mär 10, 2013 21:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Mo Mär 11, 2013 00:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
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:
  1. #version 150 compatibility
  2.  
  3. centroid in vec2 meNormal;
  4.  
  5. void main(void)
  6. {
  7.   gl_FragColor = Destination(gl_Position.X + meNormal.X, gl_Position.Y + meNormal.Y);
  8. }


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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Mo Mär 11, 2013 08:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
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.

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Mo Mär 11, 2013 12:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
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:
  1.  
  2. foreach(surface in surfaces)
  3. {
  4.    if(surface is alpha)
  5.       alphaSurfaces.push(surface)
  6.    else
  7.      surface.draw();
  8. }
  9. ...
  10. // schreiben in den Tiefenpuffer ausschalten, Tiefentest muss hingegen erhalten bleiben
  11. // eventuell solltest du noch deine Oberflaechen nach Tiefe ordnen
  12. // wie du dir sicherlich denken kannst ist das ein nen ziehmlich nerviges Problem...
  13. ...
  14. foreach(surface in alphaSurfaces)
  15. {
  16.    if(surface is refraction)
  17.    {
  18.      copyColorbuffer()
  19.      with(shader) {
  20.             bind(copied)
  21.             surface.draw();
  22.      }
  23.    
  24.    }
  25.    else
  26.      surface.draw();
  27. }
  28.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Mo Mär 11, 2013 12:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Mo Mär 11, 2013 13:59 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
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.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Mo Mär 11, 2013 15:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Mo Mär 11, 2013 17:02 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
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?

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Mo Mär 11, 2013 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Mo Mär 11, 2013 18:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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 :)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Mo Mär 11, 2013 19:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
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:
  1.  
  2. normal = normalize((Predator1.normal * 2 -1) + (Predator2.normal * 2 -1)) / 2 + 0.5
  3.  

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...

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Mo Mär 11, 2013 22:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
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.

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Di Mär 12, 2013 09:18 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Nov 30, 2011 21:41
Beiträge: 136
Wohnort: Bad Vilbel
Programmiersprache: Delphi 7
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? :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Destination Pixel abfragen
BeitragVerfasst: Di Mär 12, 2013 10:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
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) :)


Dateianhänge:
q2refrparticles.jpg
q2refrparticles.jpg [ 55.44 KiB | 9359-mal betrachtet ]

_________________
Meine Homepage
Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.063s | 19 Queries | GZIP : On ]