DGL
https://delphigl.com/forum/

Shader für Planeten-Atmosphäre(GLSL/Cg)
https://delphigl.com/forum/viewtopic.php?f=20&t=5679
Seite 1 von 2

Autor:  BloodySmartie [ Mo Jul 10, 2006 23:20 ]
Betreff des Beitrags:  Shader für Planeten-Atmosphäre(GLSL/Cg)

Hallo liebe Community!

Kennt jemand von euch ein Shaderprogramm, dass sich für die Atmosphäre
eines Planeten (vom Weltraum aus gesehen) eignet?

Es wäre wichtig, dass das ganze auch noch auf einer GeForce der 5000er
Serie läuft.

Für jede Hilfe wäre ich sehr dankbar.

Viele Grüße

BloodySmartie

Autor:  Flash [ Di Jul 11, 2006 11:27 ]
Betreff des Beitrags: 

Was stellst du dir denn darunter vor? Nur die (blaue) Hülle, oder auch Wolken?

Autor:  dj3hut1 [ Di Jul 11, 2006 12:06 ]
Betreff des Beitrags: 

Hallo BloodySmartie,

vielleicht als Hilfe : http://www.cescg.org/CESCG-2005/papers/Brno-Josth-Radovan/index.html.

...müsste eigentlich genau das richtige für dich sein :wink:

Viele Grüße
dj3hut1

Autor:  BloodySmartie [ Di Jul 11, 2006 12:16 ]
Betreff des Beitrags: 

Also über Wolken würd ich mich natürlich freuen, aber ne ansprechende
"Hülle" würde mir auf jeden Fall auch genügen. Ich will ja nicht
übermütig werden :wink:


@dj3hut1:

Ah, danke :) Leider war das das einzige Script, das ich selbst finden
konnte. Allerdings hat beim Einbinden etwas nicht geklappt. Es gab
erst ne Exception, weil das Hauptprogramm des FragmentShaders
"FragmentProgram" hieß. Nach dem Umbenennen in "main" startete
das ganze zwar, aber der Effekt war nicht zu sehen. In Abschnitt 4
des PDF ist auch von nem Vertex-Shader die Rede, aber wenn ich
mich nicht irre(bin ja nicht erfahren in diesen Dingen), dann ist
dafür kein Sourcecode angegeben.

Ich arbeite übrigens mit Delphi 7 und der GLScene-Engine, die Cg-Shader
unterstützen sollte.

Autor:  The-Winner [ Di Jul 11, 2006 13:04 ]
Betreff des Beitrags: 

Ich würde Wolken mal Perlin-Nois probieren, jedoch alle Werte die $Grenze unterschreiten auf transparent setzen. Allerdings musst die den Algo so ändern, dass die Wellenlänge in Ost-West-Richtung an den Polen größer werden, um die zunehmende Verzerrung beim mappen der Textur auszugleichen. Wofür du hier einen Shader willst, verstehe ich jedoch nicht.

Autor:  Speedmaster [ Di Jul 11, 2006 19:06 ]
Betreff des Beitrags: 

The-Winner hat geschrieben:
Ich würde Wolken mal Perlin-Nois probieren, jedoch alle Werte die $Grenze unterschreiten auf transparent setzen. Allerdings musst die den Algo so ändern, dass die Wellenlänge in Ost-West-Richtung an den Polen größer werden, um die zunehmende Verzerrung beim mappen der Textur auszugleichen. Wofür du hier einen Shader willst, verstehe ich jedoch nicht.


Ich Persönlich finde diese Art von Wolken Hässlich, guck mal hier nach Schöneren:
http://www.gamedev.net/columns/hardcore/cloudrendering/

Autor:  La Boda [ Di Jul 11, 2006 19:39 ]
Betreff des Beitrags: 

Verschiedene Athmosphärenschichten wären schon was schönes, die dann per Glow vielleicht ein bisschen verwischt werden. Dazu noch permantent verglühende Meteoriten und das Ganze dürfte schon was hermachen :)

Autor:  AL [ Di Jul 11, 2006 22:49 ]
Betreff des Beitrags: 

Also ich hab gerade mal n bisschen mit Punktprodukten rumgespielt und ein eigentlich ganz schönes Shading hinbekommen. Is alles n bisschen zusammengekleistert und auf Vertex-Basis, aber das sollte ohne Probleme durch richtige Shader auf Fragment-Basis umsetzbar sein. Das einzige (Kenne mich mit den neuen Shadersprachen nicht so gut aus) sind die Ifs, da weiß ich nicht genau wie das umsetzbar ist. Zur Not muss eine 1D-Textur verwendet werden, die den Zweck erfüllt.

