media @ VU
[] readme course preface I 1 2 II 3 4 III 5 6 7 IV 8 9 10 V 11 12 afterthoughts appendix references examples resources _

talk show tell print

phl-hsv.phl


  // identity 
  float time=0;
  float sampleDist = 1.0f/512.0f;  // distance one pixel in u/v
  
  sampler2D image : register(s0);
  
  // Color-space conversion functions
  // from FX Composer 
  
  if 1
  define QUAD_REAL half
  define QUAD_REAL2 half2
  define QUAD_REAL3 half3
  define QUAD_REAL4 half4
  else
  define QUAD_REAL float
  define QUAD_REAL2 float2
  define QUAD_REAL3 float3
  define QUAD_REAL4 float4
  
  endif
  
  QUAD_REAL min_channel(QUAD_REAL3 v)
  {
          QUAD_REAL t = (v.x<v.y) ? v.x : v.y;
  	t = (tv.y) ? v.x : v.y;
          t = (t>v.z) ? t : v.z;
          return t;
  }
  
  QUAD_REAL3 rgb_to_hsv(QUAD_REAL3 RGB)
  {
      QUAD_REAL3 HSV = (0.0).xxx;
      QUAD_REAL minVal = min_channel(RGB);
      QUAD_REAL maxVal = max_channel(RGB);
      QUAD_REAL delta = maxVal - minVal;             //Delta RGB value 
      HSV.z = maxVal;
      if (delta != 0) {                    // If gray, leave H & S at zero
         HSV.y = delta / maxVal;
         QUAD_REAL3 delRGB;
         delRGB = ( ( ( maxVal.xxx - RGB ) / 6 ) + ( delta / 2 ) ) / delta;
         if      ( RGB.x == maxVal ) HSV.x = delRGB.z - delRGB.y;
         else if ( RGB.y == maxVal ) HSV.x = ( 1 / 3 ) + delRGB.x - delRGB.z;
         else if ( RGB.z == maxVal ) HSV.x = ( 2 / 3 ) + delRGB.y - delRGB.x;
         if ( HSV.x < 0 ) { HSV.x += 1; }
         if ( HSV.x > 1 ) { HSV.x -= 1; }
      }
      return (HSV);
  }
  
  QUAD_REAL3 hsv_to_rgb(QUAD_REAL3 HSV)
  {
      QUAD_REAL3 RGB = HSV.z;
      if ( HSV.y != 0 ) {
         QUAD_REAL var_h = HSV.x * 6;
         QUAD_REAL var_i = floor(var_h);             //Or ... var_i = floor( var_h )
         QUAD_REAL var_1 = HSV.z * (1 - HSV.y);
         QUAD_REAL var_2 = HSV.z * (1 - HSV.y * (var_h-var_i));
         QUAD_REAL var_3 = HSV.z * (1 - HSV.y * (1-(var_h-var_i)));
         if      (var_i == 0) { RGB = QUAD_REAL3(HSV.z, var_3, var_1); }
         else if (var_i == 1) { RGB = QUAD_REAL3(var_2, HSV.z, var_1); }
         else if (var_i == 2) { RGB = QUAD_REAL3(var_1, HSV.z, var_3); }
         else if (var_i == 3) { RGB = QUAD_REAL3(var_1, var_2, HSV.z); }
         else if (var_i == 4) { RGB = QUAD_REAL3(var_3, var_1, HSV.z); }
         else                 { RGB = QUAD_REAL3(HSV.z, var_1, var_2); }
     }
     return (RGB);
  }
  
  float4 main(
          float4 Pos : POSITION,
          float2 texCoord: TEXCOORD0) : COLOR 
  {
          QUAD_REAL4 img = tex2D(image, texCoord);
          
  
          // convert to gray 
          QUAD_REAL4 sum = QUAD_REAL4(rgb_to_hsv(img),img.a);
          sum.g=1; // fully saturate 
          sum.r+=time*0.5;
          
          //float quant=9;
            //sum.r  = floor(sum.r*quant+0.5)/quant;
          if (sum.r>1.0) sum.r-=1.0;
          
          
          sum = QUAD_REAL4(hsv_to_rgb(sum),img.a);
          
          //sum.a=img.a; // keep alpha
          return sum;
          //return lerp(img,sum,time);         
  }
  
  

[] readme course preface I 1 2 II 3 4 III 5 6 7 IV 8 9 10 V 11 12 afterthoughts appendix references examples resources _

(C) A. Eliëns 9/8/2006

You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.