topical media & game development
Web3D/VR
shader(s) -- hsv
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.