Licht [lat. Lux, zu grch. leukos >\veiĂ<, >glĂ€nzend<], die durch das Auge und andere Lichtsinnesorgane vermittelte Empfindung der Helligkeit. Mit diesem aussagestarken Satz beginnt der vielzitierte âGroĂe Brockhausâ seinen Artikel ĂŒber das Licht. Uns soll natĂŒrlich weniger interessieren, was Licht ist, als wie es sich verhĂ€lt -wodurch es zum Aussehen unserer Umgebung beitrĂ€gt.
Was ist es ĂŒberhaupt, worauf unser Auge zu reagieren vermag, was uns eine Empfindung von Helligkeit vermittelt? Im allgemeinen geht man davon aus, daĂ das Auge auf elektromagnetische Wellen von ca. 0.4-0.75 um anspricht, entsprechend den Farbempfindungen violett bis rot. Das Auge besitzt dazu eine groĂe Anzahl von EmpfĂ€ngerzellen, die sich in zwei Typen unterscheiden lassen: Ca. 75-150 Millionen Zellen reagieren nur auf Helligkeit, weitgehend unabhĂ€ngig von der Lichtfrequenz, wĂ€hrend sich ungefĂ€hr 6 Millionen Zellen mit dem Erkennen von Farben befassen. Die Schwarz/WeiĂ-EmpfĂ€nger sind erheblich empfindlicher, weshalb Menschen im Halbdunkel nur Schwarz/WeiĂ sehen und erst bei ausreichender Beleuchtung auch Farben unterscheiden können. In brauchbarer NĂ€herung ist die Empfindlichkeit des Auges logarithmisch.
Bild 1: Optische TÀuschungen. Die graue FlÀche in der Mitte hat in beiden Feldern die gleiche Helligkeit. Trotzdem erscheint sie dunkler, wenn sie von einem hellen Rand umgeben wird. Dies ist eine Folge der Kontrastmittelung des Auges.
Sehen beruht also darauf, daĂ Lichtwellen an unser Auge kommen, Lichtwellen, die dazu, wie jeder aus eigener Erfahrung weiĂ, ganz offensichtlich zuerst einmal von einer Lichtquelle ausgesandt werden mĂŒssen. Wir sehen dann den Teil des Lichtes, das entweder auf dem direkten Wege oder ĂŒber Reflexion an irgendwelchen Körpern unser Auge erreicht. Genauso offensichtlich ist. daĂ das Licht nicht von allen Körpern gleichartig reflektiert wird - denn das verschiedenartige Aussehen zweier von der gleichen Lichtquelle beleuchteter Körper lĂ€Ăt sich kaum anders als durch unterschiedliche Reflexionseigenschaften erklĂ€ren. Damit sind wir auch gleich beim PhĂ€nomen Farbe angelangt. Aus dem Physikunterricht werden die meisten Leser noch wissen, daĂ Licht eine Farbe besitzt, oder daĂ weiĂes Licht sich mit Hilfe eines Prismas in verschiedenfarbige Anteile aufspalten lĂ€Ăt. Um es kurz zu machen, weiĂ empfindet man Licht, das alle sichtbaren Lichtfrequenzen in ungefĂ€hr gleicher IntensitĂ€t enthĂ€lt, ansonsten hat das Licht die Farbe des Anteils oder der Anteile, die am stĂ€rksten vertreten sind. Bei der Reflexion von Licht an einem Körper entsteht der Farbeindruck dadurch, daĂ bestimmte Lichtanteile stĂ€rker als andere reflektiert werden. Die Farbtheorie ist zwar nicht ganz so einfach, wie es diese ErklĂ€rung erscheinen lĂ€Ăt, fĂŒr unsere Zwecke genĂŒgt es aber zu wissen, daĂ sich jede Farbe statt aus allen sichtbaren Frequenzen auch aus den drei sogenannten PrimĂ€rfarben Rot, GrĂŒn und Blau zusammenmischen lĂ€Ăt, vorausgesetzt, man addiert ihre IntensitĂ€ten - sogenannte additive Mischung (Im Gegensatz zum Farbenmischen mit dem Malkasten - dort werden IntensitĂ€ten reduziert, denn jede Farbe, die man dazumischt, filtert einen Anteil der Beleuchtung heraus - subtraktive Mischung). Mischt man Licht der drei PrimĂ€rfarben mit gleicher IntensitĂ€t zusammen, erscheint das Licht weiĂ, wenn man die IntensitĂ€ten gleichmĂ€Ăig reduziert grau und grauer und schlieĂlich schwarz. Wenn man die PrimĂ€rfarben mit unterschiedlichen IntensitĂ€ten mischt, kann jede gewĂŒnschte Farbe entstehen. Nach genau diesem Prinzip werden die Farben auch beim Atari ST gemischt, da aber nur 512 Farbtöne zur VerfĂŒgung stehen, ist die Anzahl der möglichen IntensitĂ€tsstufen fĂŒr jede Grundfarbe beschrĂ€nkt. Es gibt auch noch andere Mischsysteme, die meisten sind jedoch weniger leicht verstĂ€ndlich und anschaulich als das RGB-System. Da es auch das meistverwandte ist, wollen wir uns darauf beschrĂ€nken. Auch Fernsehkameras arbeiten ĂŒbrigens auf diese Weise: Je eine Bildröhre empfĂ€ngt rote, blaue und grĂŒne Lichtanteile, der Fernseher setzt das Bild dann auch wieder aus Punkten in diesen drei Grundfarben, die mit unterschiedlicher IntensitĂ€t von der Bildröhre angeregt werden können, zusammen.
Bild 2: Die OberflĂ€chenhelligkeit eines perfekt diffusen Reflektors ergibt sich aus dem Lichteinfallswinkel zur OberflĂ€chennormalen: IFlĂ€che=ILicht * F * cos( a). Dabei ist F der Faktor, der die diffuse ReflektionsfĂ€higkeit der OberflĂ€che beschreibt. Zur Erinnerung: Diffuse Reflektion bedeutet, daĂ Licht, das aus einer bestimmten Richtung auftrifft, gleichmĂ€Ăig in alle Richtungen reflektiert wird.
DarĂŒber, wie viele Farbtöne das Auge ĂŒberhaupt wahrnehmen kann, sind verschiedene Quellen oft sehr unterschiedlicher Meinung, was auch verstĂ€ndlich ist, da man solche Ergebnisse ja nur empirisch und unter verschiedensten Voraussetzungen erhalten kann. Jedenfalls schwanken die mir bekannten Angaben zwischen 5 und 25 Millionen erkennbaren Farbtönen. Vermutlich dĂŒrfte die Zahl erheblich niedriger sein, wenn man die Farben im A/B-Vergleich sieht und höher, wenn UnregelmĂ€Ăigkeiten in FarbverlĂ€ufen erkannt werden sollen.
SchlieĂlich spielen im menschlichen Sehen noch einige andere Faktoren mit, die sich unter dem Begriff âoptische TĂ€uschungenâ zusammenfassen lassen. Nicht immer erscheint uns etwas so, wie es in den âAugenâ eines IntensitĂ€tsmeĂgerĂ€tes aussieht. Zum Beispiel sieht ein Feld mittlerer Helligkeit unterschiedlich hell aus, je nachdem, ob es von einem schwarzen oder weiĂen Rand umgeben ist (Bild 1). Der Grund fĂŒr solche Erscheinungen ist, daĂ sich das Auge an die mittlere Helligkeit einer Szene anpaĂt. Die mittlere Helligkeit einer grauen FlĂ€che mit schwarzem Rand ist aber niedriger, als die mittlere Helligkeit der gleichen grauen FlĂ€che, wenn sie von einem weiĂen Rand umgeben ist.
Derartige TĂ€uschungen gibt es zu viele, als daĂ sie hier alle aufgezĂ€hlt werden könnten. Das Beispiel mag genĂŒgen.
Das Aussehen eines Körpers lĂ€Ăt sich mit Hilfe seiner Reflexionseigenschaften beschreiben. Allerdings wird nicht nur die Farbe einer OberflĂ€che von diesen Eigenschaften bestimmt. Stellen wir uns zuerst einmal vor, der ganze Raum sei von einer indirekten Lichtquelle beleuchtet, und zwar völlig gleichmĂ€Ăig. Die FlĂ€che wird dann einen Teil des Umgebungslichtes reflektieren und zwar völlig unabhĂ€ngig von der OberflĂ€chenrauhheit, wenn die Umgebungshelligkeit gleichmĂ€Ăig genug ist. Die Helligkeit jedes Polygons ergibt sich dann aus der ReflexionsfĂ€higkeit der OberflĂ€che und der IntensitĂ€t des Umgebungslichtes: Die FlĂ€che reflektiert einen bestimmten Anteil des Umgebungslichtes. Die ReflexionsfĂ€higkeit ist also ein Faktor, der sinnvollerweise zwischen 0 und 1 liegt. Die Helligkeit der FlĂ€che ist dann:
IFlÀche=Fref* I Umgebungslicht
Dabei ist Fref die ReflexionsfĂ€higkeit. FĂŒr Farbbilder muĂ diese Formel fĂŒr jede der Grundfarben Rot, GrĂŒn und Blau einzeln mit jeweils einem eigenen Faktor berechnet werden, als Ergebnis erhalten Sie dann die IntensitĂ€ten der drei Farbkomponenten, die zusammen (gemischt) die Farbe der FlĂ€che ergeben.
Jetzt gehen wir einen Schritt weiter: Wir fĂŒhren Punktlichtquellen ein, die ein Objekt, also die FlĂ€chen, aus denen es besteht, direkt beleuchten können. In diesem Fall gibt es zwei Arten von Reflexion: Diffuse und direkte Reflexion. Ein perfekter diffuser Reflektor strahlt aus einer Richtung ankommendes Licht nach allen Richtungen gleichmĂ€Ăig ab. Die StĂ€rke der Reflexion hĂ€ngt dabei vom Einfallswinkel des Lichtstrahles ab. Das Gesetz der geometrischen Optik, das dafĂŒr zustĂ€ndig ist, heiĂt Lambertâs Cosinus-Gesetz (siehe Bild 2). Wenn die OberflĂ€che kein perfekter diffuser Reflektor ist, gibt es wieder einen Faktor zwischen 0 und 1, der die Reflexionseigenschaften angibt. Auch hierbei kann, je nach Material, ein unterschiedlicher Faktor fĂŒr jede der Grundfarben vorhanden sein.
Bild 3 & 4: "Echte" OberflĂ€chen reflektieren nicht nur diffus, sondern auch direkt nach dem Gesetz "Einfallswinkel gleich Ausfallswinkel". Dies gilt aber nur fĂŒr den idealen Fall, reale OberflĂ€chen streuen das einfallende Licht um einen bestimmten Winkel. Je gröĂer der Streuwinkel, desto matter erscheint die OberflĂ€che. Kleine Streuwinkel in Verbindung mit einem groĂen Reflektionsfaktor fĂŒr die direkte Reflektion ergeben deutliche Schlaglicht-Effekte. Der Anteil des direkt reflektierten Lichtes berechnet sich folgendermaĂen:
Idirekt=ILicht * Fdirekt * cos(ÎČ)
Dabei ist F ein Faktor, der die direkte ReflektionsfÀhigkeit der FlÀche angibt. Beachten Sie, daà das Ergebnis nicht nur vom Einfallswinkel des Lichtes, sondern vom Winkeides Reflektions- zum Sichtvektor abhÀngt.
Jetzt existieren zwei Lichtquellen: Das Umgebungslicht und das Licht, das von der Punktlichtquelle kommt. E> ist einsichtig, das sich die Intensiven dieser Lichtquellen addieren. Das einfache Beleuchtungsmodell fĂŒr diffus reflektierende FlĂ€chen lautet somit:
I<sub>flÀche</sub> = F<sub>U</sub>*I<sub>U</sub> + F<sub>Diff</sub>/COS(α)*I<sub>Diff</sub>
Dabei ist Fdiff der diffuse Reflexionsfaktor der FlĂ€che, cos(α) der Einfallswinkel des Lichtes und I die IntensitĂ€t Punktlichtquelle (FU und IU sind der Reflexionsfaktor und die IntensitĂ€t fĂŒr das Umgebungslicht).
Bild 5: Im Beleuchtungsmodell fĂŒr die direkte Reflektion wird der Streuwinkel durch die Potenz des Cosinus des Winkels zwischen Reflektions- und Sichtvektor bestimmt. GroĂe Werte fĂŒr n ergeben kleine Streuwinkel, was zusammen mit groĂen Reflektionsfaktoren deutliche Schlaglichter ergibt, wĂ€hrend kleine Reflektionsfaktoren matte, papierartig scheinende OberflĂ€chen erzeugen. WĂ€hlt man unterschiedliche Faktoren fĂŒr die drei Grundfarben, kann man gefĂ€rbte Schlaglichter, wie sie z.B. bei Metallen auftreten, erzeugen.
NatĂŒrlich ist es möglich, daĂ eine FlĂ€che von mehreren Punktlichtquellen beleuchtet wird. In diesem Fall addieren sich auch diese IntensitĂ€ten:
IflÀche = FU * IU +
|
|
(FDiff*COS(α)*I)i
|
NatĂŒrlich hat dann jede Lichtquelle einen eigenen Einfallswinkel und eine eigene IntensitĂ€t, wĂ€hrend der Reflexionsfaktor fĂŒr alle Lichtquellen gleich ist, denn dieser ist ja eine Eigenschaft des beleuchteten Materials, nicht der Lichtquelle.
Jetzt tun wir so, als sei die Entfernung einer Lichtquelle völlig gleichgĂŒltig. Das es nicht so ist, ist wohl jedem unmittelbar einsichtig; eine Taschenlampe aus 300 Metern Entfernung kann man kaum sehen, wenn sie nahe genug ist, blendet sie. Also bauen wir noch einen Entfemungsfaktor ein. An sich, physikalisch betrachtet, Ă€ndert sich die bei einem Betrachter ankommende Lichtenergie nicht linear mit der Entfernung, sondern mit dem Quadrat der Entfernung. Es zeigt sich allerdings im Experiment, daĂ dies bei Computerbildern zu unnatĂŒrlich wirkenden IntensitĂ€tssprĂŒngen fĂŒhrt, da die Objekte meist relativ nah am Betrachterstandpunkt liegen. Also verzichtet man auf die Physik und verwendet statt dem korrektem Faktor 1/d2 (d ist der Abstand der Lichtquelle) einfach 1/d. Das Beleuchtungsmodell sieht dann so aus:
IflÀche = FU * IU +
|
|
(FDiff*COS(α)*I/d),
|
Das ist alles noch ganz einfach. Leider hat praktisch jedes Material, selbst mattes Papier, die Eigenschaft, auch Licht in eine bestimmte Richtung, also direkt zu reflektieren. Das funktioniert im Prinzip nach dem bekannten optischen Gesetz âEinfallswinkel gleich Ausfallswinkel, das Licht wird also im gleichen Winkel und auf der gleichen Ebene wieder reflektiert, in dem es auf die reflektierende FlĂ€che einfĂ€llt (siehe Bild 3). Leider wird das Licht dabei aber auch leicht gestreut, man sieht diese direkten Reflexionen also nicht nur dann, wenn man direkt auf den Vektor des reflektierten Lichtes schaut, sondern auch aus Winkeln, die etwas abseits liegen. Glatte (glĂ€nzende) OberflĂ€chen haben schmale Streuwinkel, matte OberflĂ€chen weitere (Bild 4). Daraus ergibt sich natĂŒrlich auch, daĂ Schlaglichter mit verĂ€ndertem Betrachterstandpunkt mitwandern.
Bild 6: Der Cosinus des Winkels zwischen L und N lĂ€Ăt sich leicht mit Hilfe des Skalarproduktes berechnen: L=Pl - Pp, mit PI=Position der Lichtquelle und Pp=Position des zu berechnenden Pixels. Das Skalarprodukt ist definiert als a * b = lal * \b\ * cos(a), wobei a = Winkel zw. a und b. AuĂerdem lĂ€Ăt sich das Skalarprodukt in Komponentenform schreiben als:
cos( a)= xaxb+vavb+za*zb
'â ixa'+yaJ+zaJ * \xbJ+yb~+zbJ Die LĂ€nge von L (der Wert d im Beleuchtungsmodell) ist einfach:
d=\IJ = yxIT+fU+zV
Jeder von Ihnen kennt diesen direkten Reflexionseffekt, die sogenannten Schlaglichter. Auf den meisten Materialien haben Schlaglichter leider selten die Farbe der reflektierenden OberflĂ€che, sondern die Farbe des einfallenden Lichtes (Ein Schlaglicht auf blauem Lack, der mit weiĂem Licht beleuchtet wird, ist weiĂ, nicht blau). Eine Ausnahme machen nur die meisten Metalle, die auch die Farbe des Schlaglichtes verĂ€ndern. Im allgemeinen verzichtet man darauf, die tatsĂ€chlichen physikalischen VerhĂ€ltnisse zu simulieren, sondern verwendet empirische, einfache Modelle - statt einer Funktion, die den Zusammenhang von WellenlĂ€nge, Einfallswinkel und IntensitĂ€t des reflektierten Lichtes angibt, einfach eine Konstante fĂŒr die Schlaglicht-ReflexionsfĂ€higkeit. Wenn Sie diese Konstante fĂŒr jede der drei Grundfarben unabhĂ€ngig wĂ€hlen, erhalten Sie gefĂ€rbte Schlaglichter auch bei weiĂem Licht, was natĂŒrlich nicht die gleichen Ergebnisse liefert, wie eine Funktion, die die ReflexionsfĂ€higkeit aus WellenlĂ€nge und Einfallswinkel des Lichtes berechnet.
Das Beleuchtungsmodell mit Schlaglichtern sieht dann so aus:
IflÀche = FU * IU +
|
|
((I/d)* (FDiff*COS(α)+ Fspec*COSn(ÎČ)))i
|
Dabei ist Ă der Winkel zwischen dem reflektierten Licht und dem Sichtvektor, wĂ€hrend die Potenz n des Cosinus die StĂ€rke der Streuung des Lichtes (siehe Bild 5) angibt. Kleine Werte fĂŒr n ergeben weite Streuung, also matte OberflĂ€chen wie Papier, groĂe Werte ergeben enge Streuungen, wie von polierten FlĂ€chen. Fspec ist der Faktor, der angibt, welcher Teil der IntensitĂ€t der Lichtquelle I als Schlaglicht reflektiert wird. I, d, α, ÎČ und n mĂŒssen natĂŒrlich fĂŒr jede Lichtquelle getrennt angegeben werden, wĂ€hrend die beiden Faktoren, wie oben, OberflĂ€cheneigenschaften sind.
Dies ist ein recht primitives Beleuchtungsmodell, da es kaum Eigenschaften realistischer Lichtquellen berĂŒcksichtigt und auch die tatsĂ€chlichen physikalischen Gegebenheiten nur sehr unvollkommen simuliert. Eine echte Lichtquelle beispielsweise strahlt nicht wie die verwendeten Punktstrahler in alle Richtungen, auĂerdem ist eine normale Lampe alles andere als punktförmig. FlĂ€chige Lichtquellen und alle möglichen Spezialeffekte sind aber doch etwas zu kompliziert, um sie hier zu verwenden.
Bild 7a & b: Flatshading und Gouraudshading im Vergleich. Bilder von Hartmut Wagener, berechnet auf einem ST mit einer Grafikkarte von Omega Datentechnik.
Weitere Effekte, die man einbauen kann, beschÀftigen sich mit der Eigenschaft realer Objektive, nur einen begrenzten Bildausschnitt scharf abzubilden, der sogenannten TiefenschÀrfe. Auch so etwas kann man simulieren.
SchlieĂlich gibt es noch, je nach verwendeter Bildgenerierungstechnik, verschiedene Methoden, Schatten und Transparenz darzustellen. Darauf kommen wir spĂ€ter zurĂŒck.
Anwendung von Beleuchtungsmodellen
Wir wissen jetzt zwar, wie man das Verhalten des Lichtes auf OberflÀchen in einfacher NÀherung berechnen kann, aber wie bringt man eine OberflÀche dazu, entsprechend beleuchtet zu erscheinen ?
Die allereinfachste Methode ist es, einfach jedes Polygon komplett mit gleicher IntensitĂ€t zu fĂŒllen. Denn die Winkel, die im Beleuchtungsmodell angegeben werden, sind auf die OberflĂ€chennormale bezogen. Und von allen Pixeln, die innerhalb des Polygons liegen, gibt es nur eine Normale - nĂ€mlich die der ganzen FlĂ€che. Also wendet man das Beleuchtungsmodell fĂŒr jedes Polygon einmal an und fĂŒllt dann das ganze Polygon mit der dabei berechneten Farbe. Allerdings fĂ€llt dabei dem aufmerksamen Beobachter sofort auf, daĂ Schlaglichter nicht besonders sinnvoll sind, wenn man ganze Polygone mit der gleichen IntensitĂ€t ausfĂŒllt. SchlieĂlich ist ein Schlaglicht örtlich begrenzt, so daĂ Bilder etwas merkwĂŒrdig aussĂ€hen, wenn gröĂere FlĂ€chen mit der IntensitĂ€t eines Schlaglichtes ausgefĂŒllt wĂŒrden. Man kann sich in diesem Fall also mit dem einfachen Beleuchtungsmodell mit diffuser Reflexion behelfen. Was man braucht, ist nur das einfache Beleuchtungsmodell und die OberflĂ€chennormale des Polygons. Mit Hilfe der Positionen der Lichtquellen kann man dann leicht den Cosinus des Winkels zur OberflĂ€chennormale berechnen, sowie die Entfernung der Lichtquelle vom Polygon (Bild 6). Schon hat man einfache 3D-Bilder, mit relativ wenig Rechenaufwand.
Weichschattierung
Nur leider sehen diese Bilder nicht besonders realistisch aus. Welches Gesicht (nur als Beispiel) ist schon aus Polygonen zusammengesetzt? Irgendwie muĂ man also versuchen, ein Bild so aussehen zu lassen, als sei es nicht aus Polygonen zusammengesetzt, sondern aus weich und sanft gerundeten Formen...
Das Beleuchtungsmodell ergibt, da pro Polygon nur eine OberflĂ€chennormale vorhanden ist, fĂŒr das ganze Polygon das gleiche Ergebnis. Nun liegt aber selten ein Polygon so ganz allein in der Gegend herum. Im allgemeinen liegen noch ein paar andere Polygone drumherum, jedes mit seinereigenen Normale. Was wollen uns diese Worte sagen ? Nun, wenn wir eine Normale haben und ein paar umliegende Normalen, dann kann man ja die IntensitĂ€tswerte zwischen den Polygonmitten interpolieren und so einen kontinuierlichen IntensitĂ€tsverlauf erreichen. Diese Idee hatte ein Herr Gouraud bereits 1971. Ein Ergebnis des Verfahrens sehen Sie in Bild 7. im Vergleich mit dem flach-schattierten Bild.
Bild 8: Die Normalen an den Ecken von zwei Polygonen ergeben sich aus der Summe der Normalen der FlĂ€chen, die an dem Punkt Zusammentreffen. Da die LĂ€nge der Normalen fĂŒr unsere Anwendung unerheblich ist, kann auf eine Normierung verzichtet werden.
Wie funktioniertâs?
Am einfachsten ist es, wenn wir davon ausgehen, daĂ alle unsere Polygone Dreiecke sind. Wenn nicht, Ă€ndert sich nichts am Prinzip, man muĂ nur schrecklich viele Dinge zusĂ€tzlich beachten. Bleiben wir also bei einem Dreieck. AuĂerdem sollten wir davon ausgehen, daĂ wir uns bereits im Bildschirmkoordinatensystem befinden, am einfachsten ist eine solche Shading-Routine innerhalb des Hidden Surface-Algorithmus zu implementieren. Sehr einfach ist das beispielsweise mit dem z-Buffer. Was wir brauchen, sind erst einmal IntensitĂ€ten fĂŒr jede Seite des Dreiecks. Wir kennen die Normale der FlĂ€che. AuĂerdem liegen um das Dreieck noch andere FlĂ€chen herum, die ebenfalls eine FlĂ€chennormale liabSn. In Bild 8 sehen Sie, was wir tun: Wir berechnen fĂŒr jeden Eckpunkt, an dem sich zwei oder mehr Dreiecke berĂŒhren, eine Mittelwert-Normale, die wir im folgenden als die Normale des jeweiligen Eckpunktes bezeichnen wollen. Da die LĂ€nge der Normalen hier ĂŒberhaupt nicht interessiert, nur die Richtung ist wichtig (im Beleuchtungsmodell wird ja nur der Winkel eines Lichtstrahls zur Normalen verwendet), können wir den Mittelwert der Normalen durch einfaches Addieren der FlĂ€chennormalen erhalten.
Jetzt hat jeder Eckpunkt unseres Dreiecks eine Normale. Mit Hilfe dieser Normalen, die sich aus den umgebenden Dreiecken mitergeben, können wir fĂŒr jeden der Eckpunkte eine eigene IntensitĂ€t mit Hilfe des Beleuchtungsmodells berechnen. Wie berechnet man jetzt aber die IntensitĂ€ten der ĂŒbrigen Pixel, die innerhalb des Dreiecks liegen?
Sehen Sie sich Bild 9 an. Stellen Sie sich vor, Sie tasten das Bild von oben nach unten (oder umgekehrt, wie Sie wollen) zeilenweise ab. Dabei stellen Sie zuerst einmal fest, welche Seiten des Dreiecks sich unter der gedachten Abtastzeile befinden. Bei einem Dreieck ist das sehr einfach, viele Möglichkeiten gibt es ja auch nicht.
Es ist nun sehr einfach, fĂŒr jede Seite, die von der Abtastzeile geschnitten wird, die IntensitĂ€ten zu interpolieren. Ein Beispiel: Der Punkt A habe die Bildschirmkoordinaten Y=240, fĂŒr Punkt B sei Y=120, fĂŒr Punkt C Y=100. Die Abtastzeile schneidet die Seiten AB und AC bei Punkt N mit dem Y-Wert Yn= 180. Wir kennen die IntensitĂ€ten bei A, B und C. FĂŒr die Seite AB ergibt sich also ein IntensitĂ€tsunterschied dI = Ia-Ib. Insgesamt ĂŒberstreicht die Abtastzeile die Seite AB mit
Ya-Yb = 240 - 120 = 120 Schritten,
ein Schritt entspricht also einem IntensitÀtsunterschied von
I abfaktor = -dI /(Ya-Yb)
Die Abtastzeile befindet sich bei Yn=180, also ist sie Ya - Yn = 60 Schritte in y-Richtung von A entfernt.
Daraus ergibt sich eine IntensitĂ€t fĂŒr Punkt N von
In = 60 * I abfaktor
oder, allgemein fĂŒr jeden Punkt der Strecke AB:
In = (Ya - Y abtastzeile) * I abfaktor
Genauso funktioniert das mit den Pixeln auf der Strecke AC oder jeder anderen gerade aktiven Strecke des Dreiecks; lediglich der Faktor und der Bezugspunkt Àndern sich.
Wenn die beiden IntensitĂ€ten fĂŒr die Punkte N und M bekannt sind, kann man das gleiche Verfahren fĂŒr die Berechnung der IntensitĂ€ten aller Pixel auf der Abtastzeile zwischen N und M verwenden. Zuerst einmal berechnet man die IntensitĂ€tsdifferenz
dInm = In - Im
Dann muĂ noch die Anzahl der Schritte zwischen N und M berechnet werden:
Schritte = Xm - Xn
Dabei lassen sich Xm und Xn auf die gleiche Methode errechnen, wie die IntensitĂ€tsverĂ€nderung zwischen A und B bzw. A und C, fehlerfreiere Ergebnisse erhĂ€lt man jedoch, wenn man dazu einen Algorithmus zum Linienzeichnen verwendet. Das liegt daran, daĂ die Auflösung des Bildschirms es ja im allgemeinen nicht erlaubt, eine diagonale Linie so zu zeichnen, wie sie in Wirklichkeit auszusehen hat. Die Computertypischen Treppchen sind die Folge. Berechnet man einfach X- und Y- Koordinaten nach einer Geradengleichung, werden meist Nachkommastellen entstehen, die man nicht einfach runden kann, ohne grobe Bildfehler in Kauf zu nehmen. Solche Fehler lassen sich mit einem Linienzeichen-Algorithmus vermeiden. Das Betriebssystem verwendet auch derartige Verfahren, wenn eine Linie zu zeichnen ist, aber leider zeichnet das Betriebssystem immer mit der gleichen IntensitĂ€t. Gouraud-Shading oder Anti-Aliasing (Verfahren zur Beseitigung der Computer-Treppchen) mit 16 Farben ist aber zugegebenermaĂen auch nicht sehr sinnvoll. Die IntensitĂ€tsverĂ€nderung zwischen zwei Pixeln zwischen N und M ist dann:
dI = -dInm / (Xm - Xn).
Diesen Wert muĂ man nur einmal berechnen, dann kann man die Routine fĂŒr die restlichen Pixel zwischen N und M so formulieren:
For i = N to M DO
I(Pixel I+1) = I(Pixelj) + dl;
So einfach ist das. Im Grunde tut man hier nichts anderes, als zwei Geradengleichungen zu lösen, deren Parameter x (zwischen N und M) bzw. y (zwischen den Eckpunkten) und deren Funktionswert eine IntensitĂ€t ist. Da es sich um Geradengleichungen handelt, ist es nicht erforderlich, jeden Wert neu zu berechnen, es genĂŒgt, einen einmal berechneten Wert zu dem Wert des vorherigen Pixels zu addieren. Das geht natĂŒrlich nur, weil wir uns bereits im Bildschirmkoordinatensystem befinden, das ja ausschlieĂlich aus Integer-Koordinaten besteht. Um ein ganzes Bild auf diese Weise zu schattieren, muĂ man jedes einzelne Dreieck oder Polygon, aus dem das Bild besteht, durch den Algorithmus schicken. Um gleich mehrere Fliegen mit einer Klappe zu schlagen, kann man natĂŒrlich zusĂ€tzlich zur IntensitĂ€ts-Berechnung gleich die z-Koordinate jedes Pixels mitberechnen (Ist auch wieder nur eine einfache Geradengleichung - funktioniert also ganz genauso) und in einem Buffer fĂŒr jedes Pixel der Zeile speichern. Dann hat man einen Spezialfall des z-Buffer-Algorithmus (siehe April-Heft) implementiert, der sich Scanline-z-Buffer-Algorithmus nennt (Scanline=Abtastzeile).
Bild 9: Bei der Weichschattierung nach Gouraud werden zuerst die IntensitĂ€ten an den Eckpunkten des Polygons berechnet. Dann wird linear entlang der Linie ab bzw. ac interpoliert, um den IntensitĂ€tsverlauf entlang der Seiten AB und AC zu erhalten. Damit sind die IntensitĂ€ten bei N und M bekannt. Auf die gleiche Weise kann jetzt zwischen N und M interpoliert werden, um so die IntensitĂ€t jedes Pixels zwischen N und M zu erhalten. Die Lage der Punkte N und M wird von der Abtastzeile bestimmt. Ob man die Polygone von rechts nach links, von oben nach unten, oder wie auch immer abtastet, ist dabei völlig gleichgĂŒltig, lediglich die Methode der Interpolationsrechnung muĂ angepaĂt werden. Die Normalen bei A, B und C, aus denen sich im obigen Beispiel direkt die eingezeichneten IntensitĂ€ten ergeben, haben einen extrem groĂen EinfluĂ auf das Aussehen der Schattierung. Dies ist ein groĂer Nachteil des Verfahrens, da die Normalen der Eckpunkte sehr stark von Form und GröĂe des Polygons selbst, aber auch der umliegenden Polygone abhĂ€ngen. Die einfache lineare Interpolation der IntensitĂ€ten fĂŒhrt daher manchmal zu unnatĂŒrlichen Schattierungen.
Man vergleicht dann vor der Berechnung der IntensitĂ€t die z-Koordinate im Buffer mit der gerade fĂŒr das aktuelle Polygon berechneten. Ist der Wert im Buffer kleiner, braucht man gar nicht weiterzumachen, denn dann ist dieses Pixel bereits von einem nĂ€her beim Betrachter liegenden Objekt belegt.
Bevor wir uns einem etwas raffinierteren Verfahren zuwenden, sollen noch ein paar Probleme des Gouraud-Shading vorgefĂŒhrt werden:
-
Gouraud-Shading ergibt im allgemeinen dann die besten Resultate, wenn man ein einfaches Beleuchtungsmodell ohne Schlaglichter verwendet. Der Grund dafĂŒr ist, daĂ die IntensitĂ€tsverteilung extrem von der Form und Lage der Polygone, aus denen das Objekt besteht, abhĂ€ngt. Es gibt allerdings AusnahmefĂ€lle.
-
Einfaches Gouraud-Shading ergibt starke Shading-Wechsel, die sehr unnatĂŒrlich wirken, wenn man es in Animationssequenzen verwendet. Es gibt allerdings Verbesserungen, die diesen Fehler korrigieren.
-
Bild 10 zeigt einen gezackten OberflĂ€chen-Verlauf, der nach Gouraud-Schattierung flach aussehen wĂŒrde. Das Problem lĂ€Ăt sich durch EinfĂŒgen zusĂ€tzlicher Polygone lösen.
-
Es entstehen sogenannte Mach-Band-Effekte. Dies sind helle Streifen an der Grenze zwischen zwei Polygonen. Der Grund fĂŒr diesen Fehler liegt darin, daĂ zwar die Interpolation der IntensitĂ€ten an der Ăbergangsstelle zwischen zwei Polygonen stetig ist, nicht aber die erste Ableitung der Interpolationsfunktion.
-
Das Verfahren kann natĂŒrlich nicht unterscheiden, ob ein deutlicher Lichtwechsel an einer bestimmten Stelle des Objektes eventuell erwĂŒnscht ist. Alle Kanten werden durch das Schattieren gerundet, auch wenn sie scharf bleiben sollten. Diesen Effekt kann man beseitigen, indem man an den entsprechenden Stellen die Normalen fĂŒr die Eckpunkte so zurechtbiegt, daĂ eine scharfe Schattierungsgrenze entsteht (d.h. man verzichtet an der entsprechenden Stelle auf eine Interpolation der Normalen).
Bild 10: An diesen beiden von der Seite gesehenen FlĂ€chenzĂŒgen sieht man deutlich eines der Probleme, die beim Gouraud-Verfahren auftreten. Im oberen Bild sind die aus den FlĂ€chennormalen gebildeten Ecknormalen Nab, Nbc und Ncd gleich. Die Folge: Das weichschattierte Bild sieht aus, als ei der FlĂ€chenabschnitt flach (Siehe obere IntensitĂ€tskurve). Man kann dieses Problem durch Aufteilen der Polygone B und C in zwei Teilpolygone lösen; die dadurch zusĂ€tzlich entstehenden Normalen Nb1b2 und Nc1c2 sorgen fĂŒr eine dem FlĂ€chenverlauf entsprechende IntensitĂ€tskurve.
Phong-Shading
Eine verbesserte Form des Gouraud-Shading ist das Phong-Shading, benannt nach seinem Erfinder Bui-Tuong Phong. Im Prinzip funktioniert das genau wie Gouraud-Shading, allerdings werden nicht die IntensitĂ€ten entlang der Abtastzeile interpoliert, sondern die Normalen. Dadurch wird das Verfahren erheblich rechenintensiver, denn zum einen mĂŒssen die Normalen interpoliert werden, was schon an sich aufwendiger ist, zum anderen muĂ aber auch das Beleuchtungsmodell jetzt fĂŒr jedes Pixel einzeln angewandt werden, da ja nicht mehr einmal berechnete IntensitĂ€ten interpoliert werden. Der Algorithmus selbst ist auch nicht schwieriger als der des Gouraud-Shading (schlieĂlich ist er von diesem kaum verschieden), weshalb er hier auch nicht nĂ€her besprochen werden soll. Phong-Shading lĂ€Ăt sich aber auch sehr gut mit einem Beleuchtungsmodell mit Schlaglichtern verwenden, die Ergebnisse sind meist weit realistischer als bei Gouraud-Shading. Einige der oben angefĂŒhrten Probleme (z.B. das Animationsproblem) zeigt aber auch dieses Verfahren in seiner einfachen Form.
OberflÀchenstrukturen
Inzwischen sind wir soweit, daĂ wir OberflĂ€chen mit weichen, ânatĂŒrlichen' FarbverlĂ€ufen darstellen können. Leider sind die wenigsten OberflĂ€chen glatt, genauso selten wie OberflĂ€chen einfarbig sind.
Wirklich rauhe OberflĂ€chen, die strukturiert sind, wie Apfelsinenschalen, Stoffe oder Holz, kann man nicht einfach im Beleuchtungsmodell durch den Parameter fĂŒr die direkte ReflexionsfĂ€higkeit erzeugen. Eine solche deutliche Struktur muĂ durch einen Trick erreicht werden. Dazu variiert man ĂŒber eine komplizierte Funktion den Normalenvektor einer OberflĂ€che. Dies kann entweder eine zufĂ€llige Variation sein oder eine Funktion, die sich an mathematischen Modellen orientiert. Auch Bilder von Mustern können als Grundlage fĂŒr die Störfunktion verwendet werden. Besonders einfach ist dieses Verfahren mit Phong-Shading zu implementieren - schlieĂlich verlangt dieses Verfahren sowieso die Berechnung einer Normalen fĂŒr jedes Pixel. Die Normalen mĂŒssen dann nur noch mit der Störungsfunktion ein wenig âverbogenâ werden.
Viele OberflĂ€chen sind irgendwie gemustert oder vielfarbig oder beschrieben usw., bekanntes Beispiel: die Coca-Cola-Dose. Einen Zylinder zu definieren, der wie Blech aussieht, ist mit Phong-Shading kein Problem. Jetzt mĂŒĂte man diesen Zylinder nur noch mit dem Cola-Label bekleben. So etwas erreicht man mit einer sogenannten Mapping-Funktion. Dazu braucht man erst einmal ein zweidimensionales Bild der gewĂŒnschten OberflĂ€che. Dann definiert man eine Funktion, die jedes Pixel des zweidimensionalen Bildes einem Punkt des 3D-Objektes zuordnet. Das ist glĂŒcklicherweise nicht schwierig. Den ganzen Vorgang nennt man âTexture-Mappingâ.
Wenn Sie ein 2D-Bild mit einer rauhen OberflÀche (siehe oben) verwenden und dieses Bild auf ein 3D-Objekt mappen, dann sieht das so aus, als ob Sie ein Photo einer rauhen OberflÀche auf eine glatte OberflÀche geklebt hÀtten. Deswegen muà man wirklich rauh aussehende OberflÀchen auch mit dem viel rechenintensiveren Verfahren der Normalenvektor-Störung erzeugen.
Diese Methoden sind sehr geeignet, wirklich gut und realistisch aussehende OberflÀchen zu erzeugen. Selbst mit einfachen Schattierungsmethoden sehen Bilder sehr gut aus, wenn sie eine OberflÀchenstruktur und ein OberflÀchenmuster erhalten.
Bild 11: Phong-Shading. Bei diesem Verfahren werden nicht die IntensitĂ€ten bei A, B und C aus den Normalen Na, Nb und Nc berechnet, sondern es werden aus diesen Normalen die Normalen bei N und M interpoliert, aus diesen dann wiederum die Normalen jedes Pixels zwischen N und M. Die IntensitĂ€t fĂŒr jedes Pixel wird dann mit Hilfe dieser Normalen mit dem Beleuchtungsmodell berechnet. Damit ist natĂŒrlich erheblich mehr Rechenaufwand verbunden. DafĂŒr sind die Ergebnisse meist erheblich realistischer, ĂŒberhaupt ist es erst mit Phong-Shading sinnvoll, kompliziertere Beleuchtungsmodelle (mit Schlaglichtern usw.) zu verwenden.
Schatten und Transparenz
das ist der letzte Schritt in Sachen Realismus. Leider ist es nicht ganz einfach und auch keineswegs effizient, solche Effekte mit âtraditionellenâ Schattierungsverfahren zu erreichen. Deswegen werden wir in der nĂ€chsten Folge ein Verfahren kennenlernen, das so ziemlich alle Effekte, die heute in der Computergrafik möglich sind, auf einmal und ziemlich elegant erzeugen kann. Leider ist dieses Verfahren, das den schönen Namen âRay Tracingâ trĂ€gt, auch furchtbar rechenintensiv. Dennoch, âRay Tracingâ ist eine der interessantesten Techniken zur Erzeugung von Computerbildern. Bis zum nĂ€chsten Mal also.
CS