Photonmapping - Wie kann man gleichmäßig helle Wände erzeugen?



  • Hallo liebe Freunde der Grafikprogrammierung^^

    Ich schreibe gerade am Photonmapping, um eine globale Beleuchtung zu erhalten.

    Mein Ziel: Diesen Raum hier nachzubauen:

    http://de.wikipedia.org/wiki/Radiosity_(Computergrafik)#mediaviewer/Datei:Radiosity_-_RRV,_step_79.png

    So siehts bei mir momentan aus:

    http://image-upload.de/image/i2VldZ/fb0b408da5.jpg

    Das ist die Photonmap dazu:

    http://image-upload.de/image/lfX4ep/0d2915c707.jpg

    Wenn man sich das Bild bei Wikipedia ansieht, dann fällt auf, dass die Deckenleuchte lediglich oben an der Decke ein hellen Farbfleck macht. Die Wände sind ansonsten alle schön gleichmäßig von der Farbe her. Der Stuhl wirft kein Schatten aber ok^^ Ich will mal nicht so streng sein.

    Beim Photonmapping hat man ja das Problem, dass Objekte, die nah an der Lichtquelle sind, mehr Photonen erhalten, als welche, die weiter weg sind. Die Abnahme der Photonendichte kann man sich als ein Luftballon, auf dem Punkte sind, vorstellen, der aufgeblasen wird. Die Punkte driften dann immer mehr auseinander. D.h., die Strahlungsdichte (Photonen pro Fläche) wird kleiner.

    Das Problem, was ich nun damit habe ist, dass dadurch die Wände, die nah an der Lampe sind, so hell sind, dass dort komplett weiße Bereiche sind. Andere Bereiche sind wieder zu dunkel. Ich will, dass die Wände, so wie beim Wikipediabild schön gleichmäßig hell aussehen.

    Ich habe mir als Trick dazu überlegt, dass ich in die Richtung, wo Objekte nah an der Lampe sind, weniger Photonen hinsende, und da, wo Objekte weiter weg sind, sende ich mehr hin. Deswegen seht ihr rechts bei meinen Bild den hellen Fleck.

    Wenn ich diesen Trick nicht anwende, d.h., in alle Richtungen sende ich mit gleicher Wahrscheinlichkeit, dann erhalte ich dieses Bild:

    http://image-upload.de/image/vfMiTY/fe7c2e095c.jpg

    Hier seht ihr nun das ganze Außmaß^^ Ich bin mit diesen Hellen Lichtpunkten nicht zufrieden. Habt ihr eine Idee, was ich falsch mache?

    Ich sende halt für jede Lichtquelle in ein SpotCuttoff-Bereich in zufällige Richtungen.

    Beim Photonen-Einsammeln schau ich dann einfach in ein Suchradius, welche Photonen da sind, und gebe die Summe der Photonenfarben geteilt durch Flächeninhalt des Suchkreises zurück.

    Das ist hier nochmal zum Verständnis.

    Vektor photonFarbe = new Vektor(0, 0, 0);
    
                List<Photon> Photonen = GetPhotonenFromKugelbereich(position, PhotonenSuchRadius, schnittPunkteigenschaften, schnittPunktNormale);
                float radius = PhotonenSuchRadius;
    
                if (Photonen.Count == 0) return new Vektor(0, 0, 0);
                float alpha = 0.918f, beta = 1.953f;
                foreach (Photon P in Photonen)
                {
                    float brdfFaktor = GetStreulichtstärke(reflektierterPrimärstrahlRichtung, P.Einschlagwinkel, GetStreuwinkelFürReflektionsfaktor(schnittPunkteigenschaften.ReflektiertesLichtFaktor), 0.2f);
                    if (P.Farbe.x < 0) brdfFaktor = 1; //Bei Schatten ist die Blickrichtungs des Betrachters egal
    
                    float abstand= (P.Position - position).Betrag();
                    abstand = abstand * abstand;
                    float gausFaktor = alpha * (1-((1-(float)Math.Exp(-beta * abstand / (2 * radius * radius)))/(1-(float)Math.Exp(-beta))));
    
                    photonFarbe += P.Farbe *brdfFaktor * gausFaktor;
                }
    
                return photonFarbe / (radius * radius);
    

    Habt ihr eine Idee, wie ich mit Photonmapping das Wikipediabild hinbekomme? Was mach ich noch falsch?



  • habe selber noch nix mit dieser Art der Beleuchtung gemacht.
    Was ich ausprobieren würde wäre eine einfache Nachbearbeitung.
    Also erst als float oder half_float rendern und dann mit einem einfachen shader die lineare Lichtkurve auf etwas exponentielles ändern.



  • Ich finde die Idee von dir recht interessant.

    Ich render das Bild bereits in ein Array, wo jedes Pixel 3 float-Werte speichert.

    Von daher konnte ich deine Idee schnell testen.

    So sieht das Bild aus, wenn ich für jeden Farbwert die 5-Fache Wurzel ziehe. Dann noch durch 2.

    var source = bildPuffer[x * bildPuffer.Length / returnWidth][y * bildPuffer[0].Length / returnHeight];
                        Vektor dest = new Vektor(0, 0, 0);
                        dest.x = (float)Math.Pow(source.x, 1.0f / 5.0f) / 2;
                        dest.y = (float)Math.Pow(source.y, 1.0f / 5.0f) / 2;
                        dest.z = (float)Math.Pow(source.z, 1.0f / 5.0f) / 2;
    

    So siehts dann aus:
    http://image-upload.de/image/Bz0Pis/fed5219fd5.jpg

    Wie du siehst, scheint das Bild auszubleichen. Die Wände sehen nun schön gleichmäßig aus, nur die Möbel verlieren leider ihre Farbe. Hab ich deine Idee so richtig umgesetzt? Hast du oder andere noch weitere Ideen, um das Ausbleichen der Möbel/ Das verschwinden des Tisch- und Stuhlschattens, zu verhindern?





  • Danke Volkard, das ist ein sehr guter Tipp. Bei HDR-Bildern hat man ja die gleichen Probleme wie ich es jetzt habe. Ich werde mir das durcharbeiten.


  • Mod

    das schaut an sich komisch aus. rechts hat die wand einen weissen fleck, links hinterm bild am regal ist ebenfalls ein heller fleck obwohl das vom regal+bild verdeckt sein muesste. der stuhl hat schwarze lehnen und einen weissen sitz. unterm tisch ist es fast schwarz...

    vielleicht nochmal genau die grundlagen zu photonmapping durchlesen, du scheinst etwas fundamental falsch zu machen und das resultat zu tweaken kann eine zeitlang das liefern was du erwartest, aber eine andere scene kann wieder ganz andere probleme hervorheben... lieber einmal und richtig 😉



  • Das mit den weißen Fleck an der Wand hab ich schon erklärt. Das liegt daran, dass ich bei den 1. Bild die Lichtquellen so gemacht habe, dass sie in Richtungen, wo Objekte weit weg sind, mehr Hinstrahlen(Unrealistische Lichtquelle)

    Bei mein zweiten Bild ist der weiße Fleck rechts dann nicht mehr.

    Das der Stuhl so dunkel ist, liegt vielleicht da dran, weil er so dünn ist, und Lichstrahlen erst 2-3 mal gebrochen werden müssen, bevor sie bei der Stuhlrücklehne ankommen. Da kommt dann nicht mehr so viel an.

    Beim weißen Fleck links wiederum könnte es sein, dass der Photonensuchradius beim Einsammeln zu groß ist.

    Ok...

    Jetzt mal zum Verständnis beim Photonenaussenden. Ich machs momentan so, dass ich ein Photon in zufällige Richtung von der Lichtquelle lossende. Wenn es auf ein Objekt trifft, wird es mit 10%iger Wahrscheinlichkeit reflektiert (mit 90% in Photonmap gespeichert).

    Beim relektieren streue ich den Reflektions-Richtungsvektor noch etwas. Bei Spiegeln 0 Grad, bei Diffusen Oberflächen 180 Grad.

    Beim Speichern tue ich noch ein Abstandsfaktor multiplizieren. Um so weiter das Photon unterwegs war, um so dunkler wird es.

    Wo ich mir noch unsicher bin, was vielleicht auch mal eine Frage wäre: Soll ich beim reflektieren auch noch Lichtenergie verlieren? Wenn ein Photon vom perfekten Reflektionsvektor, wie es ein Spiegel hat, aufgrund der Streuung abweicht? Momentan mach ich das nicht.

    Das Photon wird so lange rekursiv verfolgt, bis es auf ein Objekt trifft, wo der Zufall sagt, dass es nun gespeichert werden soll, oder garnicht (Es trifft kein Objekt innerhalb von 10 Rekursionsschritten)

    Mach ich das so erstmal richtig?

    Zweite offene Frage: Wie viel Prozent des Einfallenden Lichtes tut ein Holztisch oder eine Betonwand reflektieren, wie viel absorbieren?

    Ich selbst hab 10 bis 50 Prozent probiert.



  • XMAMan schrieb:

    Beim Speichern tue ich noch ein Abstandsfaktor multiplizieren. Um so weiter das Photon unterwegs war, um so dunkler wird es.

    Licht wird nicht müde, sagt Lesch.



  • Gut, dann multipliziere ich kein Abstandsfaktor rein^^



  • Ok, glaube nun langsam zu Wissen warum das alles bei mir so Mist aussieht. Mein Final Gathering ist zu simpel.

    Für jeden Primärstrahl schaue ich einfach nur, welche Photonen liegen dort in der Nähe. Ich denke nun aber, dass man hier ein Backwardraytracing machen muss, um das ganze ordentlich zu machen.

    Ich schau mir das ganze nochmal an und melde mich dann, wenn ich das umgesetzt habe^^



  • Ist mal ein aktueller Zwischenstand:

    http://image-upload.de/image/e2lr3A/d71a4c75a0.jpg

    Was hab ich in der Zwischenzeit getan?

    Ich habe mir die Rendergleichung nochmal ganz genau angesehen. Ich habe sie auch zur Berechnung der Lichtenergie von 3 Flächen benutzt, um auf diese Weise sie zu verstehen. Dabei ist mir eine wichtige Sache aufgefallen, die ein im Internet über Photonmapping nicht gesagt wird:

    Photonen haben eine Lebensdauer.

    Das heißt nun nicht, dass man sie nach paar Zeitschritten aus der Photonmap löschen muss, aber man muss beim Erstellen der Photonmap so vorgehen, dass die Rekurionstiefe für jedes Photon variert. Außerdem MUSS man den Wänden auch die Möglichkeit zur Photonabosorbation geben. Sonst wird immer mehr Lichtenergie in den Raum geschossen und der wird ins unermessliche heller.

    Was fehlt noch?

    Bei dünnen Objekten (Stuhlbein, Tischlampe) ist die Verteilung der Photonen kein Kreis oder Kugel sondern ein dünner Weg. Wenn ich nun dort aber beim Photoneinsammeln durch die Fläche des Suchkreies dividiere, dann wird das ganze zu dunkel. Das gleiche Problem dürfte auch an der Tischkante auftreten.

    Ich werde mir dazu noch paar Gedanken machen, wie ich das löse.

    Außerdem möchte ich den Raum jetzt anschließend noch mit Radiosity beleuchten. Ich denke mal, dass ich dabei noch mehr über die Rendergleichung lernen werde. Dieses Wissen wird mir auch beim Photonmapping helfen.

    PS: Ich kenne 4 Wege die Rendergleichung zu lösen: Rekursiv, Radiosity, Photonmapping in Radiosity-Manie und Photonmapping. Ich werde an kleinen Beispielen alle 4 Verfahren noch näher untersuchen.

    Habt ihr ansonsten noch Dinge, die euch an den Bild schlecht vorkommen?

    Mir fällt zumindest das Problem mit den dunklen Stellen an dünnen Objekten auf. Außerdem hat der Stuhl und der Tisch zu wenig Schatten. Ich habe diesmal mit diffusen Wänden gearbeitet. Die Rekursionstiefe liegt jetzt bei 20.

    Das die linke Lampe durch das Regal durchscheint hab ich auch noch. Ich kann das Problem dadurch eindämmen, indem ich den Photonensuchradius kleiner mache. Aber das führt wieder zu ungleichmäßig aussehenderen Wänden. Ich muss also ähnlich wie beim Stuhlbein-Problem auch hier eine Lösung finden, wie ich mit dünnen Gegenständen verfahre, die eigentlich ein Schatten werfen müssten.

    Was Fehler seht ihr noch?



  • Kannst du denn das Rauschen noch wegkriegen? Nimmt das ab mit höherer Photonzahl?
    Sieht furchtbar aus.



  • Um so höher ich den Photonsuchradius mache, um so weniger wird das rauschen. Allerdings leuchtet dann die linke Lampe stärker durch das Regal durch.

    Die Photonenanzahl hat keinen Einfluß darauf. Mehr Photonen bedeutet ein kleineren Suchradius, aber gleichzeitig ein höheres Rauschen.

    Ich selbst muss noch ein Weg überlegen, wie ich einerseits mit dünnen Objekten umgehe, und anderseits ein großen Suchradius verwenden kann.

    Ich habs auch schon mit ein dynmisch anpassparen Suchradius versucht, der nur so groß ist, das z.B. immer nur nach 50 Photonen gesucht wird. Das führt aber dazu, dass die Wände noch ungleichmäßiger aussehen.


  • Mod

    XMAMan schrieb:

    Um so höher ich den Photonsuchradius mache, um so weniger wird das rauschen. Allerdings leuchtet dann die linke Lampe stärker durch das Regal durch.

    Die Photonenanzahl hat keinen Einfluß darauf. Mehr Photonen bedeutet ein kleineren Suchradius, aber gleichzeitig ein höheres Rauschen.

    wenn das passiert, dann weisst du dass etwas falsch ist. die lichtmenge ist ja immer gleich, jedes photon ist lightmenge/photonenzahl stark, entsprechend ist die menge der photonen egal fuer die lichtstaerke, lediglich das rauschen wird kleiner.

    Ich selbst muss noch ein Weg überlegen, wie ich einerseits mit dünnen Objekten umgehe, und anderseits ein großen Suchradius verwenden kann.

    deine scene sollte ein gleichmaessiges graues diffuses material haben und mit so hoher qualitaet gerendert werden wie deine tech es erlaubt, dann sollte das bild ohne irgendwelches tweaken deinerseits correct aussehen. wenn dem so ist, weisst du dass du es richtig implementiert hast, andererseits brauchst nicht tweaken und 'ideen' ausprobieren, denn dann ist erstmal grundsaetzlich was falsch.



  • rapso schrieb:

    andererseits brauchst nicht tweaken und 'ideen' ausprobieren, denn dann ist erstmal grundsaetzlich was falsch.

    So ist das! 👍

    Die ganzen Tweaks müssen später, wenn der dicke Fehler gefunden wurde, wieder alle weggemacht werden. Und den dicken Fehler findet man irgendwann vor lauter Tweaks nicht mehr.



  • An welcher Stelle Tweake ich?

    Hier mal ein Vergleichsbild zwischen verschiedenen Photonenzahlen und Mindestanzahl der Photnen für die Abschätzung für ein Pixel:

    http://image-upload.de/image/VHKgbo/0c6d35f8ed.jpg

    Beim Aussehnden multipliziere ich bei jeder Reflektion den Diffusfaktor (Einschalgwinkel * Flächennormale) mit der aktuellen Photonenfarbe. Sonst mache ich nichst.

    Nachdem alle Ausgesendet wurden, wichte teile ich alle Photenfarben durch die Anzahl der ausgesendeten Photonen.

    Beim Einsammeln nehme ich bei ein Pixel z.B. die 600 nächstne Phonten und bilde einfach nur die Summe. Diese Summe teile ich durch den FLächeninhalt des Suchkreises.

    Wo also ist hier ein Tweak?


  • Mod

    XMAMan schrieb:

    An welcher Stelle Tweake ich?

    z.B.

    Dabei ist mir eine wichtige Sache aufgefallen, die ein im Internet über Photonmapping nicht gesagt wird:...

    es gibt im internet etwas was dazu nicht gesagt wird? du klingst als ob du nur zusammenfassungen gelesen haettest statt paper die das bis ins detail erklaeren.

    tweak:

    Photonen haben eine Lebensdauer.

    nein, haben sie nicht, nur eine von der reflektierenden flaeche gegebene wahrscheinlichkeit absorbiert zu werden. steht in den papern.

    Das heißt nun nicht, dass man sie nach paar Zeitschritten aus der Photonmap löschen muss, aber man muss beim Erstellen der Photonmap so vorgehen, dass die Rekurionstiefe für jedes Photon variert.

    das passiert automatisch durch:

    Außerdem MUSS man den Wänden auch die Möglichkeit zur Photonabosorbation geben.

    steht ja auch in jedem paper.

    Sonst wird immer mehr Lichtenergie in den Raum geschossen und der wird ins unermessliche heller.

    wie soll das gehen, jedes photon hat dieselbe energiemenge, du verschickst N photonen, lichtmenge ist N*photonstaerke. egal wie oft reflektiert wird.

    Bei dünnen Objekten (Stuhlbein, Tischlampe) ist die Verteilung der Photonen kein Kreis oder Kugel sondern ein dünner Weg.

    die in den papern verwendeten techniken funktionieren nicht? das problem schien mir schon lange geloest zu sein.

    das meinte ich mit 'tweaks'.

    http://image-upload.de/image/VHKgbo/0c6d35f8ed.jpg

    wie waere es, wenn du dir mal ein referenz rendering generierst? es schaut ziemlich inkorrekt aus, wenn auch smooth auf den letzten bildern. du koenntest in blender oder pov ray deine scene mit photonmapping rendern und dann wuerdest du besser sehen was zu erwarten ist.
    bei dir sieht man kaum schatten, es gibt helle spots z.b. auf tueren, stuhl, tisch, boden. es gibt parallel zu den kanten dunkle streifen auf den waenden. das licht schimmert ueberall durch (z.b. am regal).

    Beim Aussehnden multipliziere ich bei jeder Reflektion den Diffusfaktor (Einschalgwinkel * Flächennormale) mit der aktuellen Photonenfarbe. Sonst mache ich nichst.

    den "diffusfaktor" der getroffenen flaeche? des photons? und was machst du mit dem diffusfaktor?
    wenn du nichts anders machst (wie du sagst), klingt das falsch.

    Nachdem alle Ausgesendet wurden, wichte teile ich alle Photenfarben durch die Anzahl der ausgesendeten Photonen.

    kannst du ja schon beim aussenden machen, die photonenzahl ist ja bekannt.

    Beim Einsammeln nehme ich bei ein Pixel z.B. die 600 nächstne Phonten und bilde einfach nur die Summe. Diese Summe teile ich durch den FLächeninhalt des Suchkreises.

    was ist wenn im suchkreis mehr oder weniger als 600 photonen sind? z.b. fast unbeleuchteter teil im schrank oder direkt an der decke decke wo im selben radius vom suchkreis fat jedes photon mal trifft.



  • Im Internet habe ich zum Thema: Dünne Objekte, lediglich den Tipp gesehen, dass man mit ein kleinen Suchradius beginnt und dann schrittweise die Kugel immer weiter vergrößert, bis man genug Photonen für die Abschätzung hat.

    Ich hab das bis jetzt noch nicht so hinbekommen. Es könnte daran liegen, dass ich zwar Schrittweise den Suchradius immer weiter erhöhe, aber ich brech dann nicht rechtzeitig ab, wenn es trotz Radiusvergrößerung keine weiteren Photonen mehr gibt.

    Die Idee mit den Referenzrendering in Blender oder Pov Ray halte ich für sehr gut. Ich mach das echt mal. So finde ich hoffentlich mein Fehler schneller. Schön wärs ja auch, wenn man eine bissel Quellcode oder eine Formel von den beiden hätte, so dass ich schauen könnte, was ich anders mache.

    Wenn ein Photon eine Fläche trifft, berechne ich folgendes:

    var schnittpunkt = rayOktree.GetSchnittpunktStrahlOktree(lichtstrahl, ersterAufruf ? false : true);
                Schnittpunkt S = (Schnittpunkt)schnittpunkt;
                if (S != null)
                {
    Vektor einschlagwinkel = -lichtstrahl.richtung;
    float diffuseFaktor = Math.Max(0, (S.InterpolierterSchnittpunkt().normale * einschlagwinkel));
    
    Vektor color = S.NoLightColor();
    
                    //Filter die Farbe
                    aktuellePhotonfarbe.x = Math.Min(color.x, aktuellePhotonfarbe.x);
                    aktuellePhotonfarbe.y = Math.Min(color.y, aktuellePhotonfarbe.y);
                    aktuellePhotonfarbe.z = Math.Min(color.z, aktuellePhotonfarbe.z);
    
    aktuellePhotonfarbe *= diffuseFaktor ;
    
    ...Photon speichern oder reflektieren und weiter verfolgen...
    

    Ich mach das mit den Diffusfaktor so, weil ich in der Rendergleichung ja auch den Term N * w' drin habe. Da erschien mir das logisch^^

    Wenn mehr als 600 Photonen im Suchkreis sind, dann wird diese Stelle heller, da ja die Summe aller Photonenenergie geteilt durch Flächeninhalt des Kreises dann eine größer Zahl ergibt. Weniger als 600 Photonen können es nicht werden, da ich den Radius des Suchkreises so einstelle, dass er an jeder Stelle des Bildes mindestens 600 findet.


  • Mod

    XMAMan schrieb:

    Im Internet habe ich zum Thema: Dünne Objekte, lediglich den Tipp gesehen, dass man mit ein kleinen Suchradius beginnt und dann schrittweise die Kugel immer weiter vergrößert, bis man genug Photonen für die Abschätzung hat.

    kann es sein dass du auf deutsch suchst? so wird das nichts 😉

    Ich hab das bis jetzt noch nicht so hinbekommen. Es könnte daran liegen, dass ich zwar Schrittweise den Suchradius immer weiter erhöhe, aber ich brech dann nicht rechtzeitig ab, wenn es trotz Radiusvergrößerung keine weiteren Photonen mehr gibt.

    lese dir den ersten externen artikel durch der verlinkt wird: http://en.wikipedia.org/wiki/Photon_mapping
    in dem paper steht wie das mit dem photonen-rad ist und du musst es nicht selbst neu erfinden.

    Die Idee mit den Referenzrendering in Blender oder Pov Ray halte ich für sehr gut. Ich mach das echt mal. So finde ich hoffentlich mein Fehler schneller. Schön wärs ja auch, wenn man eine bissel Quellcode oder eine Formel von den beiden hätte, so dass ich schauen könnte, was ich anders mache.

    beide hab ich erwaehnt, weil es die open source gibt. aber es koennte etwas aufwendiger sein durch code durchzusteigen wenn du die theorie nicht kennst, entsprechend... lies das paper!

    Wenn ein Photon eine Fläche trifft, berechne ich folgendes:

    var schnittpunkt = rayOktree.GetSchnittpunktStrahlOktree(lichtstrahl, ersterAufruf ? false : true);
                Schnittpunkt S = (Schnittpunkt)schnittpunkt;
                if (S != null)
                {
    Vektor einschlagwinkel = -lichtstrahl.richtung;
    float diffuseFaktor = Math.Max(0, (S.InterpolierterSchnittpunkt().normale * einschlagwinkel));
    
    Vektor color = S.NoLightColor();
    
                    //Filter die Farbe
                    aktuellePhotonfarbe.x = Math.Min(color.x, aktuellePhotonfarbe.x);
                    aktuellePhotonfarbe.y = Math.Min(color.y, aktuellePhotonfarbe.y);
                    aktuellePhotonfarbe.z = Math.Min(color.z, aktuellePhotonfarbe.z);
    
    aktuellePhotonfarbe *= diffuseFaktor ;
    
    ...Photon speichern oder reflektieren und weiter verfolgen...
    

    Ich mach das mit den Diffusfaktor so, weil ich in der Rendergleichung ja auch den Term N * w' drin habe. Da erschien mir das logisch^^

    ich wuerde broetchen auch mit keksteig backen :). schmeckt besser, logisch 😛

    Wenn mehr als 600 Photonen im Suchkreis sind, dann wird diese Stelle heller, da ja die Summe aller Photonenenergie geteilt durch Flächeninhalt des Kreises dann eine größer Zahl ergibt. Weniger als 600 Photonen können es nicht werden, da ich den Radius des Suchkreises so einstelle, dass er an jeder Stelle des Bildes mindestens 600 findet.

    das erklaert ein wenig weshalb es ausschaut wie es ausschaut. stell dir vor da ist eine kleine kugel mitten im raum an der 599 photonen haengenbleiben. sie wird dunkel weil du den radius so gross machst, dass du noch ein photon von den waenden einfaengst. das ist weshalb die flachen flaechen zur mitte scheinbar ganz hell werden.
    das soll nicht bedeuten dass du das jetzt mit ideen tweaken sollst bis es besser aussieht... schau wie es richtig geht im paper.



  • Ich schau mir jetzt echt mal diese Papers durch. Ich hab halt nur so eine deutsche Anleitung dazu mir angesehen, aber die hat das ganze nur kurz erklärt^^

    Zeit, dass ich jetzt mal anfange mir diese ganzen Theorien reinzuziehen^^


Anmelden zum Antworten