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

Aktuelle Zeit: Di Jul 08, 2025 23:40

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



Ein neues Thema erstellen Auf das Thema antworten  [ 33 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 03, 2009 18:59 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Habs ausprobiert, die VBOs sind etwa gleich schnell. Und das Übertragen der Daten geht jedoch um einiges schneller.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 03, 2009 19:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Sieht auf jeden fall hübsch aus. Möchtest du das Bild vielleicht als zusätzliches Sample im Wassertutorial spenden? Dann haben wir eine nicht ganz so abstrakte Szene wie die, die LittleDave damals dazugegeben hat.

@Flash: Ja, das mit dem je-tiefer-desto-dunkler habe ich auch versucht, aber damals konnte man mir bei meinem Problem nicht helfen :-/

Gruß Lord Horazont

_________________
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:
BeitragVerfasst: Sa Jan 03, 2009 20:23 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Zitat:
Möchtest du das Bild vielleicht als zusätzliches Sample im Wassertutorial spenden?

Warum nicht?

Hättest du etwas dagegen, wenn ich dem Tutorial einfach mal einen "Je tiefer desto dunkler"-Abschnitt beifüge? Ich habe aber nicht ausprobiert, ob die Technik mit deinen fünf Renderpässen (ich brauche nur 4?) kompatibel ist.

Ich überlege gerade, ob ich das Projekt irgendwann mal hier vorstellen soll.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 03, 2009 23:53 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
4?
Einmal das Spiegelbild, einmal das was unter Wasser ist, jeweils einmal für beides die Tiefeninformation und einmal richtig auf den Monitor zeichnen.
Sind doch 5 oder? Außer du lässt was weg.

Das mit dem "Je tiefer desto dunkler", sollte denke ich sehr gut zu kombinieren sein, da das glaub ich die gleiche "Tiefe", nämlich den Abstand zur Oberfläche, benutzt. Zumindest hab ich das so gemacht als ich das vor ein paar Tagen implementiert habe. Kann aber sein das man noch bischen die Werte beim "Depthshader" multiplizeren muss, weil das Wasser sonst etwas zu trübe wird.

Und was bei Wasser auch noch ganz gut wäre, ist wenn der Anteil der Reflexion abhängig vom Blickwinkel ist.
Ich versteh zwar nicht viel von Optik aber ich glaube es ist so, dass die Reflexion wenn man senkrecht drauf guckt am geringsten ist und je größer der Winkel zur Normale wird, desto mehr wird reflektiert, bis zur Totalreflektion.

Weiß nicht ob du das schon hast, kann man immer recht schwer erkennen bei blauem Wasser und blauem Himmel^^

Edit:
Und noch was: Ich war zwar seid Ewigkeiten nicht am Meer aber soweit ich mich erinnern kann wird Sand, Erde und sonstiges ja dunkler wenn es nass ist.
Man könnte also den Boden unter Wasser noch abdunkeln. Kann aber auch sein, dass das mist aussieht weil dann der Übergang vom Land zum Wasser zu abrupt ist.


Zuletzt geändert von Schläfer am So Jan 04, 2009 00:03, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 04, 2009 00:02 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Zitat:
jeweils einmal für beides die Tiefeninformation

Ich zeichne nur das, was unter dem Wasserspiegel ist, zwei Mal und komme damit auch gut klar.

Zitat:
aber ich glaube es ist so, dass die Reflexion wenn man senkrecht drauf guckt am geringsten ist und je größer der Winkel zur Normale wird, desto mehr wird reflektiert, bis zur Totalreflektion.

Da glaubst du richtig, aber ich faile momentan noch daran, im Vertexshader einen Vektor für das Auge zu errechnen.

Zitat:
Kann aber sein das man noch bischen die Werte beim "Depthshader" multiplizeren muss, weil das Wasser sonst etwas zu trübe wird.

Übertreiben darf man es damit allerdings auch nicht, weil das Wasser sonst kaum noch Wellen schlägt. Ich hab den Alpha-Wert im Depthshader einfach durch 10 geteilt.


Ach ja, Beleuchtung für das Wasser (bzw. überhaupt Per-Pixel-Beleuchtung für alles ausser dem Terrain) muss ich auch noch implementieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 04, 2009 00:05 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Korrekt wäre es, wenn nicht der Abstand von der Wasseroberfläche, sondern die Länge des Sichtstrahls durch das Wasser für die Eintrübung verwendet wird.

Damit würdest du auch den Effekt erzeugen, dass das Wasser mit zunehmender Entfernung trüber erscheint, da die Sichtstrahlen in größerer Entfernung länger durchs wasser müssen. Durch Wellen veränderte distanzen, kannst du denk ich vernachlässigen.

Ich hab gerade mal im Tafelwerk nachgeschlagen.

Die Formel für die Distanz sollte laut Winkelfunktion sein:

d = h / cos(alpha)

wobei:
h = höhe des Wassers über dem Stück meeresboden
alpha = Winkel zwischen dem Lot der Kamera (bzw. dem UpVector des Stück Meeresbodens) und dem Sichtstrahl zur Kameraposition.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 04, 2009 00:13 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Zitat:
Da glaubst du richtig, aber ich faile momentan noch daran, im Vertexshader einen Vektor für das Auge zu errechnen.


Der Vektor von Auge zum Objekt ist doch einfach die Position des Objektes. Aber nur mit der ModelViewMatrix multiplizieren. Die Normale muss dann natürlich auch richtig gedreht werden.

Code:
  1.  
  2. normal          = gl_NormalMatrix * gl_Normal;
  3. pos               = vec3(gl_ModelViewMatrix * gl_Vertex);
  4.  


Im Fragmentshader die normale normalisieren und über das Skalarprodukt bekommt man dann leicht den Winkel raus, oder vllt reicht auch schon das Skalarprodukt. Wie gesagt hab eigentlich keine Ahnung davon.^^

Edit:
Das von Flash klingt auch einleuchtend. Allerdings wird das Licht was vom Flussboden kommt ja 2 mal abgeschwächt. Einmal auf dem Weg zum Boden und dann zum Auge, wie er schon sagte.
Ich hab aber gehört das es außerhalb von Städten, also in der Natur und so, auch Flüsse geben soll die ziemlich klar sind. xD

Wenn hier weiter alle so aktiv mithelfen wird deine Szene noch fotorealistisch.^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 04, 2009 11:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ja... Und an der Stelle mit der Modelview-Matrix kommt ein böses Problem mit dem von mir im Tutorial vorgeschlagenen System auf. Und zwar sage ich da, dass man seine Kamera in der Projection-Matrix aufsetzen soll... Das dürfte hier zu einem Problem führen. Lösen könnte man das, indem man die Kamera noch als Uniform mat4 zusätzlich übergibt.

Also ich komme auch nur auf 4 Renderpasses. 1x unter Wasser 1x Depth für unterwasser 1x über Wasser 1x die normale Szene
Tiefeninformationen braucht man nicht für über Wasser. Eventuell kann man sogar das Clipping für Depth für Unterwasser weglassen (sorgt für einen Smootheren übergang wenn ich mich recht erinnere)

Das Problem ist jetzt, wie man an die Distanz von Wasseroberfläche und dem Fragment was sich aus der Position des Betrachters gerade hinter der Wasseroberfläche befindet, raus.
Ich hatte hierzu einen Thread aufgemacht... da ist er
Da wollte ich den Schnittpunkt zwischen einem Sichtvektor und einer Ebene (Wasseroberfläche) haben, um den dann vom Vektor zum Fragment abzuziehen, sodass ich nur die Strecke zwischen Wasseroberfläche und Fragment habe. Diese Information wollte ich eigentlich auch in dem Depthshader verwenden, um die Refraktion dann später zu beeinflussen und einen schönen Tiefeneffekt was das Licht betrifft zu erzeugen. Leider sind meine weiteren Fragen dazu unbeantwortet geblieben :-/.

Hierbei kommt mir gerade eine Idee, was das rendern mit dem Depthshader betrifft. Man könnte dafür den Tiefenpuffer einfach bestehen lassen und dann mit einem Tiefentest von glDepthFunc(GL_LEQUAL) oder gar nur GL_EQUAL rendern, sodass man sich alle die anderen Fragmente, die eigentlich sowieso nicht sichtbar sind, einfach sparen kann. Diese Technik hatte TAK mal irgenwann hier aufgezeigt (wenn ich mich recht erinnere). Man rendert erst alles ohne Shader und Texturen (außer dinge mit Alphakanal), lässt den Tiefenpuffer bestehen, rendert nochmal mit oben erwähnter Depthfunc, aber diesmal mit Shader/Texturen. So muss man die aufwendigen Shader nicht für die ganzen unsichtbaren Objekte verwenden.

Schläfer hat geschrieben:
Ich hab aber gehört das es außerhalb von Städten, also in der Natur und so, auch Flüsse geben soll die ziemlich klar sind. xD

Ja, sogar ganze Seen bei denen man ein gutes Stück auf den Grund schauen kann soll es in dieser... moment... ne Natrum... ne Natrium? nein auch nicht Na.. Natur genau, das wars, geben. Ich glaube, das hängt damit zusammen, wieviele Partikel im Wasser schwimmen, die das Licht brechen und es selbigem so erschweren, sein Ziel zu erreichen.

Ich hoffe ich kann helfen ;)

