topical media & game development

talk show tell print

Web3D/VR

shader(s) -- hsv


  // 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.xv.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);	 
  }
  
  
  
  


(C) Æliens 20/08/2009

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.