Code:
  1.  
  2. void drawAthmosphere()
  3. {
  4.     glDisable(GL_DEPTH_TEST);
  5.     glEnable(GL_BLEND);
  6.     glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
  7.     for (int i = 0; i < 40; i++)
  8.     {
  9.         glBegin(GL_TRIANGLE_STRIP);
  10.         for (int j = 0; j < 41; j++)
  11.         {
  12.             float normal[3];
  13.             normal[0] = sin(i/40.0f*6.282f) * sin(j/40.0f*3.141f);   //Die normale des Vertex. (Is ja ne Kugel)
  14.             normal[1] = cos(j/40.0f*3.141f);
  15.             normal[2] = cos(i/40.0f*6.282f) * sin(j/40.0f*3.141f);
  16.             float light = normal[0] * lightvec[0] +      // Normale dot Lichtrichtung (die Richtung zur Sonne)
  17.                          normal[1] * lightvec[1] +
  18.                              normal[2] * lightvec[2];
  19.             light += 0.1;    //die Athmosphäre leuchtet auch noch etwas weiter in den Schatten hinein
  20.             if (light < 0.0f) light = 0.0f; else if (light > 1.0f) light = 1.0f; //auf 0.0 .. 1.0 clampen
  21.            
  22.             float thickness = 1.0f+(normal[0] * viewvec[0] +   //Die Länge des Weges, die das Licht von der Oberfläche
  23.                                     normal[1] * viewvec[1] +   //durch die Athmosphäre zurück legt (angenähert) steuert,
  24.                                             normal[2] * viewvec[2]);   //wie viel blau man sieht. Und je schräger man drauf guckt, desto Dicker ist sie.
  25.             if (thickness < 0.6) thickness = thickness / 0.6; else thickness = (1.0f - thickness) / 0.4; //Mit Ausnahme des Randes, da wird sie wieder dünner.
  26.             float f = thickness * light;   //Beides zusammen multiplizieren
  27.             glColor3f(0.5f * f, 0.7f * f, 1.0f * f);  //Und noch nen schönen Blauton wählen.
  28.             glVertex3f(normal[0] * 1.1,   // 1.0 is der Radius des Planeten und 1.1 der Radius der Athmosphäre
  29.                        normal[1] * 1.1,
  30.                        normal[2] * 1.1);
  31.            
  32.            
  33.             normal[0] = sin((i+1)/40.0f*6.282f) * sin(j/40.0f*3.141f);
  34.             normal[1] = cos(j/40.0f*3.141f);
  35.             normal[2] = cos((i+1)/40.0f*6.282f) * sin(j/40.0f*3.141f);
  36.             light = normal[0] * lightvec[0] +
  37.                   normal[1] * lightvec[1] +
  38.                       normal[2] * lightvec[2];
  39.             light += 0.1;
  40.             if (light < 0.0f) light = 0.0f; else if (light > 1.0f) light = 1.0f;
  41.             thickness = 1.0f+(normal[0] * viewvec[0] +
  42.                              normal[1] * viewvec[1] +
  43.                                      normal[2] * viewvec[2]);
  44.             if (thickness < 0.6) thickness = thickness / 0.6; else thickness = (1.0f - thickness) / 0.4;
  45.             f = thickness * light;
  46.             glColor3f(0.5f * f, 0.7f * f, 1.0f * f);
  47.             glVertex3f(normal[0] * 1.1,
  48.                        normal[1] * 1.1,
  49.                        normal[2] * 1.1);
  50.         }
  51.         glEnd();
  52.        
  53.     }
  54.     glDisable(GL_BLEND);
  55.     glEnable(GL_DEPTH_TEST);
  56. }
  57.  
  58.  


Edit: Ich hab 3 Pics angehangen, damit man sich das etwas vorstellen kann. Nur als Hinweis an die, die wie ich immer unangemeldet lesen...

Dateianhänge:
Screeny3.jpg
Screeny3.jpg [ 13.57 KiB | 8714-mal betrachtet ]
screeny2.jpg
screeny2.jpg [ 11.17 KiB | 8714-mal betrachtet ]
Screeny1.jpg
Screeny1.jpg [ 15.09 KiB | 8714-mal betrachtet ]

Autor:  BloodySmartie [ Mi Jul 12, 2006 14:26 ]
Betreff des Beitrags: 

Vielen Dank für die Anregungen, die bis jetzt schon eingetroffen sind.
Ich werde mal versuchen, heut Abend den Code von Al einzubinden und
poste dann auch mal nen Screenshot, wenns geklappt hat. :D

