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

Aktuelle Zeit: Mo Jul 07, 2025 22:50

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Beleuchtung | Neo-Röhren
BeitragVerfasst: Mi Aug 20, 2014 15:28 
Offline
DGL Member

Registriert: Do Apr 22, 2010 17:17
Beiträge: 543
Moinsen,

ich grübele schon seit längerem wie ein Beleuchtungsmodell aussehen müsste um eine Leuchtstofflampe (also 360° um eine Line herum) oder ähnliches zu simulieren. Ich kenne aktuell nur Pointlight & Spotlight. Doch hier müsste es ja eine Art Punkt<>Line distance berechnung sein. Sowas müsste sich denk ich mitn bisschen Mathe lösen lassen. Doch sachen wie korrektes Specular könnte kompliziert werden. Gibt es hier vielleicht schon irgendwelche Ansätze?

Grüße
Thomas

PS. Schatten wollen wir mal erstmal ausser acht lassen :twisted:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Beleuchtung | Neo-Röhren
BeitragVerfasst: Mi Aug 20, 2014 20:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 588
Programmiersprache: C++
Zunächstmal würde ich die Frage stellen, ob sie die Leuchtstoffröhre nicht auch gut genug durch ein Pointlight annähern ließe.

Wenn nicht, hilft dir vielleicht folgende Überlegung für den Specular-Teil deiner Frage weiter.
Du hast gegeben:
- L1, Vektor vom aktuellen Fragment zum ersten Ende der Strecke (=Leuchtstoffröhre)
- L2, Vektor vom Fragment zum anderen Ende
- V, Vektor vom Fragment zur Kamera
- N, Normalvektor der Oberfläche

Nun berechnest du R = reflect(V, N). Hättest du eine Punktlichtquelle an der Position L1, könntest du deinen Specular-Term nun ungefähr so berechnen:
Code:
  1. specular = pow(dot(R, normalize(L1)), shininess);

Da du aber eine Strecke hast, bestimmst du erst den Punkt auf der Strecke, der den hellsten Specular-Wert verursachen würde. Das ist genau der Punkt, der eine minimale Distanz zur Geraden g mit folgender Geradengleichung hat:
Code:
  1. g: x = vec3(0.0) + s*R    // s: skalar
Wie man den Abstand kürzesten Abstand zwischen zwei (windschiefen) Geraden oder einer Gerade und einem Punkt bestimmt, ist dir wahrscheinlich bekannt. Ansonsten: Einfach mal eine Suchmaschine anwerfen, da findet man jede Menge Infos zu.
Wenn du den Punkt auf der Strecke gefunden hast, kannst du einfach so tun, als hättest du an dieser Stelle ein Point Light, das sollte gut genug aussehen. Falls nicht, kannst du ja noch die Specularwerte von L1 und L2 berücksichtigen und das lineare Integral über die Strecke hinzuaddieren.

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Beleuchtung | Neo-Röhren
BeitragVerfasst: Mi Aug 20, 2014 21:21 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Bei OpenGL <2 (also vor Shader) konnte man einem Material die eigenschaft "Leuchtend" geben, d.h. bei der Lichtberechnung entstand auf dem Material wenig bis kein Schatten. Dadurch erhielt man den Effekt einer Leuchtenden Oberfläche. Siehe http://wiki.delphigl.com/index.php/glMaterial#Beschreibung

(PS: Die Historie des Artikels sagt mir, dass ich heute genau 10Jahre und 1Tag (!) nach meinem initialen Upload einen CopyPasteFehler behoben habe. ;) )

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Beleuchtung | Neo-Röhren
BeitragVerfasst: Mi Aug 20, 2014 22:30 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ich glaube in der Praxis wird es am guten Schatten und so weiter scheitern.
Mathematisch kann ich selbst mit meinen aktuellen Kenntnisstand nur dazu sagen, dass man wohl integrieren muss.

