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

Aktuelle Zeit: Sa Apr 27, 2024 01:39

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



Ein neues Thema erstellen Auf das Thema antworten  [ 37 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
BeitragVerfasst: Do Jan 03, 2008 19:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hi,

ich habe das alte Sonnensystem wegen Schule eine wenig liegen lassen aber gerade wieder geöffnet um es fertig zu bekommen. Es fehlen bei den Gasplaneten die Ringe. Wie könnte man die darstellen ? Die Planeten sind nicht mit Polygonen sondern zur Vereinfachung als Kugeln dargestellt (gluSphere).

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 03, 2008 20:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm... Ich würde mir eine Textur nehmen, die solche Ringe darstellt und das als Ebene entsprechend um den Planeten legen.

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  
BeitragVerfasst: Do Jan 03, 2008 21:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Nils hat geschrieben:
Die Planeten sind nicht mit Polygonen sondern zur Vereinfachung als Kugeln dargestellt (gluSphere).

Das klingt ein bisschen seltsam, da gluSphere ja keine Kugeln, sondern auch nur Dreiecke erzeugt. ;)
Vielleicht interessieren dich, wenn du glu nimmst, die Funktionen gluDisk oder gluCylinder.

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 04, 2008 09:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also für mich klingt das nach dem klassischen Anwendungsfall von 1D Texturen. Das ist nichts anderes als eine 2D Textur allerdings nur mit einer Höhe von 1 was eigentlich dann nichts anderes ist als ein Farbverlauf. Du musst dann "nur" noch diese Textur auf einem Ring anbringst, der um den Planeten liegt. Und zwar so, dass der Verlauf von Innen nach Außen (oder andersrum) dargestellt wird. Das sollte aber mit Sinus und Cosinus ein recht leichtes sein die Punkte zu berechnen, da es ja nur eine Ebene ist.

Der Weg über die 2D Textur und der einfachen Fläche würde auch gehen. Aber da solche Texturen eigentlich nur als Verlauf angeboten werden müsstest du sie mit einem Grafikprogramm selber als Ring darstellen. Je nachdem wie stark man dort hinein zoomen können soll könnte so eine 2D Textur ziemlich groß werden. Oder Kantig beim hineinzoomen. Wohin gegen man bei 1D Textur lediglich die Anzahl der Flächen erhöhen muss um wieder einen ringartigen Ring zu bekommen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jan 04, 2008 10:37 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
WhiteHunter hat geschrieben:
Nils hat geschrieben:
Die Planeten sind nicht mit Polygonen sondern zur Vereinfachung als Kugeln dargestellt (gluSphere).

Das klingt ein bisschen seltsam, da gluSphere ja keine Kugeln, sondern auch nur Dreiecke erzeugt. ;)
Vielleicht interessieren dich, wenn du glu nimmst, die Funktionen gluDisk oder gluCylinder.

MfG

Kann man denn in mit gluCylinder die Planeten mit Exzentrität oder wie das heißt darstellen ? Dann würde mich das nämlich mal interessieren.
Lossy eX hat geschrieben:
Also für mich klingt das nach dem klassischen Anwendungsfall von 1D Texturen. Das ist nichts anderes als eine 2D Textur allerdings nur mit einer Höhe von 1 was eigentlich dann nichts anderes ist als ein Farbverlauf. Du musst dann "nur" noch diese Textur auf einem Ring anbringst, der um den Planeten liegt. Und zwar so, dass der Verlauf von Innen nach Außen (oder andersrum) dargestellt wird. Das sollte aber mit Sinus und Cosinus ein recht leichtes sein die Punkte zu berechnen, da es ja nur eine Ebene ist.

Der Weg über die 2D Textur und der einfachen Fläche würde auch gehen. Aber da solche Texturen eigentlich nur als Verlauf angeboten werden müsstest du sie mit einem Grafikprogramm selber als Ring darstellen. Je nachdem wie stark man dort hinein zoomen können soll könnte so eine 2D Textur ziemlich groß werden. Oder Kantig beim hineinzoomen. Wohin gegen man bei 1D Textur lediglich die Anzahl der Flächen erhöhen muss um wieder einen ringartigen Ring zu bekommen.

Thx, dann schau ich mir das mal an. Kann man auch Transparenz setzen ? Denn Uranus hat nicht so sichtbare Ringe wie Saturn z.B.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 04, 2008 10:48 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Man kann in einer Textur natürlich Alpha-Werte einbauen. Man muss die Textur dann halt als z.B. TGA speichern (also in einem Format welches Transparenz unterstützt.) Alternativ kann man auch erst die Planeten zeichnen und dann die Ringe drüber blenden (siehe Blending)