Gruß Lord Horazont

_________________
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:
BeitragVerfasst: So Jan 04, 2009 18:46 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Erstmal vielen Dank für die tolle Unterstützung. Jetzt muss ich mal meinen Senf dazu abgeben :D

Zitat:
Ja... Und an der Stelle mit der Modelview-Matrix kommt ein böses Problem mit dem von mir im Tutorial vorgeschlagenen System auf. Und zwar sage ich da, dass man seine Kamera in der Projection-Matrix aufsetzen soll... Das dürfte hier zu einem Problem führen

Ich habe meine Kamera von Anfang an in der Modelview-Matrix gehabt, somit erledigt sich das schonmal :)

Zitat:
Eventuell kann man sogar das Clipping für Depth für Unterwasser weglassen

Ich habe einfach die Clipping Plane nach oben verschoben. Beim Texturrendering im Übrigen auch, sonst gibts ne Kante.


So, jetzt hab ich zwei Probleme.

@Flash: ich verstehe die Definitionen jetzt nicht so ganz, könntest du das bildlich darstellen?
Und: Ich arbeite gerade an der Beleuchtung und möchte anhand der Bumpmap eine Normale berechnen, habe aber gar keine Ahnung, wie das gehen soll. Weiss da jemand Bescheid?


Zuletzt geändert von Ireyon am So Jan 04, 2009 20:18, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 04, 2009 19:02 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
@Lord Horazont: Der Abstand eines Punktes zu einer Ebene:

