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
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:
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:
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)
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
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]
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.
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
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.
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.