Shader "ubu/processing/pix_rgb_matrix"
{
   Properties
   {
      [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
      _v0 ("v0",Vector) = (0,0,0,0)
      _v1 ("v1",Vector) = (0,0,0,0)
      _v2 ("v2",Vector) = (0,0,0,0)
      _v3 ("v3",Vector) = (0,0,0,0)
      _exp ("Exponent",Vector) = (1,1,1,1)
      _order ("Order",Integer) = 0
   }
   SubShader
   {
      // No culling or depth
      Cull Off ZWrite Off ZTest Always

      Pass
      {
         CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag

         #include "UnityCG.cginc"

         struct appdata
         {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
         };

         struct v2f
         {
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
         };

         v2f vert (appdata v)
         {
            v2f o;
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.uv = v.uv;
            return o;
         }

         sampler2D _MainTex;
         float4 _v0;
         float4 _v1;
         float4 _v2;
         float4 _v3;
         float4 _exp;
         int _order;

         fixed4 frag (v2f i) : SV_Target
         {
            float4 s = tex2D(_MainTex, i.uv);

            if( _order == 1 )
               s.rgb = pow( max(0.0,s.rgb), _exp.rgb );

            float4x4 mtx = float4x4( _v0, _v1, _v2, _v3 );
            s = mul( mtx, s );

            if( _order == 2 )
               s.rgb = pow( max(0.0,s.rgb), _exp.rgb );

            return s;
         }
         ENDCG
      }
   }
}
