色相偏移 Shader 的实现思路可以分为以下几个步骤:
1. 获取原始颜色值
在 Shader 中,需要获取原始颜色的 RGB 值。可以使用 Unity 内置的变量 `fixed4 frag (v2f i) : SV_Target` 来获取像素点的颜色。
2. 将 RGB 值转换为 HSV 值
将 RGB 值转换为 HSV 值可以使用一些常见的算法,例如下面这段代码:
- float3 RGBtoHSV (float3 c)
- {
- float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
- float4 p = mix(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g));
- float4 q = mix(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r));
-
- float d = q.x - min(q.w, q.y);
- float e = 1.0e-10;
- return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
- }
复制代码
其中 `c` 为 RGB 值,返回值为 HSV 值。
3. 修改 HSV 值的 H 分量
将得到的 HSV 值的 H 分量加上一个偏移量即可。可以通过 Shader 属性来传递偏移量,例如:
- Properties
- {
- _HueShift ("色相偏移", Range(-180, 180)) = 0
- }
- SubShader
- {
- Pass
- {
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- // ...
- uniform float _HueShift;
- // ...
- fixed4 frag (v2f i) : SV_Target
- {
- // ...
- hsv.x += _HueShift / 360.0;
- // ...
- return fixed4(hsv_to_rgb(hsv), c.a);
- }
- // ...
- }
- }
复制代码
这样就可以通过修改 `_HueShift` 属性来控制色相的偏移了。
4. 将 HSV 值转换回 RGB 值
最后需要将得到的 HSV 值转换回 RGB 值,可以使用下面这段代码:
- float3 hsv_to_rgb (float3 c)
- {
- float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
- float3 p = abs(fmod(c.xxx + K.xyz, 1.0));
- float3 q = abs(fmod(c.xxx + K.yzw, 1.0));
- float3 t = fmin(p, q);
- float3 rgb = c.z * lerp(t, fmax(p, q), 6.0 * t - 1.0);
- return rgb;
- }
复制代码
这样实现的色相偏移 Shader 可以应用在任何需要修改色相的场景中,例如调整角色服装颜色、增加游戏氛围等。 |