Wenn Exzentrität bedeudet gestaucht/gestreckt in einer Achse: Ja klar. Einfach vor dem zeichnen der Kugel mit glScale z.B. die Pol-Achse verkleinern. (Und nach dem zeichnen wieder zurücksetzen.)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 04, 2008 11:20 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
gluSphere kann das aber nicht oder ?

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 04, 2008 12:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Na, gluSphere selber nicht, aber du kannst natürlich vor dem Zeichnen wie von Flash erwähnt glScale aufrufen und damit die Polachse verlängern oder stauchen.

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: Fr Jan 04, 2008 15:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Ahja stimmt, danke euch allen, werde mal schauen was sich machen lässt.

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 24, 2009 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hi,

tut mir echt leid dass ich dieses Thema nochmal rauskrame, aber ich habe einfach nochmal eine Frage. Wenn man für den Ring eine gluDisk nimmt und auf diese eine Textur legt, dann sieht das gut aus. Aber leider (gerade beim Saturn sehr schade) reicht nun mein Licht nicht aus, gluDisk ist quasi nicht hoch genug um Licht abzubekommen denke ich. Gerade beim Saturn werfen die Ringe Schatten auf den Saturn, der Saturn Schatten auf die Ringe umgekehrt (andere Planetenseite), wäre wirklich sehr schade. Wie könnte man das am einfachsten lösen ? Könnte ich irgendwie OpenGL mitteilen, dass mir auf die gluDisk das Licht projiziert werden sollen oder gibt es eine ganz andere Lösung ?

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 24, 2009 17:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Schatten gehört zu den komplizierteren Effekten. Da du schon mit dem eigentlich einfachen Glow-Effekt recht große Probleme hattest weiß ich nicht ob Schatten nicht eine Nummer zu groß sind, zumindest wenn das ganze gut aussehen soll. Letztlich musst du das selbst wissen.

Ansätze:
  1. Shadow-Maps
  2. Stencil-Shadows (auch Volumenschatten)
  3. ein Spezial-Shader der nur mit Kugeln als Lichtquelle bzw. Schattenwerfer funktioniert

Variante 1 funktioniert universell mit jeder Szene und wird in den meisten Spielen benutzt. Vom Prinzip wird die Szene aus Sicht der Lichtquelle in einen Tiefenbuffer gerendert. Dadurch kann man dann später beim Rendern feststellen wo Schatten ist und wo nicht. Das funktioniert insbesondere bei Spot-Lights gut, da ein Spotlight so ähnlich wie eine Kamera geformt ist. Bei einem Punktlicht musst du aber mindestens 6 mal eine Shadow-Map generieren. Mit transparenten Objekten wird das noch komplizierter, aber sofern dir ein Alpha-Test (nur ja/nein, kein Alpha-Wert) reicht, funktioniert dies auch mit dem Standard-Ansatz. Zudem gibt es Probleme mit Artefakten, wenn man genau in die Lichtquelle blickt. Möglicherweise könnte man aber jeden Planeten einzeln berechnen, und zwar nur dann wenn es auch wirklich Schatten gibt.

Variante 2 funktioniert nur mit fester Geometrie. Das Volumen des Schattens wird als Geometrie nach gebaut und mit dem Stencilbuffer wird geprüft ob sich der gerade gerenderte Punkt innerhalb oder außerhalb befindet. Für deine Ringe wird das zum Problem...den diese sind keine feste Geometrie. Schatten werden immer harte Schatten sein, also nur Schatten ja/nein.

Variante 3 ist speziell für deine Szene zugeschnitten. Da Kugeln relativ einfache Objekte sind kann man den Schatten auch direkt im Shader berechnen. Den das Schattenvolumen kann man durch Kegelstümpfe beschreiben. Ein Kegelstumpf besteht aus einer Spitze, einer Richtung und einem Radius. Die Spitze ist die Lichtquelle, die Richtung ist Planet-Lichtquelle und der Radius, der Radius des Planeten. Der Shader bekommt eine Liste dieser Kegelstümpfe und testet für jeden Pixel ob er sich in einem der Kegelstümpfe befindet. Deine Ringe können so leider nur Schatten empfangen und nicht werfen, da die Ringe eine viel kompliziertere Struktur haben.
Man kann die Lichtquelle auch als Kugel (nicht nur Punkt) annehmen und weiche Schatten berechnen. Dafür braucht man dann immer jeweils zwei Kegel. Das wäre bei den anderen beidem Methoden extrem aufwendig! Ich werde das wahrscheinlich in UC so implementieren, weiß aber noch nicht wie schnell das sein wird.

