|
|||||||||||||||||||||||||||||||||||||||||||
Tutorial & Download "Drehzoomer"Beschreibung des EffektesWo zu sehen?Dies ist einer meiner Lieblingseffekte, zu sehen in Demos wie Lasse Reinbong von Cubic Team (1995) oder Headache von Statix / Psychic Link. (1996).Dieser Effekt ist recht rechenaufwendig (In damaligen Dimensionen muss man sagen). Man kann aber schon mit wenigen weiteren Modifikationen (z.B. Palette ändern, Text statt sich bewegender Punkte) sehr unterschiedliche, sehr schön anzusehende Bildersequenzen erzeugen. Wie wird's gemacht?
Es handelt sich dabei um einen Rückkopplungseffekt, der stark an
eine vor einem Fernseher gestellte Videokamera erinnert. Die Idee ist
es, einen Ausschnitt des aktuelle Schirmbildes wieder auf Vollbild
aufzublähen. Anschliessend geht man mit einem schnellen
Weichzeichner (Mittelwertbilder) darüber, um die echigen Pixel,
die nach dem Zoomen sichtbar werden, abzurunden. Der Weichzeichner ist
zusätzlich noch so eingestellt, daß er bei jedem Schritt
die Farbe des Bildes etwas in Richtung Hintergrundfarbe abdunkelt. So
entsteht der verschmierende Nebeleffekt. Wenn man nun vor dem
Weichzeichner in einem Zwischenschritt eine Figur zeichnet - zum
Beispiel einen Pixelschwarm, ein Logo oder ein Drahtgittermodell -
dann sieht es aus, als ob das Logo unendlich oft auf dem Bildschirm
erscheint, dabei noch brennt und sehr schnell rotiert.
Der Effekt gliedert sich in drei voneinander unabhängige Abschnitte, den
Der PixelsturmDer Pixelsturm ist der einfachste Teileffekt. Es handelt sich dabei einfach um 100 voneinander unabhängiger Punkte, die auf ellipsenförmigen Bahnen über den Bildschirm bewegt werden.
Ein einfaches Array aus 100 Pixeln (X- und Y-Koordinaten eintragen) in
Verbindung mit etwas Sinus-Kosinusspielerei wirkt hier schon
Wunder. Wie ein sich bewegender Mückenschwarm.
Der WeichzeichnerDieses Hilfsmittel entspringt in dieser Form einem anderen Effekt, der als "brennender Bildschirm" bekannt ist. Um den Farbwert eines Pixels zu bestimmen, nimmt man einfach den Mittelwert der vier (oder besser: acht) direkt benachbarten Pixel. Die erhaltene Zahl wird noch um eins reduziert, und schon ist der abdunkelnde Weichzeichner fertig. Vom Prinzip her einfach zu realisieren, jedoch entpuppt es sich als die größte Bremse im Programm. Verbraucht pro Pixel vier Addition von vier Farbwerten (jeweils ein Byte pro Pixel) und eine Division, die aber durch den Assembler-Befehl "Shift-Right um 2" laufzeitlich entschärf wurde. Der RückkopplerDieser Effekt ist sehr schwierig zu erklären, und ist das Ergebnis vieler verschiedener Ansätze und Mißversuche. Die Grundidee war, ein beliebiges Rechteck in den Bildschirm zu legen, und dieses genau auf Bildschirmgröß auszudehnen. War aber leider zu unflexiebel. Andere Ansätze sahen dann zwar besser aus, waren aber zu langsam. Es sollte dabei ja keine Diashow, sondern ein in Echtzeit ablaufender Effekt herauskommen.
Die optimale Lösung war dann die Verwendung einer
Abbildungsmatrix. Dies funktioniert sehr schnell, und bietet alle
Möglichkeiten, um den Zoomeffekt in Echtzeit zu
modifizieren. Eine Matrix kann problemlos skalieren (hineinzoomen,
herauszoomen) und rotieren. Die Matrix ist konstant für alle
Bildpunkte, und braucht nur einmal pro Frame berechnet zu werden. Die
Kernschleifen können mit Hilfe von inkrementellen Ansätzen
stark optimiert werden.
Alle weiteren Schritte beziehen sich auf auf den sogenannten MCGA-Modus (bekannt als Mode-13hex) mit 320x200 Pixeln und 256 Farben.
Man geht also durch seinen Zielpuffer (Beispielsweise der
Bildschirmspeicher beginnend ab mem[$a000:0]), mit der Koordinate
(0,0) in der linken, oberen Ecke. Zu Bearbeiten hat man 200 Zeilen mit
jeweils 320 Pixeln, was 64000 Matrix-Vektor-Verknüpfungen
entspricht. Zu jeder Koordinate erhält man durch die
Verknüpfung mit der Matrix eine neue Koordinate, die
Quellbildkoordinate.
Optimierungen
x' = a*x + b*y y' = c*x + d*y mit a,b,c,d = Matrixelemente (Konstant pro Frame) und x ,y = Zielbildkoordinaten (akt. Position auf Schirm) und x' ,y' = gesuchte Quellbildkoordinaten (in altem Bild)
Warum also keine vorgekauten Tabellen verwenden?
Dafür vereinfacht sich aber die Hauptschleife sehr stark: x'=A[x] + B[y]; y'=C[x] + D[y];Es gibt keine Multiplikationen mehr, und bei zeilenweisem Vorgehen brauchen B[y] und D[y] nur einmal pro Zeile ausgelesen werden (Da y pro zeile ja konstant ist). Ausserdem liegen die Elemente der Arrays A[x] und C[x] linear (also direkt) hintereinander im Speicher, und können sehr schnell durch einfaches inkrementieren der Speicheradresse ausgelesen werden.
Durch einfache Manipulation der Abbildungsmatrix kann nun die sich
fliessend Ändernde Bewegung des Schirmbildes erreicht
werden. Auch hierfür bieten sich wieder Sinus-Kosinusspielereien
an. Ich verweise dazu aber auf die Quellcodes.
Programmablauf pro Frame
Es ist viel schneller, aus dem RAM des PC zu lesen, als von der Grafikkarte ab mem[$a000:0]. Es war daher sinnvoll, zwei eigene Puffer im RAM (SOURCE und DEST) zu verwenden, und auf mem[$a000:0] nur einmal pro Frame schreibend zuzugreifen! Genauere Infos in den Quellcodes. ProgramminfoTurbo Pascal (7.0) für Dos, incl. der Kommentare 346 LoC (Lines of Code)Videomodus: Standard Mode 13h, 320x200 Pixel bei 256 Farben (Palettenmodus) Großteil des Programmes in Assembler, es wird aber kein externer Assembler-Compiler benötigt. Geschwindigkeit: AMD K6-233 mit Synchronisation : 35 Frames pro Sekunde (fps) AMD K6-233 ohne Synchronisation : 57 Frames pro Sekunde (Max-fps) DownloadDownload als ZIP-File: zoomer.zip (9552 Bytes)Das Paket enthält das ausführbare EXE-File und den Quellcode. Wer also Angst vor Viren hat, kann sich die Programme durch Turbo-Pascal nochmals selbst übersetzen lassen. Screenshots
|
|||||||||||||||||||||||||||||||||||||||||||
Seitenanfang |
Inhalt und Design von Florian Evers, florian-evers@gmx.de |
||||||||||||||||||||||||||||||||||||||||||