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 Sekunden
  • gProgress: float - Ein Zahlenwert der von 0 bis 1 über die Gesamtdauer des ShaderObjekts verläuft. Am Anfang ist er 0.0, am Ende 1.0
  • gOpacity: 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 Textur
  • gTexture1: 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;
  }
}