|

Grundlagen der Grafikprogrammierung - Teil 14 - by Delax
HiHo!
In diesem Teil geht es um Glenzing. Was zur Hölle das ist? Man kann es als kleine Vorstufe zur Transparenz sehen.
Stellt euch mal folgendes vor: ihr habt zwei Vierecke, gefüllt mit einer Farbe, die nebeneinander gezeichnet sind:

Programmieren lässt sich das ganz einfach mit 2 Schleifen:
FOR counter1 := 10 TO 110 DO
FOR counter2 := 10 TO 80 DO
PutPixel(vidvscr,counter1,counter2,10,10);
Simpel, ja? Von 10 bis 110 auf der X Achse wird je eine Linie von 10 is 80 auf der Y Achse gezeichnet. Das gleiche gilt für das zweite Viereck, nur dieses sollte in einer anderen Farbe gezeichnet werden.
Was passiert nun, wenn man diese Vierecke bewegen will? Auch kein Problem, man muß nur die Eckpunkte links/ oben und rechts/ unten in Variablen speichern und dann kanns los gehen:
FOR counter1 := linksobenX TO rechtsuntenX DO
FOR counter2 := linksobenY TO rechtsuntenY DO
PutPixel(vidvscr,counter1,counter2,10,10);
Na gut, auch das machen wir und animieren die beiden Flächen so, wie wir auch unseren Punkt in Kapitel 11 bewegt haben: immer addieren und am Bildschirmrand abprallen. Jetzt wird es aber schnell passieren, das sich die beiden Flächen überdecken. Und jetzt kommen wir zum glenzing!
Glenzing bedeutet das sich die Flächen eben nicht gegenseitig verdecken, sondern vielmehr überlagern und so eine neue Farbe ergeben. Das ist einfacher als man denkt. Schauen wir uns den Fall mal an:

Um das zu erreichen haltet euch folgendes vor Augen: Wir setzen einen Pixel, in dem wir in einen bestimmten Teil des Speichers, der den Bildschirm repräsentiert einen Wert kopieren. Was sich davor an dieser Stelle im Speicher befand wird überschrieben. Um nun die Information, die sich vorher schon darin befand zu erhalten ADDIEREN wir einfach den neuen Wert zu dem schon vorhandenen.
Folgendes Beispiel: Am Anfang jedes Frames ist der Bildschirm logischerweise gelöscht (also meißtens auf 0 oder sonst einer Hintergrundfarbe). Nun zeichnen wir eine Fläche und diese Pixel werden auf den Wert 10 gesetzt. Nun zeichnen wir eine weitere Fläche mit der Farbe 11, aber diesmal ADDIEREN wir den Wert. Wo der Bildschirm leer ist bekommt die Fläche trotzdem die Farbe 11 (da 0 + 11 = 11). Wo sich aber schon die erste Fläche befindet, ist der Farbwert 10 schon eingetragen und die Farbe wird zu 21 (10 + 11 = 21).
Um die Werte nicht zu überschreiben müssen wir die PutPixel Routine abändern. Hier die neue Routine:
PROCEDURE PutGlenze(destiny : pointer; x,y : longint; color1, color2 : byte);
mov edi,destiny Bindet den Virtual Screen an das Register edi.
mov eax,x Kopiert den Inhalt von x in das Register eax.
mov ebx,2 Kopiert den Wert 2 in das Register ebx.
imul ebx Multipliziert ebx mit eax (mit anderen Worten: die angegebene X Koordinate mal 2)
add edi,eax Bewegt sich im Virtual Screen um das Ergebnis nach vorne.
mov eax,MaxX Bewegt MaxX nach eax.
imul ebx Multipliziert ebx mit eax (mit anderen Worten: die angegebene MaxX mal 2)
imul y Multipliziert eax mit y (Also MaxX mal 2 mal der angegebenen Y Koordinate).
add edi,eax Bewegt sich im Virtual Screen um das Ergebnis weiter.
mov al,color1 Kopiert den Inhalt von color1 nach al
add [edi],al Trägt an der Stelle im Pointer den Wert ein, der in al steht.
add edi,1 Bewegt sich im Virtual Screen um eins nach vorne.
mov al,color2 Kopiert den Inhalt von color2 nach al.
add [edi],al Addiert an der Stelle im Pointer den Wert, der in al steht.
Das ist doch einfach, oder? Anstatt mov [edi],al schreiben wir einfach add [edi],al und der gewünschte Wert wird addiert statt kopiert. Und das ist auch schon glenzing. Simpel, macht aber eine Menge Spaß!
Den Source zu einem Beispielprogramm gibt es hier.
Nun ein bischen Theorie über Transparenz. Das Prinzip ist änhlich - der Unterschied ist nur das glenzing sich nicht um die Farben schert. Ihr könnt eine hell- und eine dunkelblaue Fläche kombinieren und heraus kommt möglicherweise gelb. Da Transparenz aber die Farben nicht grundsätzlich verändert müsst ihr einfach nur darauf achten das ihr die Farben einhaltet.
Folgende Überlegung: eine blaue Glasscheibe wird über einen weißen Pixel bewegt. Betrachtet jetzt die Farbe des Pixels und er wird je nach Intensität der Transparenz irgendeine Farbe zwischen weiß und dem Blau der Scheibe haben. Also: bei Transparenz ist eine Farbtabelle zwischen Farbe eins und Farbe zwei nötig, die je nach der Durchlässigkeit der Scheibe entlang gewandert wird. Soweit zur Theorie, aber für die Praxis habt ihr noch genug Zeit wenn wir
bei 3D angekommen sind ;)
Delax/ Sundancer Inc.
[delax@sundancerinc.de]
Back to previous page
|