PDA

View Full Version : [Frage] Schattierung von Polygonen


Sensei
19-01-2004, 14:27
Hi!
Auch wenn bisher keine sehr hohe Frequenz an Forn-Besuchern vorhanden ist, hier ein neuer Thread für eine neue Beispielart :)

Also:
Es geht um Beispiele wie das 2. Bsp vom 29.01.2001

Hier is so ein Viereck gegeben mit den Normalvektoren an den Eckpunkten. Außerdem kennt man noch Den Vektor in Richtung Lichtquelle sowie IL und kd.
Geuscht ist jetzt die Intensität eines markierten Pixels. Als IlluminationModel soll man die Lambertsche Regel verwenden (zu finden auf den Folien, http://www.cg.tuwien.ac.at/courses/CG/slides_2002/14_Illum.Models&Surf.Rend.pdf,
Seite 2).

Ok... wenn man erst mal den Normalvektor hat ises denk ich nicht mehr so schwer.
Einfach das dotProduct aus N*L berechnen, das ist der gesuchte cos(alpha). kd und IL sind bekannt ==> das noch dazumultiplizieren ==> FERTIG

Aber: Wie interpoliert man denn jetzt die Normalvektoren? Programmiert ham wirs ja, aber am Papier siehts halt doch anders aus....
Ich weiß vor allem nicht von wo ich beginnen soll zu interpolieren und außerdem ist mir unkalr woher ich das in Formel 10-56 (H&B3, S.595) verwendete y nehmen soll? die formel gibts auch in oben referenziertem pdf auf seite 6 unten.
Das stammt doch mMn vom Vektor, den ich gerade suche?!? Oder check ich da was nicth?
Bitte um Hilfe!

zardoz
19-01-2004, 17:43
Das stammt doch mMn vom Vektor, den ich gerade suche?!? Oder check ich da was nicth?

also ich hab mir einfach ein koordinatensystem vorgestellt, dass unten links y1=1 daraus folgt dann das y2=7 und mein y = 5. (einfach die pixel zählen) dann kann ich mir den normalvektor für den ersten pixel in der reihe mit dem * ausrechnen.
dann das selbe für den letzten pixel in der *pixel reihe und der gesuchte* pixel liegt ja genau in der mitte dieser 2 normalvektoren also kann ich mir dann leicht den normalvektor des pixels ausrechnen.
glaube so sollte es gehen

Sensei
19-01-2004, 18:00
Klingt gut. Hatte mir auch schon sowas gedacht mit dem Koordinatensystem das man sich vorstellt. Irgendwie blöd, dass das dann nicht auf der Angabe zu finden ist...

Auf was für einen Normalvektor kommst du denn dann?

Ich hab jetzt mal (-1,6,10) ruasbekommen...!
Achtung: der Normalvektor is falsch! Habe zu früh zu rechnen aufgehört. 4 Details siehe zwei folgende posts! die werte hier unten stimmen also auch nicht (sd nur der rechengang)!

Der berechnete Wert ist dann
I = IL * kd * LdotN = 0,7 * 0,2 * 10 = 1,4

stimmt das? Oder hab ich mich wo verrechnet? Mim LichtVektor der gegeben ist (0,0,1) bin ich mir noch unsicher... muss der nochirgendwie verändert werden? Denke aber eigtl. nicht und die Rechnung oben sollte passen...

Bei Bsp B) bekomm ich dann für H = (0,0,1) also NdotH = 10 heraus.
Insgesamt also
I = kd * IL * LdotN + ks * NdotH^ns
I = 1,4 + 0,3 * 10^4 = 301,4

Kann das stimmen? Wert kommt mir zu groß vor. Also alle vor die mir meine Fehler sagen können!

zardoz
24-01-2004, 09:26
Ich hab jetzt mal (-1,6,10) ruasbekommen...!


ich hab für den normalvektor (1,8,6) rausbekommen.
deine werte passen bei mir zu dem ersten berechneten normalvektor
von pixel 5,5 (wenn ich davon ausgehe, dass unten links das pixel 1,1 ist.)
hab dann noch den gegenüberliegenden 9,5 berechned und von denen 2eien meinen vektor für das pixel mit dem stern.

also N*L=6
I=0.84
das is mein ergebnis. könnte das bitte jemand bestätigen ob das so stimmt!
bin mir selbst auch nicht ganz sicher....

Sensei
24-01-2004, 09:41
verdammt... hast recht ;) hab da zu früh aufgehört zu rechnen ooooooooops ;) :) ;) Solche Fehlerchen sollten einem bei der Prf natürlich nicht passieren...

zardoz
24-01-2004, 09:46
verdammt... hast recht ;) hab da zu früh aufgehört zu rechnen ooooooooops ;) :) ;) Solche Fehlerchen sollten einem bei der Prf natürlich nicht passieren...
mit dem lichtvektor bin ich mir halt auch nicht so sicher...
wie hast du eigentlich den H vector berechnet?? bei b)

Sensei
24-01-2004, 10:15
lichtvektor denke ich passt.
H: V+L und danach normalisieren (sprich x,y,z Wert durch Länge dividieren)!

klwe
24-01-2004, 11:04
(-1,6,10) und (1,8,6) als Normalvektoren können mMn nicht stimmen - die müssen auch noch normalisiert sein.

Folgendes ist natürlich nur bei Phong-Shading relevant - beim Gouraud-Shading muss man eh sofort normalisieren...
Wobei sich generell die Frage stellt, wann der richtige Zeitpunkt zum Normalisieren ist. Zum Zeitpunkt der Berechnung von I muss es sich jedenfalls um einen Normalvektor handeln. Es stellt sich die Frage, ob schon vor der Interpolation oder erst nachher normalisiert werden muss? Das ergibt nämlich unterschiedliche Ergebnisse...

Sensei
24-01-2004, 11:06
wie ham wirs bei der LU gemacht? Kann mich jetzt nicht erinnen...

klwe
24-01-2004, 11:19
wie ham wirs bei der LU gemacht? Kann mich jetzt nicht erinnen...

So. Laut der Formel auf Seite 5 der Folien zum 14. Kapitel sind Einheits-Normalvektoren pro Vertex gefordert (sowohl bei Gouraud als auch bei Phong). Das bedeutet dann wohl gleich normalisieren...

zardoz
24-01-2004, 19:37
kann da mal wer eine lösung posten....wie der normalvektor des *pixels is

bitte......

weil ich kenn mich jetzt nimmer aus. muß ich die gegeben normalvektoren auch normalisieren... und wenn ich mit normalisierten rechne, muß ich dann nichtmehr oder immer wieder normalisieren.....
wie funkt das jetzt??

Matthias
24-01-2004, 22:15
So. Laut der Formel auf Seite 5 der Folien zum 14. Kapitel sind Einheits-Normalvektoren pro Vertex gefordert (sowohl bei Gouraud als auch bei Phong). Das bedeutet dann wohl gleich normalisieren...

Bist du dir da sicher? Die Formel auf Seite 5 der Folien bezieht sich imho nur auf Gourad Shading. Ich hab im Forum ein bißchen zurück geblättert und letztes Jahr ist die selbe Frage aufgekommen. Dort hat dann jemand geschrieben, dass man nur am Ende (also vor dem Anwenden des Illu Models) normalisieren muss.

Soweit ich mich erinnern kann, mach ich es auch genauso bei der LU (erst ganz am Ende, vor dem Pixel zeichnen, normalisieren).

edit: hab nachgeschaut, in der Musterlösung zu Bsp 6 wird immer nur vor dem Aufruf von doIllumination normalisiert.

Matthias
24-01-2004, 22:38
Noch was wichtiges: beim Gourad Shading rechnet man sich ja die Intensitäten der Eckpunkte aus und interpoliert dann mit denen. Was macht man aber, wenn eine Intensität negativ wird? Rechnet man mit dieser negativen Int. weiter oder setzt man sie auf null?

Bei der LU war es so, dass nie negative Werte entstehen konnten (beim doIllumination wurde auf null gesetzt, wenn dies der Fall war). Dort gab es aber halt noch ambientes Licht und das Material des Objekts, hier rechen wir ja nur mit den Lichtintensitäten.

Was ist richtig, was ist falsch? Null setzen? Negative Werte weiterverwenden?

edit: im Buch auf S566 steht ganz oben bei der Formel, dass, falls N * L <= 0 ist, die Intensität gleich 0.0 ist. Also würde ich sagen, dass man damit rechnet.

klwe
25-01-2004, 11:00
Wg. Normalisieren:

Im Buch auf S. 523 (2.Auflage) steht bei Gouraud-Shading:
1. Determine the average unit normal vecotr at each polygon vertex
...

Auf S. 525 steht:
1. Determine the average unit normal vector at each polygon vertex.
...

Also so stehts mal geschrieben...


Soweit ich mich an unser Programm erinnere, haben wir uns um diesen Schritt nie kümmern müssen, weil die Normalvektoren von Anfang an normiert waren.
Dh. es war nur wichtig, die Transformationen der Normalvektoren richtig durchzuführen (und dort aber schon zu normalisieren).

Dann hab' ich das Phong-Shading ausprobiert mit und ohne Normalisierung (zwischendurch) ==> in dem Fall war das Ergebnis nach meinem Empfinden gleich. Das liegt mMn daran, da die Normalvektoren schon vor-normalisiert waren und durch die Interpolation nur geringe Abweichungen auftreten, die sich nicht so stark auswirken.