<Abstand> = dot(<Normale der Ebene>,<Punkt> - <Punkt auf der Ebene>);

Normale natürlich normalisiert.

@Ireyon

Die Normalmap enthält ja eigentlich schon die Normalen, deshalb heißt sie so.
Allerings benötigt man immer noch eine Tangente damit die Richtung auf bei einer Drehung korekt bleibt.

Die Normale ist bei der Wasseroberfläche denke ich (0,1,0);
Die Tangente ist senkrecht zur Normalen und zeigt in die Richtung in der es auf der Textur nach oben geht.
Dann brauch man noch die Binormale, die ist einfach cross(Tangente,Normale)

Dann muss man nurnoch jeden dieser Vektoren mit einer Farbe der Normalmap multiplizieren:

Neue Normale = Binormale*Bump[0] + Tangent*Bump[1] + Normale*Bump[2];

Oder musste die Tangente nach unten zeigen, kA.
Edit: Ja muss nach unten zeigen, also entweder einfach negieren oder gleich so übergeben.

Ach und zu dem von Flash:

h ist dieser Abstand eines Punktes zur Ebene, s.o.
und alpha ist der winkel der zwischen der Normalen des Wassers und der Position des Punktes (ist ja der Vektor von der Kamera zum Objekt).
Wenn die Normale nach oben zeigt muss man aber einen von beiden Vektoren negieren.

Und da wir sowieso den cosinus benötigen ist die Distanz durchs Wasser einfach:

Distanz = Abstand/dot(-Normale,normalize(pos))

Die Normale negiert, wie ich oben geschreiben habe, sonst kommt ein negativer Wert für die Distanz raus.


Hoffentlich ist das jetzt alles richtig.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 06, 2009 18:49 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Ich hab mal versucht, das Bumpmapping und die Beleuchtung zu implementieren (keine Ahnung, obs so richtig ist, ich hoffe aber, man sieht was): Bild
Jetzt ist nur leider auch die Performance nicht mehr so toll, v.a. deswegen, weil ich per Shader bis zu 6 Texturen auf das Terrain packe (bis zu 3x die Basistexturen (man kann sie ueberblenden) mit entsprechender Detailtextur). Sieht aber imho weitaus besser aus, nur, dass ich daran faile, es zu optimieren (z.b. mit dem sichtbarkeits-tiefentest: da gibts schönste darstellungsfehler)


