HLSL-Shader
Die in der DiaShow verwendeten Shader für das Shaderobjekt sind in der High Level Shading Language (HLSL) verfasst. HLSL wurde von Microsoft für DirectX entwickelt.
Shader passend für das Shaderobjekt werden mit einigen Standardwerten bestückt.
Standardparameter
Falls ein Shader folgende Parameter (als uniform extern <Typ> <Name>
definiert) werden sie von der Diashow entsprechend zugewiesen.
gTime: float
- Vergangene Zeit in SekundengProgress: float
- Ein Zahlenwert der von 0 bis 1 über die Gesamtdauer des ShaderObjekts verläuft. Am Anfang ist er 0.0, am Ende 1.0gOpacity: float
- Deckkraft (0.0 = komplett Transparent (unsichtbar), 1.0 = komplett sichtbar, dazwischen = "halb"-transparent)
zusätzliche Parameter
Es können beliebige zusätzliche Parameter im Shader definiert werden (entsprechend dem HLSL-Standard). Diese Parameter können über die Scriptfunktionen (SetParamXXX
) des Shaderobjekts bestückt werden.
Texturen im Shader
Das Shaderobjekt stellt für jede Spur bzw. für den Hintergrund eine eigene Textur bereit. Diese stehen im Shader unter gTexture0 bis gTexture<N> zur Verfügung. Es hängt von der Grafikkarte bzw. des Verwendeten ShaderModels ab, wieviele Texturen gleichzeitig in einem Shader verwendet werden können.
gTexture0: texture
- erste TexturgTexture1: texture
- zweite Textur- etc.
RenderTargets im Shader
Multipass-Shader
Minimaler Shader: minimal.fx
Dieser minimale Shader tut nichts weiter, als das Bild so wie es ist darzustellen.
uniform extern float4x4 gWVP : WorldViewProjection; // Transformationsmatrix, die angewendet werden muss
uniform extern texture gTexture0; // erste Textur
sampler Texture0Sampler = sampler_state
{
Texture = <gTexture0>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
AddressU = MIRROR;
AddressV = MIRROR;
};
struct OutputVS
{
float4 posH: POSITION0;
float2 tex0: TEXCOORD0;
};
// Vertex-Shader transformiert die Punkte in der 3D-Geometrie
OutputVS mainVS(float3 pos : POSITION, float2 tex0: TEXCOORD0) {
OutputVS outVS;
outVS.tex0 = tex0.xy; // Texturekoordinaten übergeben
outVS.posH = mul(float4(pos.xyz, 1.0), gWVP); // Vertexkoordinaten transformieren. Das ist wichtig!
return outVS;
}
// Pixel-Shader berechnet die konkreten Farbwerte für einen Pixel
float4 mainPS(float2 tex0: TEXCOORD0) : COLOR {
return tex2D(Texture0Sampler, tex0);
}
technique technique0 {
pass p0 {
VertexShader = compile vs_2_0 mainVS();
PixelShader = compile ps_2_0 mainPS();
CullMode = None;
FillMode = Solid;
}
}