Ich möchte Euch heute ein Programm vorstellen welches ich mit meiner MP3D Lib erstellt habe. Es ist damit möglich Pixelshader zu erstellen und zu testen. Die erzeugten Pixelshader können dann mit der MP3D Lib verwendet werden. Man kann mit der MP3D Lib den Shader kompilieren und Ihn dann dauerhaft verwenden. Die Ausführungsgeschwindigkeit ist abhängig von der Grafikkarte. Ein Bild mit 1024 * 1024 Punkte 16 Bit dauert bei mir im Durchschnitt 3 ms. Ich habe Euch schon mal 54 Shader zum Testen beigelegt . Die Stärke der Shader ist u-a. auch die Echtzeitveränderungen (welche ich aber derzeit in diesem Programm noch nicht integriert habe). Der Hilfebutton hat noch keine Funktion. Wer hat Lust eine Hilfe zu schrieben und mir z.B. als Code zuzusenden (z.B. Messagerequester)?
PixelShadererstellungsprogramm
http://em.q-soft.ch/files/get/O4YMiXohg ... shader.zip
Hier eine kleine Einführung. Das Programm kann zwei Grafiken laden die als TextureA und TextureB bezeichnet werden. Weiter gibt es drei Variable Var1.f, Var2.f und Var3.f welche über Slider gesteuert werden können. Der Wertebereich geht hier von 0-1 (Float) und voreingestellt ist 0.5 (Mitte)
Beispielshader:
Erstellung eines Shaders: Dieser wird in Textform geschrieben und entspricht der C Sprache
1) Übergabe der Variablen
Code: Alles auswählen
texture TextureA;
Code: Alles auswählen
float Var1;
2) Behandlung der Textur innerhalb des des Shaders
Code: Alles auswählen
sampler Sampler1 = sampler_state
{
texture = <TextureA>;
AddressU = Clamp;
AddressV = Clamp;
MipFilter = None;
MagFilter = None;
MinFilter = None;
};
3) Funktion invers
Code: Alles auswählen
float4 PSInverse(float2 Tex : TEXCOORD0) : COLOR
{
return 1.0f - tex2D(Sampler1, Tex);
}
float2 Tex : TEXCOORD0 -> Doublefloat entspricht den Texturkoordinaten. Hier muss man nicht mühselig
eine for next schleife schreiben
return 1.0f - tex2D(Sampler1, Tex); -> Texturrückgabe heißt der Farbwert von rgba entspricht
255,255,255,255 und wird mit den negativen wirklichen Farbwerten der der Textur subtrahiert
3) Funktion Helligkeit
Beispiel für Heligkeitshader
Code: Alles auswählen
return tex2D(Sampler1, Tex)*Var1*2;
4) Ausführen der Funktion
Code: Alles auswählen
technique t1
{
pass p1
{
PixelShader = compile ps_2_0 PSInverse();
}
}
pass p1 -> Anzahl der durchläufe p1 = 1. Bei komplexeren Shadern hat man verschiedene Schleifen/Schritte und benötigt dann mehrere Durchläufe
PixelShader = compile ps_2_0 PSInverse(); -> Je nach Grafikkarte kann man mehr und komplexere Befehle verwenden
Hier der fertige Shader um eine Textur zu invertieren
Fertiger Shader
Code: Alles auswählen
texture TextureA;
sampler Sampler1 = sampler_state
{
texture = <TextureA>;
};
float4 PSInverse(float2 Tex : TEXCOORD0) : COLOR
{
return 1 - tex2D(Sampler1, Tex);
}
technique t1
{
pass p1
{
PixelShader = compile ps_2_0 PSInverse();
}
}