Shader 101: XNA FX-Files

FX-Files oder Effect-Files sind in XNA Dateien, die den Sourcecode eines Shaders und einer Technique enthalten und von der Content-Pipeline verarbeitet werden. Die Content-Pipeline kümmert sich dabei um das kompilieren und optimieren.

In diesem kurzen Artikel möchte ich euch zeigen, wie der grundlegende Aufbau einer Effekt-Datei in XNA aussieht und was man damit so alles anstellen kann. Dies ist natürlich eine Grundvoraussetzung für alle weiteren Tutorials und Mini-Tutorials über Shader.

Um eure Geduld nicht zu sehr zu strapazieren, geht es direkt ans Eingemachte. Hier mal das Grundgerüst einer FX-Datei (die nichts macht und so auch nicht kompilierbar ist).

float4x4 World;
float4x4 View;
float4x4 Projection;

struct VertexShaderInput
{
};

struct VertexShaderOutput
{
};

VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
}

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
}

technique Technique1
{
    pass Pass1
    {
        VertexShader = compile vs_1_1 VertexShaderFunction();
        PixelShader = compile ps_1_1 PixelShaderFunction();
    }
}

Wer aufgepasst hat, der erkennt sofort, dass es sich hierbei um das Default-Template des XNA-GameStudio für einen Effekt handelt. Um die Übersicht zu erhöhen, habe ich mir erlaubt die Funktionsrümpfe und Kommentare zu entfernen. Dazu später noch mehr.

In den ersten drei Zeilen werden Matrizen-Parameter (16 floats, daher float4x4) deklariert. Dies sind die Parameter, die später in der Draw-Methode vor der Verwendung des Effektes gesetzt werden können bzw. müssen (über die Parameters-Eigenschaft).

In den Zeilen 05-07, sowie 09-11 werden Strukturen definiert. Dies funktioniert genau so, wie es auch in C# funktioniert, nur das es hier keine Konstruktoren, Destruktoren und Properties gibt. Eine Struktur in einem HLSL-Shader ist ganz einfach eine Ansammlung von Variablen.

Eine Übersicht über alle verwendbaren Datentypen in einem HLSL-Shader findet sich übrigens in der MSDN.

In den Zeilen 13-15 und 17-19 werden zwei ausführbare Funktionen deklariert. Dieses hier sind spezielle, aber vom grundlegenden Aufbau her genau so, wie jede andere Funktion in HLSL ebenfalls. Sie sind speziell, weil es die beiden Einstiegspunkte sind. Wie die Namen schon sagen, handelt es sich hierbei um den Pixel- und den Vertex-Shader.

In Zeile 21 wird eine Technik definiert. Dies ist sehr interessant, denn in einem Effect-File kann man unterschiedliche Techniken erzeugen. Dies sind Kombinationen aus einem oder mehreren Durchgängen (Passes), die jeweils einen Vertex- und/oder Pixel-Shader enthalten. Es ist damit z.B. möglich, in einer einzigen Effekt-Datei Techniken für PerPixel-Beleuchtung und Vertex-Beleuchtung, sowie ohne Beleuchtung zu definieren. Auf diese unterschiedlichen Techniken kann man später in XNA mittels der Eigenschaft Techniques und CurrentTechnique zugreifen bzw. diese festlegen.

In Zeile 23 wird unserer Technik ein Pass zugewiesen. Ein Pass besteht aus unterschiedlichen RenderStates (wie diese in einem Shader festgelegt werden, erkläre ich in einem anderen Artikel) und aus einem Vertex- und Pixel-Shader, die in diesem Fall in den Zeilen 25 und 26 festgelegt werden.

Warum gibt es nun diese Passes? Diese werden verwendet, wenn mehr als ein Render-Durchgang verwendet werden muss. Aufgrund der maximalen Anzahl von Befehlen (und anderen Einschränkungen), die ein Shader enthalten kann, ist es z.B. für eine größere Menge von Lichtern notwendig, dass diese in mehreren Durchgängen gerendert werden. Auch bei einem Blur kann dies interessant sein. Wenn man einen Blur auf zwei Durchgänge aufteilt (erst horizontal, dann vertikal, oder umgekehrt), dann spart man sich eine Menge Berechnungen. Dies sind aber oft sehr fortgeschrittene Techniken, die der Anfänger oft nicht benötigt.

Dies sollte für den Einstieg reichen. Ihr kennt jetzt den grundlegenden Aufbau einer Effekt-Datei. In weiteren Artikeln werde ich nun unterschiedliche Arten von Shadern vorstellen und den ein oder anderen Hilfreichen Tipp und Befehl vorstellen. Als Startpunkt dient dabei immer der Einstiegsartikel: Shader 101: Grundlagen.

Advertisements

Veröffentlicht am 26.04.2011 in Grundlagen, Shader, XNA und mit , , , , , getaggt. Setze ein Lesezeichen auf den Permalink. 2 Kommentare.

  1. Roland Pfletschinger

    genial, toll, sach ich, was will man mehr :))

  1. Pingback: Shader 101: Grundlagen « "Mit ohne Haare"

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: