| | |
| | | Shader "Hidden/Post FX/UI/Trackball" |
| | | { |
| | | CGINCLUDE |
| | | |
| | | #include "UnityCG.cginc" |
| | | |
| | | #define PI 3.14159265359 |
| | | #define PI2 6.28318530718 |
| | | |
| | | float _Offset; |
| | | float _DisabledState; |
| | | float2 _Resolution; // x: size, y: size / 2 |
| | | |
| | | float3 HsvToRgb(float3 c) |
| | | { |
| | | float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); |
| | | float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); |
| | | return c.z * lerp(K.xxx, saturate(p - K.xxx), c.y); |
| | | } |
| | | |
| | | float4 CreateWheel(v2f_img i, float crossColor, float offsetColor) |
| | | { |
| | | const float kHueOuterRadius = 0.45; |
| | | const float kHueInnerRadius = 0.38; |
| | | const float kLumOuterRadius = 0.495; |
| | | const float kLumInnerRadius = 0.48; |
| | | |
| | | float4 color = (0.0).xxxx; |
| | | float2 uvc = i.uv - (0.5).xx; |
| | | float dist = sqrt(dot(uvc, uvc)); |
| | | float delta = fwidth(dist); |
| | | float angle = atan2(uvc.x, uvc.y); |
| | | |
| | | // Cross |
| | | { |
| | | float radius = (0.5 - kHueInnerRadius) * _Resolution.x + 1.0; |
| | | float2 pixel = (_Resolution.xx - 1.0) * i.uv + 1.0; |
| | | |
| | | float vline = step(floor(fmod(pixel.x, _Resolution.y)), 0.0); |
| | | vline *= step(radius, pixel.y) * step(pixel.y, _Resolution.x - radius); |
| | | |
| | | float hline = step(floor(fmod(pixel.y, _Resolution.y)), 0.0); |
| | | hline *= step(radius, pixel.x) * step(pixel.x, _Resolution.x - radius); |
| | | |
| | | color += hline.xxxx * (1.0).xxxx; |
| | | color += vline.xxxx * (1.0).xxxx; |
| | | color = saturate(color); |
| | | color *= half4((crossColor).xxx, 0.05); |
| | | } |
| | | |
| | | // Hue |
| | | { |
| | | float alphaOut = smoothstep(kHueOuterRadius - delta, kHueOuterRadius + delta, dist); |
| | | float alphaIn = smoothstep(kHueInnerRadius - delta, kHueInnerRadius + delta, dist); |
| | | |
| | | float hue = angle; |
| | | hue = 1.0 - ((hue > 0.0) ? hue : PI2 + hue) / PI2; |
| | | float4 c = float4(HsvToRgb(float3(hue, 1.0, 1.0)), 1.0); |
| | | color += lerp((0.0).xxxx, c, alphaIn - alphaOut); |
| | | } |
| | | |
| | | // Offset |
| | | { |
| | | float alphaOut = smoothstep(kLumOuterRadius - delta, kLumOuterRadius + delta, dist); |
| | | float alphaIn = smoothstep(kLumInnerRadius - delta, kLumInnerRadius + delta / 2, dist); |
| | | float4 c = float4((offsetColor).xxx, 1.0); |
| | | |
| | | float a = PI * _Offset; |
| | | if (_Offset >= 0 && angle < a && angle > 0.0) |
| | | c = float4((1.0).xxx, 0.5); |
| | | else if (angle > a && angle < 0.0) |
| | | c = float4((1.0).xxx, 0.5); |
| | | |
| | | color += lerp((0.0).xxxx, c, alphaIn - alphaOut); |
| | | } |
| | | |
| | | return color * _DisabledState; |
| | | } |
| | | |
| | | float4 FragTrackballDark(v2f_img i) : SV_Target |
| | | { |
| | | return CreateWheel(i, 1.0, 0.15); |
| | | } |
| | | |
| | | float4 FragTrackballLight(v2f_img i) : SV_Target |
| | | { |
| | | return CreateWheel(i, 0.0, 0.3); |
| | | } |
| | | |
| | | ENDCG |
| | | |
| | | SubShader |
| | | { |
| | | Cull Off ZWrite Off ZTest Always |
| | | |
| | | // (0) Dark skin |
| | | Pass |
| | | { |
| | | CGPROGRAM |
| | | |
| | | #pragma vertex vert_img |
| | | #pragma fragment FragTrackballDark |
| | | |
| | | ENDCG |
| | | } |
| | | |
| | | // (1) Light skin |
| | | Pass |
| | | { |
| | | CGPROGRAM |
| | | |
| | | #pragma vertex vert_img |
| | | #pragma fragment FragTrackballLight |
| | | |
| | | ENDCG |
| | | } |
| | | } |
| | | } |
| | | Shader "Hidden/Post FX/UI/Trackball"
|
| | | {
|
| | | CGINCLUDE
|
| | |
|
| | | #include "UnityCG.cginc"
|
| | |
|
| | | #define PI 3.14159265359
|
| | | #define PI2 6.28318530718
|
| | |
|
| | | float _Offset;
|
| | | float _DisabledState;
|
| | | float2 _Resolution; // x: size, y: size / 2
|
| | |
|
| | | float3 HsvToRgb(float3 c)
|
| | | {
|
| | | float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
|
| | | float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www);
|
| | | return c.z * lerp(K.xxx, saturate(p - K.xxx), c.y);
|
| | | }
|
| | |
|
| | | float4 CreateWheel(v2f_img i, float crossColor, float offsetColor)
|
| | | {
|
| | | const float kHueOuterRadius = 0.45;
|
| | | const float kHueInnerRadius = 0.38;
|
| | | const float kLumOuterRadius = 0.495;
|
| | | const float kLumInnerRadius = 0.48;
|
| | |
|
| | | float4 color = (0.0).xxxx;
|
| | | float2 uvc = i.uv - (0.5).xx;
|
| | | float dist = sqrt(dot(uvc, uvc));
|
| | | float delta = fwidth(dist);
|
| | | float angle = atan2(uvc.x, uvc.y);
|
| | |
|
| | | // Cross
|
| | | {
|
| | | float radius = (0.5 - kHueInnerRadius) * _Resolution.x + 1.0;
|
| | | float2 pixel = (_Resolution.xx - 1.0) * i.uv + 1.0;
|
| | |
|
| | | float vline = step(floor(fmod(pixel.x, _Resolution.y)), 0.0);
|
| | | vline *= step(radius, pixel.y) * step(pixel.y, _Resolution.x - radius);
|
| | |
|
| | | float hline = step(floor(fmod(pixel.y, _Resolution.y)), 0.0);
|
| | | hline *= step(radius, pixel.x) * step(pixel.x, _Resolution.x - radius);
|
| | |
|
| | | color += hline.xxxx * (1.0).xxxx;
|
| | | color += vline.xxxx * (1.0).xxxx;
|
| | | color = saturate(color);
|
| | | color *= half4((crossColor).xxx, 0.05);
|
| | | }
|
| | |
|
| | | // Hue
|
| | | {
|
| | | float alphaOut = smoothstep(kHueOuterRadius - delta, kHueOuterRadius + delta, dist);
|
| | | float alphaIn = smoothstep(kHueInnerRadius - delta, kHueInnerRadius + delta, dist);
|
| | |
|
| | | float hue = angle;
|
| | | hue = 1.0 - ((hue > 0.0) ? hue : PI2 + hue) / PI2;
|
| | | float4 c = float4(HsvToRgb(float3(hue, 1.0, 1.0)), 1.0);
|
| | | color += lerp((0.0).xxxx, c, alphaIn - alphaOut);
|
| | | }
|
| | |
|
| | | // Offset
|
| | | {
|
| | | float alphaOut = smoothstep(kLumOuterRadius - delta, kLumOuterRadius + delta, dist);
|
| | | float alphaIn = smoothstep(kLumInnerRadius - delta, kLumInnerRadius + delta / 2, dist);
|
| | | float4 c = float4((offsetColor).xxx, 1.0);
|
| | |
|
| | | float a = PI * _Offset;
|
| | | if (_Offset >= 0 && angle < a && angle > 0.0)
|
| | | c = float4((1.0).xxx, 0.5);
|
| | | else if (angle > a && angle < 0.0)
|
| | | c = float4((1.0).xxx, 0.5);
|
| | |
|
| | | color += lerp((0.0).xxxx, c, alphaIn - alphaOut);
|
| | | }
|
| | |
|
| | | return color * _DisabledState;
|
| | | }
|
| | |
|
| | | float4 FragTrackballDark(v2f_img i) : SV_Target
|
| | | {
|
| | | return CreateWheel(i, 1.0, 0.15);
|
| | | }
|
| | |
|
| | | float4 FragTrackballLight(v2f_img i) : SV_Target
|
| | | {
|
| | | return CreateWheel(i, 0.0, 0.3);
|
| | | }
|
| | |
|
| | | ENDCG
|
| | |
|
| | | SubShader
|
| | | {
|
| | | Cull Off ZWrite Off ZTest Always
|
| | |
|
| | | // (0) Dark skin
|
| | | Pass
|
| | | {
|
| | | CGPROGRAM
|
| | |
|
| | | #pragma vertex vert_img
|
| | | #pragma fragment FragTrackballDark
|
| | |
|
| | | ENDCG
|
| | | }
|
| | |
|
| | | // (1) Light skin
|
| | | Pass
|
| | | {
|
| | | CGPROGRAM
|
| | |
|
| | | #pragma vertex vert_img
|
| | | #pragma fragment FragTrackballLight
|
| | |
|
| | | ENDCG
|
| | | }
|
| | | }
|
| | | }
|