← ST-Computer 06 / 1988

Bilderspiele - Licht

Grundlagen

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 +
n
∑
i=1
(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 +
n
∑
i=1
(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 +
n
∑
i=1
((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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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