Zu 1 und 2 solltest du massig Literatur finden. Ein Einstieg wäre z.B. meine alte Proseminararbeit von 2006.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 25, 2009 09:52 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo Nils,

falls die Beleuchtung deiner gluDisk nicht richtig funktioniert, könnte es daran liegen dass du eine flache Scheibe benutzt, die nur auf einer Seite Normalen besitzt.
Du musst entweder zwei entgegengesetzt ausgerichtete Scheiben nehmen oder du aktivierst zweiseitige Beleuchtung mittels :

Code:
  1. glLightModel(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE)



Viele Grüße
dj3hut1

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 03, 2010 22:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
dj3hut1:
Hm, leider ist die Scheibe immer noch lichtlos. Ich glaube ich hatte den Befehl auch vor einiger Zeit schon mal probiert. Müssen vielleicht noch gewisse Gegenheiten erfüllt sein ?

Coolcat:
Variante 1: Die grundlegende Frage ist erstmal, welche Schatten man benötigt. Ist es ohne weiteres möglich eine Sonnenfinsternis zum Beispiel darzustellen ? Oder würde das nicht sowieso untergehen ? Denn wäre letzteres der Fall, bräuchte man dort keine Schatten zu berechnen. Das gilt natürlich auch für andere Monde von anderen Planeten. Spürbar würde es erst bei größeren Monden wie dem Titan (Saturn) oder eventuell unserem denke ich. Davon hängt jedenfalls ab wo überhaupt Schatten berechnet werden müssen. Aber das wäre eigentlich mehr eine Kleinigkeit, ließe sich denke ich mit geringem Aufwand umbauen.
Variante 2: Könnte man die harten Schatten nicht sogar schon durch den bereits bestehenden Glow-Effekt beheben, wenn man diesen nach der Schattenberechnung erzeugt ? Ist nur eine Idee, keine Ahnung ob das realistisch ist.
Variante 3: Eine wirklich gute Idee, aber ich weiß nicht so recht ob das nicht zu langsam und auch zu schwierig würde. Wäre das Ergebnis denn so viel besser als bei den anderen beiden Möglichkeiten ? Oder besser gefragt: Wären die Schatten der beiden anderen Varianten schlecht oder könnten auch dort sanfte entstehen ?

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 04, 2010 00:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
zu 1: ShadowMaps arbeiten immer auf der kompletten Szene. Entweder werden alle Schatten berechnet oder nicht. Eine Sonnenfinsternis ist neben dem Schatten auf Ringen der einzige Grund überhaupt globale Schatten zu berechnen, oder?
zu 2: Der Glow-Effekt wirkt auf Lichtquellen, nicht auf beleuchtete Objekte. Zu einem gewissen Grad würde es funktionieren, trotzdem wird die Lichtquelle immer nur ein Punkt bleiben und keine Kugel. Bei Variante 1 ist es leichter weiche Schatten zu erzeugen, z.B. mittels Percentage-Closer Filtering (PCF).
zu 3: Schau dir mal die Bilder 11-6 bis 11-9 im PCF-Artikel an, das ist das Maximum was sich bei akzeptabler Performance mit ShadowMaps erreichen lässt. Bei Variante 1 lassen sich schönere Schatten nur durch mehrere kugelförmig nebeneinander liegende Lichtquellen erreichen, was den sowieso schon 6-fachen Aufwand (wegen Punktlichtquelle) noch einmal vervielfacht. Bei Variante 2 wäre der Schatten sehr scharf und hätte keine Pixel-Artefakte wie in 11-6 zu sehen. Von der Implementierung her ist Variante 3 definitiv die einfachste. Wenn vorher (!) für jedes Objekt geprüft wird welche Objekte Schatten wirklichen einen Schatten auf dieses Objekt werfen sollte die Performance auch bei mehreren Lichtquellen (zwei Sonnen oder so) kein Problem sein.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 04, 2010 10:42 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Gut, mittlerweile glaube ich Dir, dass die dritte Variante am einfachsten zu implementieren ist, habe mich nun schon etwas in Variante 1 eingelesen. Mein Hauptproblem ist eben wieder mal die Umsetzung, was Du vor hast mit Deiner eigenen Methode habe ich ja verstanden. Aber die Umsetzung fällt mir wieder nicht gerade leicht. Außerdem: Könnte man das Problem bei der Methode, dass nur Schatten empfangen werden können, nicht umgehen über einen Alphakanalcheck oder so etwas in der Art ? Oder würde das alles schon wieder viel zu langsam machen ?

_________________
Meine Musik: spiker-music.net


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 131 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.040s | 15 Queries | GZIP : On ]