Logo: Strunz Seitenlogo: Strunz-Design
Auswahl
 Begrüßung
\/Programmieren
 Galerie
 Sonstiges

Coding
 Übersicht
 Albengenerator
\/Demoeffekte
 ICPC
 Links

Demoeffekte
 Übersicht
 Zoomer
->Lasershow
 Vectorballs
 Delayvectors
 

Eine Lasershow - schneller Lichteffekt mit Quellcodes

Beschreibung des Effektes

Sehr schnell auf dem Bildschirm rotierende Farbbalken erzeugen den Eindruck wild tanzender Sterne. Erinnert an eine Lasershow. Durch Variation der Balkendicke und der Rotationsgeschwindigkeit erhält der Effekt eine hohe Dynamik.

In welchen Demos zu sehen?

Diesen Effekt habe ich bisher nur in einem einzigen Demo gesehen, und zwar in der Juice-Demo von Psychic Link. Dies ist eines der besten Demos aller Zeiten, und wurde im Jahre ???? auf der XXXX in XXXX präsentiert, wo es den xxx. Preis holte.

Wie wirds gemacht?

Der Effekt besteht aus einem Farbverlauf mit 256 Farbabstufungen. Die Farben sind wie folgt zyklisch angeordnet:

Farb-Nr.   Farbe
0  :  Schwarz
32  :  Rot
64  :  Weiß
96  :  Rot
128  :  Schwarz
160  :  Blau
196  :  Weiß
228  :  Blau
256=0  :  Schwarz

Die Farben sind zyklisch angeordnet, so daß die Farben als (Farbwert mod 256) betrachtet werden können. Dieser Farbverlauf wird nun mit Hilfe eines abgespeckten Textur-Mappers auf den Bildschirm gezeichnet. Man bestimmt einfach, wie stark der Farbwert für jeden Pixel in einer Bildschirmzeile erhöht werden soll, und schon hat man ein Muster mit senkrechten Balken. Wenn man dann noch zusätzlich pro Zeile den Startfarbwert für den ersten Pixel der Zeile um ein anderes Inkrement erhöt, sind auch vertikale Ferbverläufe möglich. Aber erst durch die Kombination beider Inkremente werden Farbspielereien wie die sich drehenden Balken möglich.

In Zukunft werde ich die beiden genannten Inkremente Farbsteigungen nennen, und zwar dx für die Farbänderung innerhalb einer Zeile und dy für die Farbänderung zwischen unterschiedlichen Zeilen.
Desweiteren wird noch ein Farboffset namens Versatz benutzt, welcher zu dem Farbwert eines jeden Pixels noch hinzuaddiert wird. Damit sind dann auch horizontale Bewegungen, ähnlich dem Effekt des Palettenrotierens, machbar.

Um die Bewegung zu erzeugen, muß man also pro Bild nur die beiden Farbsteigungen und den Versatz berechnen, den Rest erledigt der Mapper.

Beispiele mit verschiedenen Farbsteigungen

Die Prozedur Textur erwartet also beim Aufruf als Parameter die zwei Farbsteigungen dx und dy sowie einen Verschiebewert Versatz. Leider ist die oben angebenene Definition sehr abstrakt, so daß ich hier nun noch ein paar einfache Beispiele angeben möchte. Die Beispiele dienen dazu, die Auswirkung unterschiedlicher Farbsteigungen besser zu verstehen.

dx:=0,25
dy:=0
dx:=1
dy:=0
dx:=2
dy:=0
dx:=0
dy:=0,25
dx:=0
dy:=1
dx:=0
dy:=2
dx:=0,25
dy:=0,25
dx:=1
dy:=1
dx:=2
dy:=2
dx:=-0,25
dy:=0,25
dx:=-1
dy:=1
dx:=-2
dy:=2
dx:=-0,25
dy:=0,25
Versatz:=64
dx:=-1
dy:=1
Versatz:=64
dx:=-2
dy:=2
Versatz:=64