Ein paar interessante Versuche das analytisch zu lösen dazu: (Diffuse)
[url]http://www.spieleprogrammierer.de/15-2d-und-3d-grafik/19536-leuchtstoffröhre-simulieren[/url]

EDIT: Warum geht der Link hier nicht?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Beleuchtung | Neo-Röhren
BeitragVerfasst: Do Aug 21, 2014 09:06 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich würde das wohl mit 4 Area Lights lösen, wenn ich es generisch hallten sollte.
https://www.youtube.com/watch?v=sF4mkZKonUQ

http://threejs.org/examples/webgldeferred_arealights.html
http://www.gamedev.net/topic/552315-glsl-area-light-implementation/

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Beleuchtung | Neo-Röhren
BeitragVerfasst: Do Aug 21, 2014 12:19 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Also ich weiß nicht wie viel Unterschied es tatsächlich macht, zu beachten ist allerdings das der Code im letzten Link nicht korrekt ist und in bestimmten Szenarien vermutlich deutlich abweichen wird. Er beachtet nämlich einfach nur den nächsten Punkt in der Lichtquelle zum Objekt. Tatsächlich wird aber nicht nur Licht vom nächsten Punkt aus geworfen sondern auch von allen anderen und das mit einem möglicherweise deutlich anderen Einfallswinkel. Ich schätze das zum einen die Lichtform und zum anderen besonders Objekte nahe des Lichtes nicht ganz realistisch dargestellt würden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Beleuchtung | Neo-Röhren
BeitragVerfasst: Do Aug 21, 2014 15:07 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Physikalisch korrekte Lösungen kenne ich keine, die in Echtzeit über OpenGL oder D3D läuft.
Das waren bisher alles abstraktionen, prebaked oder cuda basierte Techniken.
Um mehr als ein Punkt vom Flächenlicht in die berechnung einfliessen zu lassen, müsste man das gleiche Fragment x mal durchlaufen lassen.
Dies ist so immens teuer und es wirkt sowieso komisch, weil ja auch der Schatten entsprechend geworfen werden muss und selbst abstrahierte Umbra Shadows sind wahnsinnig teuer.
Enlighten realisiert aktuell ihre Flächenlichter über ein zusätzlichen Cuda pass, der den Schatten berechnet aber die Objekte selber ignorieren den Fall, das es mehrere Punkte im Licht gibt.

Ein kleiner Hack speziell für eine Röhre wäre die Model Matrix zu verwenden(das mesh sollte 1,1,1 ausmaß haben), um raus zu bekommen, welche position, ausrichtung und länge das Licht hat.
Man könnte nun beide Endpunkte in die rechnung einfließen lassen oder auch Punkte dazwischen aber jeder Punkt wird halt wesentlich teurer.
Allerdings ist auch sowas nur ne abtraktion und bei Schatten versagt es wieder klagend.

Um das Reflektionsproblem, der Flächenlichter, zu lösen benutzen Unreal Engine 4, Killzone und co ein Hi-Z Screen-Space Cone-Traced Reflection aus GPU Pro 5.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Beleuchtung | Neo-Röhren
BeitragVerfasst: Do Aug 21, 2014 16:24 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Wenn ich dem verlinkten Forum das richtig entnehmen konnte ist es möglich zumindest das Diffuse in akzeptablen Rechenaufwand analytisch exakt zu bestimmen. Specular wird schwieriger, ich könnte mir aber vorstellen das es auch möglich ist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Beleuchtung | Neo-Röhren
BeitragVerfasst: Sa Aug 23, 2014 18:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Es gibt ne ganze Ecke an Verfahren die das Ganze physikalisch korrekt umsetzen. Am leichtesten ist wohl so etwas wie Lumigraph.

Mit einen R-Baum ist sowas sehr einfach da du sofort weißt welches LOD, Textur-Größe usw.. Der Rest ist einfach nur Quader mit einander verrechnen.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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