/** @file BildStandard.shader
 * Shader-Quelltext für den einfachsten Bildeffekt im Spiel: nur allgemeine Verzerreffekte
 */

struct VertexEingabe
{
  float3 mPosition : POSITION0;
  float2 mTexKoords : TEXCOORD0;
};

struct VertexAusgabe
{
  float4 mPosition : POSITION0;
  float2 mTexKoords : TEXCOORD0;
  float2 mVertexPos : TEXCOORD1;
};

// Bild und Offsettextur als Eingabetexturen
sampler2D TexBild, TexZerr;
float2 gBildOffset, gZerrOffset; /// Werte sind 1.0f / Texelgröße

// Offset auf die Ausgabeposition, um genau die DX9-Pixelmitten zu erwischen. Werte sind 1.0f/Pixelgröße
float2 gAusgabeOffset;

// Parameter
float4 gParam = float4( 0.0f, 1.0f, 1.0f, 1.0f);

// *************** Verzerrung ******************
// ------------------------------------------------------------------------------------------------
// VertexShader für den Verzerr-Effekt
VertexAusgabe VertexMain( const VertexEingabe rein)
{
  VertexAusgabe raus;

  raus.mPosition = float4( rein.mPosition, 1.0f) + float4( -1.0f, 1.0f, 0.0f, 0.0f) * gAusgabeOffset.xyxy;
  raus.mTexKoords = rein.mTexKoords;
  raus.mVertexPos = rein.mPosition.xy;
  return raus;
}

// ------------------------------------------------------------------------------------------------
// PixelShader zerrt 
float4 PixelMain( const VertexAusgabe rein) : COLOR0
{
  // Verzerr-Offset lesen
  float4 zerr = tex2D( TexZerr, rein.mTexKoords) * 2.0f - 1.0f;
  float2 tx = rein.mTexKoords + zerr * 32.0f * gBildOffset.xy;
  float4 farbe = tex2D( TexBild, tx);

  float hell = dot( farbe.rgb, float3( 0.35f, 0.53f, 0.12f)) + 0.0001f;
  farbe.rgb = lerp( farbe.rgb, hell.xxx, gParam.x);

  return farbe;
 }
