Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TGGC

1x Rätselkönig

  • »TGGC« ist der Autor dieses Themas

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

1

13.08.2016, 19:18

Evoke Livestream

Interesse an der Demoscene? Schaut live bei der Evoke vorbei: https://www.evoke.eu/2016/live/ Gegen 23:00 sollten die grossen Compos losgehen.

Wir haben wieder was in der Kategorie 4k am Start. Dazu spaeter gerne mehr Infos, wir denken momentan darueber nach spaeter den Quellcode zu veroeffentlichen. Vlt interessant fuer den ein oder Anderen.

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

13.08.2016, 19:39

Jetzt kann ich mir mal wieder beweisen, wie schlecht ich in Sachen Grafikprogrammierung bin ^^.

Werds mir anschauen, danke für den Link!
WIP Website: kevinheese.de

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

14.08.2016, 11:06

Ich wäre sehr an dem Quellcode interessiert, wäre eine coole Geste ;)

TGGC

1x Rätselkönig

  • »TGGC« ist der Autor dieses Themas

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

4

06.09.2016, 23:21

Sry, habs ein bisschen verpennt, aber heute komme ich endlich dazu. Erstmal der Link zum Sourcecode:http://blu-flame.org/files/bf-detached-src.zip

Nun noch ein bissl Blabla, hoffe jemand versteht was ich hier verzapfe:

Grundsätzlich ist alles in 3 Szenen unterteilt, die jeweils aus 4 Kamerafahrten bestehen. In jeder Szenen befinden sich drei Objekte. Dies sind genau genommen die gleichen Objekte, die nur ihre Form ändern. Die Kamerafahrten selbst sind nicht viel mehr als simple Transformationen (Translationen und Rotationen), die teilweise von einem Parameter (der Zeit) abhaengen. Ich werde daher nicht weiter darauf eingehen. Noch ein kleiner Trick zu den Szenen: diese werden immer komplexer und daher deren Rendering auch langsamer. Ich habe daher die Iterationstiefe der Reflektionen in jeder Szene um eins gesenkt. Im Prinzip einfach Iterationstiefe = 5 - aktuelleSzene. Das braucht nicht viel Platz bringt aber den erwuenschten Effekt.

Kommen wir zu den drei Szenen. Erstmal gibt es in der Mitte immer eine rote Kugel, da ändert sich nur der Radius. Für die erste Szene gibt es neben der Kugel einen tuerkisen Wuerfel, der rotiert und sich auf die Kugel zubewegt. Aussenrum gibt es das gelbgraue Umgebungsobjekt, das normalerweise aus sehr vielen kleinen Objekten zusammengesetzt ist. In der ersten Szene haben wir einen Schlauch von kleinen Kugel aussenrum. Damit das Ganze nicht ganz so eintoenig wirkt, werden die Größen der Kugeln veraendert. Dies geschieht einfach ueber eine Kombination von Sinusfunktionen.

In der zweiten Szenen wird aus dem tuerkisen Wuerfel eine Art Schlange. Dies ist im Grunde ein Zylinder, dessen Radius variert. Damit die Schlange ein bissl rumschlaengelt wird nun erst den Bereich wo sich der Radius aendert verschoben und dann auch die Hauptachse des Zylinders mit einer Kombination von Sinusfunktionen transformiert. Das ergibt eine Schlange die zur Kugel hinschlaengelt. Das Objekt aussen herum ist nun auch eine Art Zylinder, der aber innen hohl ist, zusaetzlich sind Zylinder senkrecht dazu ausgeschnitten. Zu guter Letzt kommen noch kurze Scheiben von Zylindern hinzu. (Wenn man schonmal die Zylinderformel hat, muss man die ja auch ein paar mal benutzen.) Das ganze wird ebenso ein bissl rumgeschlaengelt und dann noch in sich gedreht. Auch hier wieder ein kleiner Trick. Fuer alle vier Kamerafahrten schlaengelt die Schlange zur Kugel, also zeigen alle 4 Szenen genau den gleichen Vorgang. Aber der Umgebungszylinder ist unendlich lang und in der Mitte der Kugel "verstopft", die Schlange jedoch auf der anderen Seite. Da die beiden Seiten sich sehr aehnlich sehen, kann der Zuschauer nicht unterscheiden, dass er aber der dritten Kamerafahrt in dieser Szene die Seite wechselt. Stattdessen denkt er "oh, eine Schlange kommt", obwohl sie schon das dritte mal anschlaengelt. Damit kann die "Anschlaengelformel" simpler sein und braucht weniger Platz.

In der letzten Szene wird das tuerkise Objekt aus drei Wuerfeln zusammengesetzt die um die Kugel rotieren. Zusaetzlich werde sie noch zur Kugel hin verformt. Komplizierter ist das Umgebungsobjekt. Es basiert auf der Idee einer Kantormenge. Es gibt einen (prinzipiell unendlich grossen) Wuerfel, aus dem laengliche Wuerfel ausgeschnitten werden. Die laenglichen Wuerfel werden mit jeder Iteration immer schmaler, dafuer aber auch immer mehrfach kopiert. Dann wird das ganze noch gegeneinander gedreht. Diese Rotationen sind u.A. von der Zeit abhaengig und so entsteht die Animation.

