Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

21

16.01.2013, 14:13

Schrompf: Welche Attenuation? Der konstante, lineare oder quadratische teil? was ist r2?
Und ja, stimmt, durch annäherung durch einen Punkt funktioniert nur diffuse beleuchtung, sorry.
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

22

16.01.2013, 15:13

Das sollte 1/r² heißen, sorry. Und Attenuation ist rein physikalisch nunmal 1/r², alle anderen Faktoren sind nur für die persönliche künstlerische Freiheit gedacht, aber haben physikalisch keinen bzw. kaum einen Sinn. "Kaum" deswegen, weil man über den konstanten Term a0 ja durchaus eine Lichtquelle mit Volumen abbilden kann, auch wenn das Volumen auf eine perfekte Kugel beschränkt ist.

[edit] Bin leider auch an dem Integral gescheitert. Schon das für die diffuse Beleuchtung ist mir zu kompliziert, und Wolfram Alpha krieg ich es nicht beigebracht oder der kann es auch nicht. Der Gedanke dahinter war:

diffus = FARBE * ATT * PHONG
diffuse = F * 1/|r|² * dot( N, r) / |r|

Also Lichtquellenfarbe mal [Attenuation = 1 / quadratischer Abstand] mal [Skalarprodukt zwischen Normale und Vektor_Zum_Licht geteilt durch Länge des Vektor_Zum_Licht]

also
diffuse = F * (1 / |r|²) * (dot( N, r) / |r|)

Und wenn ich jetzt die Lichtstrecke als lineare Strecke parametrisiere, z.B. ganz schlicht "r = lichtmittelposition p + t* irgendne Strecke s" mit t symmetrisch von -0.5 bis 0.5, dann taucht das t als zu integrierende Größe sowohl im Punktprodukt auf als auch in der Betragsrechnung, dort aber hoch drei halbe. Fack. Und da sind wir noch nicht mal beim Specular-Anteil, wo ja noch der Skalarproduktteil ja noch mit irgendnem Faktor potenziert wird. Bäh. Ich bräuchte für sowas mal ne Software, und die Zeit, um mich darin einzuarbeiten. Ich habe ja immerhin ein komplettes Studium geschafft, ohne sowas einmal anzufassen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Schrompf« (16.01.2013, 15:59)


CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

23

16.01.2013, 20:19

Will jemand die Lösung sehen? Mit Mathematica errechnet. Gilt genau dann, wenn t0 richtig gewählt wird.

KLICK
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »CBenni::O« (16.01.2013, 21:42)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

24

16.01.2013, 21:13

Habt ihr schon an folgende Vereinfachung gedacht?
Man nehme an, dass die Linie von (0, 0, 0) bis (0, 0, 1) geht. Den zu beleuchtenden Punkt und den Normalenvektor muss man dann in dieses (verzerrte) Koordinatensystem transformieren und dort die Beleuchtung durchführen.

CBenni::O

1x Contest-Sieger

Beiträge: 1 145

Wohnort: Stuttgart

  • Private Nachricht senden

25

16.01.2013, 22:02

David, das ist natürlich keine schlechte idee ^.^ Allerdins muss man da aufpassen, wenn man einfach skaliert, dann stimmen die entfernungen nacher nicht mehr. Rotation und Translation sind natürlich in ordnung. Ich denke, es funktiniert am besten, wenn man einfach die Linie so transformiert, dass sie von (0,0,0) nach (0,0,v) geht. Dann ist das integral leider immer noch unschön...
§\frac{1}{a_2}\int\limits_{t_0}^1 \frac{-n_1'x_1'-n_2'x_2'+n_3'(tv-x_3')}{(x_1'^2+x_2'^2+(tv-x_3')^2)^{3/2}} dx\qquad (1)§

EDIT: Ich habe das Integral tatsächlich ausrechnen können. Das Ergebnis:
§c=\sqrt{x_1'^2+x_2'^2+(v-x_3')^2}§

§d=\sqrt{x_1'^2+x_2'^2+(x_3'-t_0 v)^2}§

§(1)=\frac{n_3' \left(x_1'^2+x_2'^2\right) \left(c-d\right)+(n_1' x_1' +n_2' x_2') \left(t_0 v c-c x_3'-v d+x_3' d\right)}{a_2 v \left(x_1'^2+x_2'^2\right)cd} §

Dieses Integral ist tatsächlich in einem Shader zu berechnen! Das tolle: die Transformation muss nur einmal berechnet werden. Dann bekommt der Shader die transformationsmatrix, normalenvektor, und position sowie die länge der Leuchtstoffröhre. Dann berechnet man t0, c,d (und warscheinlich noch x1²+x2²) und schon hat man eine Leuchtstoffröhre. Jetzt brauchen wir nur noch jemanden, der es ausprobiert :P

mfg CBenni::O
Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.
42!
Aufräumen kann jeder, nur das Genie überblickt das Chaos!
Metal will never die!
1. Sppro Gamecontest - mein Beitrag

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »CBenni::O« (17.01.2013, 00:54)


Werbeanzeige