Wg. Shading:
Also laut den Formeln im Buch (3. Auflage) gibts eine eindeutige Fallunterscheidung, wenn N*L oder wasauchimmer (siehe Buch) < oder <= 0 ist, dann ist das Ergebnis auch Null. So haben wirs auch in der LU gehandhabt. Ansonsten würde man ja die anderen Bereiche (zB Ambient-Beleuchtung) fälschlicherweise beeinflussen.

Matthias
25-01-2004, 12:35
Normalisieren: stimmt schon irgendwie, aber schau dir mal die Werte bei den diversen Beispielen an. Die Normalvektoren sind dort immer so gewählt, dass man sehr leicht (im Kopf) interpolieren kann. Mit vorherigem Normalisieren geht dieser "Vorteil" natürlich verloren. Sollte das wirklich nur ein sehr sehr gemeiner Trick sein? Kann ich mir fast nicht vorstellen.

Aber abgesehen davon: hat schon jemand eines der Phong Beispiele gerechnet? Ich hab gestern 2 gerechnet, bin aber bei beiden auf keine brauchbaren Ergebnisee gekommen. Es sei dazu gesagt, dass ich beide Varianten des Normalisieren ausprobiert habe.

In den Angaben steht (zB beim 3.5.2002): die Richtung zur Lichtquelle ist (0,0,1); die Blickrichtung sei durch (0,0,1) gegeben.
L = (0,0,1) ... klar.
Aber ist V nun (0,0,1) oder (0,0,-1)? Wenn steht Blickrichtung, dann ist das intuitiv die Richtung vom Betrachter zum Objekt, V ist aber der umgekehrte Vektor (vom Objekt zum Betrachter).

Ich hab zuerst beide mit (0,0,1) angenommen, da mir das logischer erschien (Betrachter und Licht von der selben Stelle). Wenn ich jetzt aber die Phong Illumination mit R (das ist genauer als die Methode mit dem H, was wir in der LU verwendet haben) berechne, dann bekomme ich bei der Berechung von "V dot R" auf einen negativen Wert, laut Formel ist der Specular Term dann gleich Null.
Ich bin mir aber sicher, dass wir auf einen Wert kommen sollen, denn sonst wäre nicht ks und der Exponent ns angegeben. Das selbe Problem hab ich auch beim Beispiel vom 6.12.2002.

Nehme ich V = (0,0,-1) dann habe ich einen Specular Term, da sich beim V dot R das Vorzeichen ändert und ich immer positive Werte habe.

Rechne ich das stattdessen das ganze mit dem Halfway Vector H und nicht mit R, dann bekomme ich für V = (0,0,-1) beim H auf (0,0,0) ... also kein Specular Term.
Nehme ich V = (0,0,1) dann ist H ebenfalls (0,0,1) und ich komm auf einen Wert. Also umgekehrt wie bei der exakten Berechnung mit dem R.

Ich versteh echt nicht, was da nicht stimmen kann. Die Ergebnisse mit H und R sollten sich ja zumindest ähnlich sein.

klwe
25-01-2004, 12:51
Ad. Normalisieren: Ja, das hab' ich mir auch gedacht.

Ein Phong-Beispiel hab' ich schon gerechnet (zumindest tw.) - werde die Lösung dann mal online-stellen.

Der V- und L-Vektor ist immer so zu nehmen, wie in der Angabe, keine negativen-Werte oderso. Die zeigen immer vom Objekt zur Lichtquelle oder zum Betrachter.

Aber mir gehts tw. genauso, dass ich irgendwelche Ergebnisse herausbekomme (auch bei der Gouraud-Variante - das liegt wohl an der Phong-Reflection).

Sensei
25-01-2004, 12:59
puh... die diskussion wird langsam unüberschaubar. wann muss jetzt wo normalisiert oder interpoliert werden? welche werte weiterf´gverwenden, welche null setzen. vielleicht kann jemand, der sich bei der beispielart schon recht sicher ist, mal einen "rechenalgorithmus" für phong und/oder gouraud beispiele angeben!

Matthias
25-01-2004, 14:37
Ad. Normalisieren: Ja, das hab' ich mir auch gedacht.

Ein Phong-Beispiel hab' ich schon gerechnet (zumindest tw.) - werde die Lösung dann mal online-stellen.


Wär super! Bitte auch mit Zwischenergebnissen, dann kann ich das mit meinem vergleichen und vielleicht so den Fehler finden.

klwe
25-01-2004, 15:46
Habe gerade gesehen, dass da zuviele Fehler drin sind - ist besser, ich korrigiere das mal vorher...