How To Apply Shaders

From GameStudio Wiki

Jump to: navigation, search

German version

Shader für Gamestudio können in HLSL (High Level Shading Language) und in ASM (Assembler) geschrieben werden. Seit den ersten Shadern unter DirectX 8.0 und den jetzigen unter DirectX 9.0c und DirectX 10 gab es auch einige Änderungen, weshalb für DirectX 8.0 erstellte Shader mit den aktuellen DirectX Versionen nicht mehr funktionieren und natürlich auch andersherum. Diese können nur mit GS Versionen unter A6.31.4 (nicht mehr mit dieser!) genutzt werden.

Es gibt auch noch Effekte, die die Fixed Function Pipeline (kurz: FFP) nutzen. Dies sind keine Shader und funktionieren teilweise auch auf Hardware, die keine Shader unterstützt. Um Shader mit GS nutzen zu können wird die kommerzielle oder die professionelle Version benötigt. FFP Effekte funktionieren auch mit Extra!

Außerdem gibt es Shader, die pro Modell angewendet werden (Normalmapping, Wasser, ...) und welche, die das gesammte Bild beeinflussen (Bloom, Schwarz-Weiß, Hitzeflimmern, Tiefenunschärfe, ...). Erstere greifen direkt in den Renderingprozess der Modelle ein, wobei zweitere das schon fertig gerenderte Bild nachbearbeiten (Postprocessing).

Das Nutzen von all diesen Effekten funktioniert vom Prinzip her immer gleich. Allerdings gibt es auch hier je nach Effekt, GS Version und verwendeter "Scriptsprache" (C-Script/Lite-C) einige Variationen.

Grundsätzlich ist es so, dass eine .fx Datei oder zumindest der Shadercode vorliegt:

Erstelle zunächst eine neue, leere Datei im SED und speichere diese unter dem Namen "Shader.wdl" (C-Script) oder "Shader.c" (Lite-C) in deinem Projektordner ab. Am Anfang deiner "Mainscriptdatei" musst du dann diese neue Datei dem Compiler zum compilieren hinzufügen. Dies funktioniert unter C-Script durch die Zeile:

	include <Shader.wdl>;

und in Lite-C mit:

	#include "Shader.c"

In die neu erstellte Datei kommt nun eine Material-Definition hinein und anschließend wird dieses Material dem Modell auf dem du den Shader nutzen möchtest oder auch der Kamera zugeordnet. Für die Material-Definition gibt es zwei Möglichkeiten:

1. Du hast nur den Shadercode der nicht mehr als 10000 Zeichen hat und hälst es nicht für nötig eine .fx Datei zu erstellen:

(C-Script):

//Erster Fall: Du hast einen Shader-Code zum direkten einbinden
material diesesMaterialBekommtDenShaderZugewiesen
{
	effect =
	"
		//hier den shader-code einfügen
	";
}


(Lite-C):

//Erster Fall: Du hast einen Shader-Code zum direkten einbinden
MATERIAL* diesesMaterialBekommtDenShaderZugewiesen =
{
	effect =
	"
		//hier den shader-code einfügen
	";
}


2. Der Shadercode hat mehr als 10000 Zeichen oder du hälst es für sauberer den Shadercode von deinem Script zu trennen.

In diesem Fall solltest du sofern noch nicht vorhanden eine neue .fx Datei erstellen. Dazu in SED einfach auf "File -> New", den Shadercode einfügen und es unter beliebiegem Namen mit der Endung .fx, die per Hand eingegeben werden muss, abspeichern.

(C-Script):

//Zweiter Fall: Du hast eine .fx-Datei
material diesesMaterialBekommtDenShaderZugewiesen
{
	effect = "diefxdatei.fx";
}


(Lite-C):

//Zweiter Fall: Du hast eine .fx-Datei
MATERIAL* diesesMaterialBekommtDenShaderZugewiesen =
{
	effect = "diefxdatei.fx";
}


Dann benötigst du nurnoch die action, die später in WED deinem Modell zugewiesen werden muss:

//Für beide Fälle gleich (muss _unter_ der material-Definition stehen!)
action dieAction  //wird im WED dem Modell zugewiesen
{
	my.material = diesesMaterialBekommtDenShaderZugewiesen;
}

English version

Here's an -hopefully clear enough- explanation on how to apply a shader to a model.

//First case: You've got shader code directly from the forum (i.e. copied and pasted)
material thisMaterialWillGetTheShader { effect = " //insert shader code here "; }
//Second case: You've got an .fx file
material thisMaterialWillGetTheShader { effect = "thefxfile.fx"; }
//Equal for both cases (this has to be placed _under_ the material definition in your script!)
action theAction //will be assigned to the model in WED { my.material = thisMaterialWillGetTheShader; }

As should be obvious due to the especially innovative names I gave the materials, actions etc., the only thing left now is to assign the action to the model and everything should work the way it is supposed to. If the shader needs skins other than the entity skins, it will need material skins. You can implement those by adding these lines to your material definition:

 skin1 = someBitmap;
 skin2 = anotherBitmap;

In this case though, the following addition has to be placed above the material definition:

 bmap someBitmap = "bitmapfile.bmp";
 bmap anotherBitmap = "bitmapfile2.bmp";

Tips & Hints

When you copy and paste shader code make sure the copy is encoded with ASCII! This is especially important for people with non-English OS. Your copy may be encoded with UTF-8 or something else that looks exactly like ASCII, but will not compile. One way to may sure is to copy into a program like UltraEdit and select file -> conversions -> UTF-8 to ASCII.

Personal tools