DGL
https://delphigl.com/forum/

Wasserbewegung?!
https://delphigl.com/forum/viewtopic.php?f=20&t=4326
Seite 1 von 2

Autor:  Gran [ Mi Jul 06, 2005 20:36 ]
Betreff des Beitrags:  Wasserbewegung?!

Hi,

naja, nach all der langen Zeit hab' ich auch endlich mal den Sprung in die Shaderthematik gewagt, und bis hierhin (1. Tut) bin ich ganz gut klar gekommen. Ich habe jetzt also einen VertexShader und einen FragmentShader geschrieben, welcher einfach nur die gebundene Textur ausgibt. Ich habe jetzt versucht, die Texturkoordinaten nachträglich zu verändern, was auch ganz gut geklappt hat:

Code:
  1.  
  2.  
  3. void main(void)
  4. {
  5.  gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  6.  gl_TexCoord[0]  = gl_MultiTexCoord0;
  7. }
  8.  
  9.  


Code:
  1.  
  2.  
  3. uniform sampler2D texSampler;
  4.  
  5. void main(void)
  6. {
  7.     gl_FragColor = texture2D(texSampler, vec2(gl_TexCoord[0].s, gl_TexCoord[0].t));
  8. }
  9.  
  10.  


Ich kann jetzt zum s und t Wert der Texturkoordinaten beliebige Werte dazuadddieren, die dann auch so ausgegeben werden. Ich würde jetzt gerne eine Wasserbewegung im Shader schreiben (habe schon eine geschrieben, die allerdings von der CPU berechnet wird, ist aber wirklich nur was für High-End Prozessoren). Ich kann aber jedes Fragment immer nur um die gleiche Anzahl Einheiten verschieben, also alles wird nach unten bzw. zur Seite verschoben. Ich brauche also für jedes Fragment einen anderen Wert, den ich zu den Texturkoordinaten addieren muss, da aber der Ablauf für jedes Fragment gleich ist, frage ich mich, wie das gehen soll. Gibt es da 'ne Lösung für? Oder habe ich das Konzept für sowas falsch verstanden?

Autor:  LarsMiddendorf [ Mi Jul 06, 2005 20:41 ]
Betreff des Beitrags: 

Du kannst den Wert ja z.B. vorher aus einer Texture lesen.

Autor:  Gran [ Mi Jul 06, 2005 20:44 ]
Betreff des Beitrags: 

wow, superschnelle Antwort, danke, auf sowas wäre ich garnicht gekommen. Aber welchen Wert der Textur soll ich dann benutzen? Soll ich also den Farbwert einer Textur in Koordinaten "umwandeln"? Außerdem hab' ich keine Ahnung, wie ich das dynamisieren (wenn's das Wort net gibt, egal, ich denke man weiss, was gemeint is' xD) soll.

Autor:  Flash [ Mi Jul 06, 2005 21:11 ]
Betreff des Beitrags: 

Du kannst ja den RGB Wert als XYZ Richtung interpretieren...

Autor:  Grizzly [ Do Jul 07, 2005 14:55 ]
Betreff des Beitrags: 

kannst dann zB eine 3D Textur als lookup benutzen, bei der du die dritte koordinate als Zeitangabe nimmst und somit ein ändernedes bild erhälst (fals du das mit dynamik meintest)

Autor:  Gran [ Do Jul 07, 2005 15:18 ]
Betreff des Beitrags: 

ich meinte mit Dynmik, dass die Kurven, die dann letztendlich ja das Wasser darstellen, nicht immer genau gleich aussehen dürfen, sonst hätte ich ja nur ein Standbild. Ich würde das gerne so machen, dass eine fliesende Wasserbewegung zustande kommt, nicht irgendein zufallsgeneriertes Gewurschtel. Mich würde mal interessieren, wie das in diesem RenderMonkey Shader von SoS funktionierte.

Autor:  Speedmaster [ Do Jul 07, 2005 20:24 ]
Betreff des Beitrags: 

Mir fällt dort Spontan Displacement Mapping ein, bzw eine Bewegung mithilfe der Manipulation von Dreicken(ACHTUNG, teuere Angelegenheit)!

Autor:  La Boda [ Do Jul 07, 2005 20:45 ]
Betreff des Beitrags: 

Ich würde das, wie oben schon erwähnt, mit einer 3D-Textur machen, bzw mit ~30 Texturen, die alle Stadien von Wassserbewegungen beinhalten. Ich habe da selbst erst vor kurzem ne Demo (mit Source) gemacht, die du dir ja mal anschauen könntest: http://laboda.delphigl.com/shader.html (ganz unten)
Die Texturen hab ich mit dem Caustics Generator (http://www.lysator.liu.se/~kand/caustics/) erstellt. Das Tolle an dem Programm ist, dass sowohl die Ränder der Textur so berechnet werden, dass sie, aneinandergereiht zB auf einem Quad zusammenpassen, als auch zeitlich so berechnet werden, dass nach dem letzten Frame wieder fließend in das erste Frame übergegangen wird.

Autor:  Speedmaster [ Do Jul 07, 2005 21:12 ]
Betreff des Beitrags: 

Fehler in Massen:
Zitat:
---------------------------
Opengl15_template
---------------------------
ERROR: 0:10: 'assign' : cannot convert from 'attribute 4-component vector of float' to 'varying 2-component vector of float'
ERROR: 1 compilation errors. No code generated.


---------------------------
OK
---------------------------

---------------------------
Opengl15_template
---------------------------
ERROR: 0:24: 'assign' : l-value required "lightvec" (can't modify a varying)
ERROR: 0:26: 'assign' : l-value required "HalfVector" (can't modify a varying)
ERROR: 0:28: 'assign' : l-value required "normal" (can't modify a varying)
ERROR: 0:30: 'assign' : l-value required "lightvec" (can't modify a varying)
ERROR: 0:31: 'assign' : l-value required "HalfVector" (can't modify a varying)
ERROR: 5 compilation errors. No code generated.


---------------------------
OK
---------------------------



Das der Fehler beim Bumpmappingprog, beim anderen kommen auch Fehler!

Autor:  La Boda [ Fr Jul 08, 2005 12:56 ]
Betreff des Beitrags: 

Ahhh, du hast wahrscheinlich ne ATI-Karte? Da habe ich schon immer Probleme mit ;) Ich werd mal im Laufe des Tages (hoffentlich) fehlerfreie Demos uploaden.

Autor:  Gran [ Fr Jul 08, 2005 14:09 ]
Betreff des Beitrags: 

@La_Boda: Vielen Dank für deine Antwort, hat mir auf Anhieb ohne Probleme geholfen, dass man sowas mit Caustics lösen kann, hätte ich nie im Leben gedacht; dein Sample is' wirklich genial.

Hätte dann noch eine Frage zu diesem Thema: Worauf ich hinaus will, ist ein ultra-realistischer Regen. Jeder Tropfen soll die Umgebung hinter sich aufgrund der Lichtbrechung verzerren (ultra-realistisch eben xD). Kann ich den gleichen "Verzerr-Effekt" irgendwie auf ein geblendetes Quad übertragen? Und dann wäre da natürlich noch die Performance, würde ein High End Rechner sowas schaffen, wenn ich es mit der Anzahl der Tropfen nicht übertreiben würde?

Autor:  La Boda [ Fr Jul 08, 2005 14:22 ]
Betreff des Beitrags: 

Das kommt drauf an, ob man durch die Tropfen durch alles sehen können soll. Zum Beispiel andere Tropfen, die wiederum durchlässig sind. Da schätz ich gibts noch keine Hardware dazu. Aber ich würds auf jedem Fall auch mit nem Quad machen, auf das ich dann eine Bumpmap pappe, die ungefähr die Oberfläche eines Tropfens repräsentiert. Zuerst wird der Hintergrund des Tropfens in ne Textur gerendert. Den Vektor vom Beobachter "brichst" du dann an der Oberfläche des Tropfens. Den "gebrochenen" Vektor verfolgst du dann bis zur vorher erstellten Textur. Soweit die Theorie, hab mir das jedenfalls so überlegt. Kann mir mal jemand sagen, ob ich da irgendwelche Denkfehler drinne hab?

@ultrarealistisch: Es geht durchaus noch realistischer, zum Beispiel, in dem du die Wasseroberfläche nicht mit ner statischen Bumpmap, sondern mit einer dynamischen "beklebst". Habe das selber schon versucht, und nix gescheites zusammengebracht (egtil gar nix :D ), und erlaube mir mal, das als eine der "Königsdisziplinen" der 3D-Programmierung zu deklarieren.

Autor:  Gran [ Fr Jul 08, 2005 14:35 ]
Betreff des Beitrags: 

ja, Tropfen in den Tropfen sichtbar, das fällt keinem auf, wenn der Regen erstmal fällt, die Lichtbrechung denke ich fällt schon auf. Ich brauche das jetzt garnicht so realistisch, dass das Licht mit dem ganzen Vektorzeugs da gebrochen wird, "animierte Brechung" möchte ich aber schon haben. Ich will also mit dem Caustics-Generator 'ne Art Wasserbewegung für nur einen Tropfen generieren, die dann in jedem Tropfen durchgehend abläuft. Jetzt brauche ich als Textur für den Hintergrund eines Tropfens das, was man genau in diesem Moment durch den Tropfen sieht (was genau mein Problem ist: Wie kriege ich den Hintergrund eines Tropfens vom aktuellen Standpunkt?). Dann multipliziere ich den Hintergrund (sobald ich rausfinde oder mir das jemand sagt, wie das geht) mit einer anderen Textur, dass sie etwas aufgehellt wird (damit man den Tropfenumriss erkennen kann) und lege noch die Caustics drüber, fertig. Bleibt halt nur noch das Problem mit dem in Textur rendern, wobei ich natürlich sagen muss, dass mein Regentropfen kein Quad, sondern was komplexeres ist, denn Regentropfen sind ja nicht viereckig ^^. Habe das Renderpass-Tut verstanden und auch nachvollzogen, aber wie ich das mit anderen Formen als Quad anstelle, weiss ich nicht.

Autor:  Lossy eX [ Fr Jul 08, 2005 15:47 ]
Betreff des Beitrags: 

Also Regentropfen mit Shadern zu bepflastern halte ich für überflüssig. Kann das Beurteilen, da es bei mir gerade selbiges tut. Sofern es keine Zentimergroße in zeitlupe fallenden Tropfen sind wird das sowieso niemandem auffallen. Und wenn sie es sind, dann wird es sicherlich nicht mehr realistisch aussehen. Von daher würde ich mich eher auf das drumherum der Tropfen beschränken. Also ein Pfütze in der ein tropfen einschlägt und Microwellen wirft und vielleicht sogar ganz leicht spritzt.

(Hardcore) Eine Glasscheibe auf der die Tropfen landen. Dabei sind sie dann nicht mehr flüchtig und dann kann man erkennen, dass sich der Hintergrund darin bricht. Aber aufgrund der Größe der Tropfen würde dort wahrscheinlich auch eine 8x8 große Textur ausreichen bei der die Unterseite Hell und die Oberseite Dunkel wäre. Also Himmel unten und Boden oben. Wenn man die ein wenig rund aufträgt und danebenher schauen kann sollte das schon einen entsprechenden Realismusseffekt geben. Allerdings Wasser und Glas ist wirklich pervers. Da sich die Tropfen nun zusammenschließen und zu größeren werden können. Also alleine die Physikalischen Berechnungen sind der Hammer und unterliegen der Chaostheorie was die Berechnung nicht leichter macht.

Autor:  Gran [ Fr Jul 08, 2005 16:12 ]
Betreff des Beitrags: 

...genau deswegen frage ich, Zeitlupe wird in meiner geplanten Engine/zu realisierendem Projekt eine große Rolle spielen, deswegen wüsste ich halt gerne wie ich das mit dem RenderToTexture-Zeugs hinkriege.

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/