Um nun die Rotation zu erreichen, läßt man dx und dy einfach auf einem Kreis rotieren (Interpretation der Koordinaten). Dazu reichen für dx die Sinus-Funktion und für dy die Kosinusfunktion aus. Man braucht nur noch pro Frame den Winkel zu erhöhen und schon rotieren die Balken auf dem Bildschirm.
Der Zoomeffekt ist noch einfacher zu realisieren. Man muss nur noch die Steigungen dx und dy jeweils mit einem konstanten Faktor multiplizieren.

  • Hereinzoomen: Multiplikation mit kleinerem Faktor als im letzten Frame.
  • Herauszoomen: Multiplikation mit größerem Faktor.
  • Erhöhung der Rotationsgeschwindigkeit: Winkelinkrement vergrößern.
  • Verschiebung der Farbbalken: Versatz ändern.

Anmerkung zu den Zahlenbeispielen:
Das Programm arbeitet mit Fixkommazahlen, um den langsamen Umgang mit Fliesskommazahlen (Typ "Real") zu vermeiden. Der Nachkommastellenanteil wird dabei durch die acht unterwertigsten Bits einer Integervariablen (16 Bit) repräsentiert. Um also die Farbsteigung "1" zu erreichen, ist der numerische Wert "256" nötig. Die "0,25" erreicht man durch das Äquivalent "64", die "2" dagegen durch "512".
Dadurch erreicht man auch den Vorteil, daß man in Assembler sehr leicht den gewünschten Ganzzahlenanteil ohne Division erhalten kann. Die Zahlen werden in 16-Bit Registern gespeichert, welche schon von Haus aus in ein höherwertiges 8-Bit Register und ein niederwertiges 8-Bit-Register gesplittet sind. Der gewünschte Ganzzahlenanteil steht also ohne Umrechnung im hochwertigen 8-Bit-Teilregister bereit.

Programmablauf pro Frame

1. Start mit Farbwert aus der Variablen Versatz, speichere diesen in der Variablen "Zeilenstartfarbe".
2. Berechne Farbsteigungen in X- und Y-Richtung
3. Für jede Zeile [0..199] mache:
3. 1. Pixelfarbe:=Zeilenstartfarbe
3. 2. Für jeden Pixel [0..319] der Zeile mache:
3. 2. 1. Male Pixel in Pixelfarbe an aktuelle Bildschirmkoordinate
3. 2. 2. Erhöhe Farbwert in Pixelfarbe um X-Farbsteigung
3. 3. 3. Gehe zu nächstem Pixel auf Bildschirm
3. 4. Erhöhe Farbwert in Zeilenstartfarbe um Y-Farbsteigung
4. Warte auf vertikalen Retrace des Bildschirms, Synchronisation
5. Weiter mit Schritt 2.

Programminfo

Turbo Pascal (kompiliert mit TP 7.0)
Videomodus: Standard Mode 13h (MCGA), 320x200 Pixel bei 256 Farben
Geschwindigkeitsrelevante Kernschleifen in Assembler, Effekt läuft in Echtzeit ab. Ein zusätzlicher, externer Assembler wird nicht benötigt.
161 LoC - "Lines of Code"
Anmerkung: Keine Unit CRT mehr, daher sollte das Programm auch noch auf modernen Rechnern startbar sein.

Geschwindigkeit:
AMD K6-233 mit Synchronisation: 70 Frames pro Sekunde (fps)
AMD K6-233 ohne Synchronisation: 799 Frames pro Sekunde (Max-fps)

Download

Download als ZIP-File:
lasershw.zip (6556 Bytes)
enthält ausführbares .EXE-Files und den Quellcode.

Screenshots

Ein Standbild der sich schnell ändernden Bildfolge
Aber erst durch die schnelle Rotation bei 70 Bildern pro Sekunde wird der Effekt sichtbar
Die Farbbalken überlagern sich dann und erzeugen wild tanzende, sternförmige Muster
Auch leider nur ein Standbild *g*


Seitenanfang

Inhalt und Design von Florian Evers, florian-evers@gmx.de