Zuletzt geändert von Ireyon am Di Jan 06, 2009 19:06, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 06, 2009 19:03 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Sieht auf jeden Fall besser aus als das erste Bild.

Was ich aber nicht verstehe, ist warum du so viele Texturen für das Terrain brauchst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 06, 2009 19:17 
Offline
DGL Member

Registriert: Sa Nov 24, 2007 11:59
Beiträge: 116
Programmiersprache: FreePascal
Weil Terraintexturen überblendet werden können. Kann man zwar auf den Bildern nicht erkennen (was wohl daran liegt, dass ich immer die Abschnitte wähle, wo nur Gras sichtbar ist :D)
So sieht der Shader btw aus:

Code:
  1. // Terraintexturen
  2. uniform sampler2D Texture0;
  3. uniform sampler2D Texture1;
  4. uniform sampler2D Texture2;
  5. // Detailtexturen
  6. uniform sampler2D Texture3;
  7. uniform sampler2D Texture4;
  8. uniform sampler2D Texture5;
  9. uniform int usedetail;
  10.  
  11. varying vec4 FrontColor;
  12.  
  13. const vec4 noTex = vec4(0.0, 0.0, 0.0, 1.0);
  14.  
  15. void main(void) {
  16.   if (usedetail)
  17.       gl_FragColor = vec4(vec3((FrontColor.r == 0.0 ? noTex : FrontColor.r * (texture2D(Texture0, vec2(gl_TexCoord[0])) * texture2D(Texture3, vec2(gl_TexCoord[1])))) +
  18.                                (FrontColor.g == 0.0 ? noTex : FrontColor.g * (texture2D(Texture1, vec2(gl_TexCoord[0])) * texture2D(Texture4, vec2(gl_TexCoord[1])))) +
  19.                                (FrontColor.b == 0.0 ? noTex : FrontColor.b * (texture2D(Texture2, vec2(gl_TexCoord[0])) * texture2D(Texture5, vec2(gl_TexCoord[1]))))),
  20.                                1.0);
  21.   else
  22.       gl_FragColor = vec4(vec3((FrontColor.r == 0.0 ? noTex : FrontColor.r * texture2D(Texture0, vec2(gl_TexCoord[0]))) +
  23.                                (FrontColor.g == 0.0 ? noTex : FrontColor.g * texture2D(Texture1, vec2(gl_TexCoord[0]))) +
  24.                                (FrontColor.b == 0.0 ? noTex : FrontColor.b * texture2D(Texture2, vec2(gl_TexCoord[0])))),
  25.                                1.0);
  26. }


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 06, 2009 19:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm... Man kann eventuell noch einen Renderpass sparen, wobei das "welcher" davon abhängt, ob man sich über oder unter der Wasseroberfläche befindet.
Man kann sich ja, wenn man die Wasseroberfläche rendert, im prinzip den Teil da drunter sparen. Der wird ja durch die Refraktionsmap dargestellt. D.h. da könnte man wieder mit Clipping ansetzen und den unteren teil abschneiden. Und das kennt man ja bereits aus dem Renderpass der Reflektionstextur. Daher könnte man den Kram aus der Reflektionstextur einfach im Framebuffer lassen und dann die Wasseroberfläche zeichnen.

@Schläfer:
Okay, das ist schonmal nen Anfang... Jetzt ist nur das Problem, wie komme ich an den Punkt auf der Ebene? Den kenne ich ja auch nicht (ok, das ist jetzt vermutlich wieder irgendeine einfache Vektoroperation die ich nicht kenne).
Mit den Informationen könnte man dann viel schönere Effekte bezüglich der Wassertiefe machen (Farbänderung, Brechung und alles).

Gruß Lord Horazont

_________________
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:
BeitragVerfasst: Di Jan 06, 2009 20:28 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ok, klar überblenden, da hast du Recht.

@Lord Horazont
Mit "Punkt auf der Ebene" meinte ich irgendeinen Punkt, egal welcher, hauptsache auf der Ebene. Wenn man eine Ebene in der Normalform hat brauch man ja nur die Normale und eben einen Punkt darauf.
Und einen Punkt sollte man schon wissen, weil der angibt wo sich die spiegelnde Fläche befindet. Also wenn ein Quad ein Spiegel werden soll, kann man einfach einen Eckpunkt an den Shader als Uniform übergeben.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.015s | 16 Queries | GZIP : On ]