Autor:  Lossy eX [ Do Jul 13, 2006 16:08 ]
Betreff des Beitrags: 

Hatte in den letzen Tage mal nach einem realistischen Anschauungsobjekt gesucht und siehe da heute hatte ich eines gefunden.

Aus Copyright rechtlichen Bedenken poste ich es nicht direkt sondern sage euch wie ihr es erreichen könnt.
http://www.spiegel.de/wissenschaft/weltraum/0,1518,426601,00.html
Und dann in der Mitte die Fotostrecke auswählen und das dritte Bild meine.

Auf diesem Bild kann man wirklich richtig richtig gut erkennen, dass die Atmosphäre sehr klein ist und sehr schnell sehr durchsichtig wird.

Sonst sehen die Bilder aber auf jeden Fall schon richtig Klasse aus. :-)

Autor:  La Boda [ Do Jul 13, 2006 17:33 ]
Betreff des Beitrags: 

Lossy eX hat geschrieben:
Auf diesem Bild kann man wirklich richtig richtig gut erkennen, dass die Atmosphäre sehr klein ist und sehr schnell sehr durchsichtig wird.


Ich denke, so genau muss man es hier wohl nicht nehmen. Ich weiß ja nicht, für was der Threadersteller die Planeten braucht, aber in so einem Astereoids-Clan könnte die Athmosphäre recht schnell vom Aliasing verschluckt werden, wenn sie zu dünn/klein ist...

Autor:  BloodySmartie [ Fr Jul 14, 2006 13:05 ]
Betreff des Beitrags: 

@Al:

Leider konnte ich Deinen Code nicht in mein Delphi-Projekt portieren.
Ach nach mehrmaliger Prüfung wurde die (Planeten)Kugel nicht
mit einer Atmosphäre versehen. Allerdings haben mir Teile
Deines Codes geholfen, das Problem zu lösen.

@All:

Das Problem habe ich nun dank eurer Hilfe und einiger Quellcodes
und Demos gelöst. Allerdings ganz ohne Shader(was ich sogar ein
wenig schade finde :) ) Ich hänge euch hier mal zwei Screenshots
zum Vergleich an. Sie sind leider etwas dunkel dank JPG-Qualitäts-
verlust.

1. Vorher
Bild

2. Nachher
Bild

Ich finde es nicht nur interessant, sondern auch toll, dass der
Atmosphären-Effekt wesentlich runder erscheinen lässt. Zwar
ist mein Planet da oben nicht unbedingt viereckig, aber da fehlt
nicht mehr viel :) Das Ganze gibt also nen hübschen Anti-Alias
Effekt "gratis"dazu und man kann ein paar Dreiecke am Planeten
einsparen.

Ich werde nachher noch eine Beschreibung meines Projekts ins
Projekte-Forum posten, soweit ich das darf, da werd ich mal nachlesen.
Eine Homepage hab ich nämlich noch nicht, mein Webserver ist
gerade im Aufbau...kann also noch ne Woche dauern.

Autor:  The-Winner [ Fr Jul 14, 2006 13:18 ]
Betreff des Beitrags: 

Bei meinem Projekt habe ich ich auch gerade Monde eingefügt die eine Atmosphere besitzen. Dabei habe ich eine Bumpmap die im Mittelpunkt der Kugel zentriert ist erwendet. Da diese jedoch auf der z-Achse und nicht auf dem Sehstrahl senkrecht steht, gibt es momentan noch kleinere Fehler wenn der Mond nicht in der Bildschirmmitte liegt.
Bild
Kennt jemand eine einfache/effiziente Möglichkeit aus dem Sehstrahl senenkrecht stehende Bumpmaps zu berechnen?
Ansonsten werde ich es mit Hilfe von 2 Kreuzprodukten lösen.

@BloodySmartie wie hast du deine Atmosphere berechnet?

Autor:  Flash [ Fr Jul 14, 2006 13:37 ]
Betreff des Beitrags: 

Versuch bei der Atmosphäre diese etwas stärker "ausfaden" zu lassen. Die hört noch zu abrupt auf. Da sie relativ gleichstark über die gesamte höhe ist, wirkt sie auch noch zu intensiv. Sie leuchtet quasi. Ich denke durch das ausfaden sollte das besser werden.

Autor:  BloodySmartie [ Fr Jul 14, 2006 13:56 ]
Betreff des Beitrags: 

@The-Winner:

Ich sitze leider grad im Labor, daher habe ich den Quellcode nicht
in erreichbarer Nähe, allerdings werd ich ihn hier voraussichtlich
am Wochenende reinstellen.

Die Text e zu Deinem Projekt find ich übrigens interessant :)

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