Archiv für Juni 2009

Projektstatistik 06/2009

Dienstag, 30. Juni 2009

Wie ich bereits im vorigen Beitrag erzählt habe, war das Scripting-System hauptsächlicher Gegenstand meiner Entwicklung in den letzten Wochen. Hierfür sind knapp 2.000 Zeilen hinzugekommen (reiner Code). Mehr soll an dieser Stelle auch gar nicht dazu gesagt werden. Hier ist die aktuelle Tabelle:

Zeilen gesamt Nur Code Nur Kommentare Code mit Kommentaren Leerzeilen Nicht-Leerzeilen
116.323 50.157 36.157 3.086 26.923 89.400
100 % 43 % 31 % 3 % 23 % 77 %

(Zur vorigen Tabelle geht es hier.)

Das Scripting-System werde ich noch ein wenig überarbeiten und ein paar Bugs aufspüren, die sich womöglich noch darin versteckt halten. Danach werde ich mich an einem Animationssystem versuchen. Dann sollte es vielleicht wieder etwas interessanter werden. Mit Videos und Screenshots und so. Aber das dürfte noch etwas dauern. Bis dahin gibt es sicherlich noch einen Eintrag mit der dann aktuellen Projektstatistik. Tschau Kakao!

Ernie-Script (I/II)

Montag, 29. Juni 2009

In der letzten Zeit habe ich mich darum bemüht, das Scripting-System mehr oder weniger fertigzustellen. Es funktioniert auch schon ganz hervorragend und die Sprache trägt den Namen Ernie-Script. Hahaha! Und zwar bekommt der Skriptschreiber keine Errors und Warnings an den Kopf geballert, sondern Ernies und Warnies, wenn er es nicht rafft, korrekt zu coden. Wie findet ihr das? Ich find’s geil! Ein ganz dicker Dank geht da an meinen Kollegen Milan “Marek” Karow, der die ausschlaggebende Idee hatte.

Die Sprache umfasst einige bekannte Schlüsselwörter mit vermutlich erwartungskonformer Bedeutung:

break continue do else elseif
false for function if repeat
return true until void while

Dann gibt es noch einige zusätzliche schlüsselwortartige Features wie zum Beispiel typeof, cast oder who. Was jedoch noch fehlt, ist die Möglichkeit, in einem Block lokale Variablen anzulegen, ohne globale Variablen zu überschreiben. Oder entsprechendes Gegenstück: Wenn auf globale Variablen zugegriffen werden soll, müssen diese entsprechend deklariert werden. Der Grund dafür, dass ich das noch nicht eingebaut habe, ist nämlich eben der, dass ich mich bislang noch nicht entscheiden konnte, welche dieser beiden Alternativen die geilere ist.

Neben den Schlüsselwörtern gibt es noch einige Operatoren, die ihr folgender Tabelle entnehmen könnt (nach Prioritäten sortiert):

Symbol Name Beispiel
. table entry selection obj.member
[] table entry selection obj[ expr ]
() function call foo( bar )

! not !expr
- unary minus -expr
+ unary plus +expr
& address of &obj
* dereference *ref

* multiply expr * expr
/ divide expr / expr
% modulo expr % expr

+ add expr + expr
- subtract expr – expr

< less than expr < expr
<= less than or equal expr <= expr
> greater than expr > expr
>= greater than or equal expr >= expr

== equal expr == expr
!= not equal expr != expr

&& logical and expr && expr

|| logical inclusive or expr || expr

^ logical exclusive or expr ^ expr

:= single assignment lvalue := expr

Habe ich was vergessen? Ich weiß es nicht. Achso: Bitweise and-, or- und xor-Operatoren werden bislang noch nicht unterstützt.

Für die meisten ist das jetzt vielleicht relativ uninteressant, aber in den näxten Tagen werde ich einen Download bereitstellen. Dann könnt ihr euch eine Testanwendung runterladen und selbst etwas mit Ernie-Script herumspielen.