So das solls erstmal sein, ihr koennt ja gerne nachfragen. Und nochmal fuer alle die gar nicht wissen um was es geht, das Video:


xTr1m

1x Rätselkönig

Beiträge: 47

Wohnort: Rheinland-Pfalz

Beruf: Softwareentwicklung

  • Private Nachricht senden

5

07.09.2016, 11:04

Ich habe für diese 4k die Musik und die Assembler Optimierungen gemacht.

Zur Musik ein paar Worte: Ich nutze seit jahren schon einen synthesizer, welches selbst aus Mitgliedern der Demoszene entstanden ist. Es nennt sich 4klang. Der synthesizer besteht aus 2 Teilen: Zum einen hat es einen VSTi Plugin, womit man ganz bequem aus der DAW seiner wahl komponieren kann, und zum anderen hat es eine 4klang.asm Datei, die zusammen mit dem Projekt kompiliert wird. Im VSTi kann man über visuelle Programmierung 16 individuelle Instrumente erstellen. Jedes Instrument besteht aus maximal 64 Operatoren. Ein Operator kann entweder ein Signal erzeugen (z.B. Oszillatoren), verändern (z.B. Filter oder Effekte) oder kombinieren (addieren, multiplizieren, andere arithmetische Operatoren). Viele Operatoren arbeiten wahlweise mit 2 Signalen gleichzeitig, um Stereosignale zu unterstützen.
Nachdem die Instrumente erstellt und das Lied komponiert ist, kann man in der GUI vom VSTi den 'Record' aktivieren, wonach man dann den Song ein mal komplett abspielen muss. Nach dem stoppen vom 'Record' kann man nun die generierte 4klang.inc und 4klang.h abspeichern. Dies sind die Dateien, die die Informationen der Musik für die Intro enthalten.

In der 4klang.h stehen nützliche Informationen zur Musik drinnen, wie z.b. die BPM, anzahl an Samples, und die Deklaration der Methode, die die Musik generiert. Die intro muss quasi nur 4klang_render(myBuffer) aufrufen, der rest passiert von allein. Wir machen das in einem extra Thread, um nicht bis zum Ende der Generierung zu warten, die an sich recht lange braucht. Abspielen und Generieren geht gleichzeitig, vorausgesetzt dass die Generierung schneller als das Abspielen erfolgt, was meistens der Fall ist.

Um die 4klang.asm zu kompilieren, die unsere 4klang.inc includet, nutzen wir yasm. Dafür haben wir in Visual Studio für die 4klang.asm eine custom build tool Regel erzeugt, wo yasm einfach aufgerufen wird, und dadurch eine linkbare 4klang.obj erzeugt wird.

Da wir schon beim Thema assembler sind, will ich noch einiges über die Arbeit berichten, die hinter der Kulisse abgeht, und dafür sorgt, dass die Intro überhaupt 4k klein wird. Wir nutzen nicht den linker von Visual C++, sondern einen, auch aus der Demoszene entstandenen, komprimierenden linker. Compressing linker, es heißt Crinkler. Das ersetzen des Linkers geschieht, in dem man einfach eine link.exe im Projektverzeichnis ablegt, und in den Projekteinstellungen das Projektverzeichnis selbst unter den 'Executable Directories' einträgt. Crinkler bietet viele Kommandozeilenargumenten um den Komprimierungsvorgang nach Belieben zu tweaken. Meistens reicht es aus, Crinkler zu verwenden. Doch wenn man immernoch eine Datei erzeugt kriegt, die trotz aller Mühe größer als 4k ist, muss man etwas mehr arbeit reinstecken. Crinkler hilft dem Entwickler, zu identifizieren, wie groß welche Bereiche des codes sind. Es erzeugt eine report.html seite, wo man den disassembly der intro einsehen kann, übersichtlich gegliedert und auf- und zuklappbar. Jeder opcode ist farblick gekennzeichnet, sodass man genau sehen kann, welcher code schlecht komprimiert und am Ende viel Platz belegt.

Man hat die Wahl, ob man den C++ code kompressorfreundlich umschreibt, oder gleich in Assembler übersetzt. Das habe ich gemacht. Es gibt viele Möglichkeiten, den Assembler code so umzuformen, sodass er zwar noch die selbe Bedeutung hat, dennoch durch seiner Anordnung komprimierfreundlicher ist.

Ihr könnt zum Vergleichen beide varianten sehen. Im Quelltext gibt es eine 'release' Version von der main.cpp, und eine 'compress' Version. Im Release ist der Leit-Code, in C++ geschrieben, und in 'compress' ist der Assembler Port. Dazu sei gesagt, dass der Assembler Port zum Glück nicht immer neu geschrieben wurde, den habe ich für frühere 4ks gemacht, und mit kleinen Veränderungen übernommen. Meiner Erfahrung nach, konnten wir alleine durch den Assembler port zwischen 100 und 150 Bytes sparen, was bei einer Gesamtgröße von 4096 bytes nicht unerheblich ist.

Mit diesem C++ und Assembler Grundgerüst, stand uns Jahr für Jahr die Tür offen, neue Intros zu gestalten, in dem man einfach neue Shader und neue Musik macht. Ich hoffe, euch gefallen weiterhin unsere Kunststücke! :)

Werbeanzeige