Помогите с Hue Shift in Pixel Shader

Шейдеры и все-все-все.

Помогите с Hue Shift in Pixel Shader

Сообщение [bm] 25 май 2010, 15:17

Кто бы смог переписать шейдер http://nokola.com/blog/post/2010/02/09/ ... ht%29.aspx для юнити?
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: Помогите с Hue Shift in Pixel Shader

Сообщение gnoblin 09 окт 2010, 06:10

Не знаю, актуально или нет.
Проверял в тройке, че-то работает :).
Единственный моментик - нужна поддерка shader model 3.0, юнити ругалась про ограничение на кол-во инструкций (не обладаю кунфу по оптимизации, буду рад если кто-то подпилит для 2.0).
Вроде бы единственное место, где я чуть-чуть изменил код
Код: Выделить всё
o.Albedo = half3(hsv_to_rgb(hsv));
, тут должно было быть что-то типа
Код: Выделить всё
o.Albedo = float4(hsv_to_rgb(hsv),o.Albedo.w);
, но если писать второй вариант то есть ошибка про некорректное преобразование типов (т.е. тут может быть ошибка в реализации, хз как сделать лучше).

Синтаксис:
Используется glsl
Shader "GnobTests/HueShift" {
    Properties {
      _MainTex ("Texture", 2D) = "white" {}
      _HueShift("HueShift", Float) = 0
    }
    SubShader {
      Tags { "RenderType" = "Opaque" }
      CGPROGRAM
      #pragma surface surf Lambert
          #pragma target 3.0
float3 rgb_to_hsv_no_clip(float3 RGB)
{
    float3 HSV;
   
 float minChannel, maxChannel;
 if (RGB.x > RGB.y) {
  maxChannel = RGB.x;
  minChannel = RGB.y;
 }
 else {
  maxChannel = RGB.y;
  minChannel = RGB.x;
 }
 
 if (RGB.z > maxChannel) maxChannel = RGB.z;
 if (RGB.z < minChannel) minChannel = RGB.z;
   
    HSV.xy = 0;
    HSV.z = maxChannel;
    float delta = maxChannel - minChannel;             //Delta RGB value
    if (delta != 0) {                    // If gray, leave H & S at zero
       HSV.y = delta / HSV.z;
       float3 delRGB;
       delRGB = (HSV.zzz - RGB + 3*delta) / (6.0*delta);
       if      ( RGB.x == HSV.z ) HSV.x = delRGB.z - delRGB.y;
       else if ( RGB.y == HSV.z ) HSV.x = ( 1.0/3.0) + delRGB.x - delRGB.z;
       else if ( RGB.z == HSV.z ) HSV.x = ( 2.0/3.0) + delRGB.y - delRGB.x;
    }
    return (HSV);
}

        float3 hsv_to_rgb(float3 HSV)
        {
                float3 RGB = HSV.z;
           
                   float var_h = HSV.x * 6;
                   float var_i = floor(var_h);   // Or ... var_i = floor( var_h )
                   float var_1 = HSV.z * (1.0 - HSV.y);
                   float var_2 = HSV.z * (1.0 - HSV.y * (var_h-var_i));
                   float var_3 = HSV.z * (1.0 - HSV.y * (1-(var_h-var_i)));
                   if      (var_i == 0) { RGB = float3(HSV.z, var_3, var_1); }
                   else if (var_i == 1) { RGB = float3(var_2, HSV.z, var_1); }
                   else if (var_i == 2) { RGB = float3(var_1, HSV.z, var_3); }
                   else if (var_i == 3) { RGB = float3(var_1, var_2, HSV.z); }
                   else if (var_i == 4) { RGB = float3(var_3, var_1, HSV.z); }
                   else                 { RGB = float3(HSV.z, var_1, var_2); }
           
           return (RGB);
        }

      struct Input {
          float2 uv_MainTex;
      };
      sampler2D _MainTex;
      float _HueShift;
      void surf (Input IN, inout SurfaceOutput o) {
          o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
         
                  float3 hsv = rgb_to_hsv_no_clip(o.Albedo.xyz);
                  hsv.x+=_HueShift;
                 
                  if ( hsv.x > 1.0 ) { hsv.x -= 1.0; }
                  o.Albedo = half3(hsv_to_rgb(hsv));

      }
     
      ENDCG
    }
    Fallback "Diffuse"
  }
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Помогите с Hue Shift in Pixel Shader

Сообщение [bm] 09 окт 2010, 20:46

Спасибо, попробую. Делал HUE я при помощи http://www.unifycommunity.com/wiki/inde ... e=HSBColor
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: Помогите с Hue Shift in Pixel Shader

Сообщение gnoblin 09 окт 2010, 23:03

Я на офе еще видел HSL, вроде более интересная штука.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Помогите с Hue Shift in Pixel Shader

Сообщение gnoblin 21 окт 2010, 17:32

На википедии прочитал что HSB == HSV :)
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1