Bis die Tage.

Shader- und Rendering-System (II/II)

Freitag, 19. Juni 2009

Na endlich, es ist soweit: Der zweite Teil über Shader- und Rendering-System ist fertig. Das hat nun aber wirklich lange auf sich warten lassen. Das lag vor allem daran, dass ich noch ein paar Probleme mit dem finalen Comic-Shader hatte. Zum Einen wollte ich zusätzlich zur Beleuchtung noch Schatteneffekte einbauen, aber das sieht bisher nicht wirklich toll aus. Insofern habe ich es jetzt doch erstmal rausgelassen. Zum Anderen werden beim Mischen der verschiedenen Material- und Beleuchtungsfarben auch die Alphawerte entsprechend gemischt. Das führte dazu, dass unter bestimmten Umständen der Alphawert gewisse Pixel transparent erscheinen ließ. Ein solches Resultat könnt ihr im folgenden Screenshot sehen:

Fehler in Shader

Um dem Problem entgegenzuwirken, muss entweder das “Alpha-Blending” komplett abgeschalten werden. Das führt jedoch dazu, dass keine transparenten Gegenstände mehr angezeigt werden können, bzw. solche Gegenstände würden halt einfach nicht transparent sondern komplett opak dargestellt (opak ist das Gegenteil von transparent). Oder aber im Shader wird der Fall abgefangen, dass sich die gemischten Farbinformationen auf die Alphawerte auswirken. Das kann jedoch — je nach Hardware — enorme Leistungseinbußen bedeuten. Dennoch ist die zweite Alternative die “bessere”, erlaubt sie schließlich weiterhin den Einsatz von transparenten Gegenständen.

Ein entsprechendes korrektes Resultat sieht dann ungefähr so aus:

Comic-Style-Shader

Ist doch schon recht hübsch, oder? Damit ihr euch ein noch besseres Bild machen könnt, gibt es noch eine kleine Anwendung zum Runterladen, bei der ihr euch das Cyber-Modell und den Comic-Style-Shader auf eurem eigenen Rechner reinziehen könnt. Falls es Probleme bei der Darstellung geben sollte, sagt mir bitte Bescheid. Aber ihr solltet die Minimalvoraussetzungen bezüglich Hard- und Software beachten:

  • 3D-beschleunigte Grafikkarte mit Shader-Modell 2.0
  • DirectX 9.0c

Aber entsprechende Fehlermeldungen bei Nichtvorhandensein der Voraussetzungen sollten in jenem Fall in der Log-Datei “logger.html” zu finden sein, die beim Starten der Anwendung erzeugt wird.

Tja, so viele Worte habe ich jetzt ja eigentlich gar nicht zu den technischen Aspekten von Shader- und Rendering-System verloren. Aber Screenshots und Downloads sollten für die meisten von euch ohnehin viel interessanter sein, denke ich. Darüber hinaus habe ich im ersten Teil ja bereits den technischen Aufbau erläutert. Hinzugekommen ist jetzt hauptsächlich noch der Szenegraph, der die komplette darzustellende Szene in kleine “Knoten” zerlegt, um diese Knoten nach Geometrie- und Materialeigenschaften sortieren zu können. Dadurch werden die einzelnen 3D-Modelle größtenteils zerpflückt. Das macht aber nix, denn im fertigen Bild ist das nicht zu sehen. Aber durch das Zerpflücken der 3D-Modelle und Sortieren der so erzeugten Knoten nach ihren Geometrie- und Materialeigenschaften werden Zustandswechsel der Grafikhardware minimiert. Diese Zustandswechsel sind nämlich maßgeblich von eben diesen Eigenschaften abhängig. Dieser durchaus gängige Ansatz  der Minimierung von Zustandswechsel der Grafikhardware bringt dann derbste Leistungsvorteile mit sich.