Search Unity

Sprites/Diffuse with Hue shift

Discussion in 'Shaders' started by RavenTravelStudios, Feb 19, 2017.

  1. RavenTravelStudios

    RavenTravelStudios

    Joined:
    Oct 15, 2015
    Posts:
    100
    Hi guys, i worked on a sprite shader which can accept lights like the sprites/diffuse but including hue shift too.
    This is because i searched a lot for such a shader but never found exactly this specific effect. Its a very simple shader so you can extend it as you want.


    Code (CSharp):
    1.  
    2. Shader "Sprites/DefaultSprite" {
    3.     Properties{
    4.         _MainTex("Texture", 2D) = "white" {}
    5.         _HueShift("HueShift", Float) = 0
    6.     }
    7.         SubShader{
    8.         Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
    9.         ZWrite Off
    10.         Blend SrcAlpha OneMinusSrcAlpha
    11.         Cull Off
    12.         CGPROGRAM
    13.  
    14.         //#pragma surface surf Lambert
    15. #pragma surface surf Lambert alpha
    16. #pragma target 3.0
    17.  
    18.     float3 rgb_to_hsv_no_clip(float3 RGB)
    19.     {
    20.         float3 HSV;
    21.  
    22.         float minChannel, maxChannel;
    23.         if (RGB.x > RGB.y) {
    24.             maxChannel = RGB.x;
    25.             minChannel = RGB.y;
    26.         }
    27.         else {
    28.             maxChannel = RGB.y;
    29.             minChannel = RGB.x;
    30.         }
    31.  
    32.         if (RGB.z > maxChannel) maxChannel = RGB.z;
    33.         if (RGB.z < minChannel) minChannel = RGB.z;
    34.  
    35.         HSV.xy = 0;
    36.         HSV.z = maxChannel;
    37.         float delta = maxChannel - minChannel;             //Delta RGB value
    38.         if (delta != 0)
    39.         {                    // If gray, leave H  S at zero
    40.             HSV.y = delta / HSV.z;
    41.             float3 delRGB;
    42.             delRGB = (HSV.zzz - RGB + 3 * delta) / (6.0*delta);
    43.             if (RGB.x == HSV.z) HSV.x = delRGB.z - delRGB.y;
    44.             else if (RGB.y == HSV.z) HSV.x = (1.0 / 3.0) + delRGB.x - delRGB.z;
    45.             else if (RGB.z == HSV.z) HSV.x = (2.0 / 3.0) + delRGB.y - delRGB.x;
    46.         }
    47.         return (HSV);
    48.     }
    49.  
    50.     float3 hsv_to_rgb(float3 HSV)
    51.     {
    52.         float3 RGB = HSV.z;
    53.  
    54.         float var_h = HSV.x * 6;
    55.         float var_i = floor(var_h);   // Or ... var_i = floor( var_h )
    56.         float var_1 = HSV.z * (1.0 - HSV.y);
    57.         float var_2 = HSV.z * (1.0 - HSV.y * (var_h - var_i));
    58.         float var_3 = HSV.z * (1.0 - HSV.y * (1 - (var_h - var_i)));
    59.         if (var_i == 0) { RGB = float3(HSV.z, var_3, var_1); }
    60.         else if (var_i == 1) { RGB = float3(var_2, HSV.z, var_1); }
    61.         else if (var_i == 2) { RGB = float3(var_1, HSV.z, var_3); }
    62.         else if (var_i == 3) { RGB = float3(var_1, var_2, HSV.z); }
    63.         else if (var_i == 4) { RGB = float3(var_3, var_1, HSV.z); }
    64.         else { RGB = float3(HSV.z, var_1, var_2); }
    65.  
    66.         return (RGB);
    67.     }
    68.  
    69.     struct Input {
    70.         float2 uv_MainTex;
    71.     };
    72.  
    73.     sampler2D _MainTex;
    74.     float _HueShift;
    75.  
    76.     void surf(Input IN, inout SurfaceOutput o) {
    77.         o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
    78.  
    79.         float3 hsv = rgb_to_hsv_no_clip(o.Albedo.xyz);
    80.         hsv.x += _HueShift;
    81.      
    82.         o.Albedo = half3(hsv_to_rgb(hsv));
    83.         o.Alpha = tex2D(_MainTex, IN.uv_MainTex).a;
    84.     }
    85.  
    86.     ENDCG
    87.     }
    88.         Fallback "Diffuse"
    89. }
     
    Last edited: Feb 20, 2017
    biodam likes this.
  2. BoBo-san

    BoBo-san

    Joined:
    Jan 29, 2011
    Posts:
    11
    biodam and RavenTravelStudios like this.