您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
201 行
5.0 KiB
201 行
5.0 KiB
float4 _viewport;
|
|
float _mat[9];
|
|
|
|
half4 _color;
|
|
fixed _alpha;
|
|
fixed _strokeMult;
|
|
half4x4 _shaderMat;
|
|
sampler2D _shaderTex;
|
|
half4 _leftColor;
|
|
half4 _rightColor;
|
|
half _bias;
|
|
half _scale;
|
|
int _tileMode; // 0 = clamp, 1 = mirror, 2 = repeated
|
|
|
|
sampler2D _tex;
|
|
int _texMode; // 0 = post alpha, 1 = pre alpha, 2 = alpha only
|
|
|
|
half2 _mf_imgInc; // _mf stands for mask filter
|
|
int _mf_radius;
|
|
half _mf_kernel[25];
|
|
|
|
struct appdata_t {
|
|
float4 vertex : POSITION;
|
|
float2 tcoord : TEXCOORD0;
|
|
};
|
|
|
|
struct v2f {
|
|
float4 vertex : SV_POSITION;
|
|
float2 ftcoord : TEXCOORD0;
|
|
float2 fpos : TEXCOORD1;
|
|
};
|
|
|
|
inline half3 gamma_to_linear_space(half3 sRGB) {
|
|
return sRGB * (sRGB * (sRGB * 0.305306011h + 0.682171111h) + 0.012522878h);
|
|
}
|
|
|
|
inline half4 adjust_color(half4 color) {
|
|
#ifdef UNITY_COLORSPACE_GAMMA
|
|
return color;
|
|
#else
|
|
color.rgb = gamma_to_linear_space(color.rgb);
|
|
return color;
|
|
#endif
|
|
}
|
|
|
|
half shader_gradient_layout(half2 pos) {
|
|
half4 p4 = half4(pos, 0.0, 1.0);
|
|
#if defined(UIWIDGETS_LINEAR)
|
|
return mul(_shaderMat, p4).x;
|
|
#elif defined(UIWIDGETS_RADIAL)
|
|
return length(mul(_shaderMat, p4).xy);
|
|
#elif defined(UIWIDGETS_SWEEP)
|
|
half2 p2 = mul(_shaderMat, p4).xy;
|
|
half angle = atan2(-p2.y, -p2.x);
|
|
// 0.1591549430918 is 1/(2*pi), used since atan returns values [-pi, pi]
|
|
return (angle * 0.1591549430918 + 0.5 + _bias) * _scale;
|
|
#else
|
|
return 0;
|
|
#endif
|
|
}
|
|
|
|
half4 shader_gradient_colorize(half pt) {
|
|
if (_tileMode == 0) { // clamp
|
|
if (pt <= 0.0) {
|
|
return adjust_color(_leftColor);
|
|
} else if (pt >= 1.0) {
|
|
return adjust_color(_rightColor);
|
|
}
|
|
|
|
half2 coord = half2(pt, 0.5);
|
|
return tex2D(_shaderTex, coord);
|
|
} else if (_tileMode == 1) { // mirror
|
|
pt = pt - 1;
|
|
pt = pt - 2 * floor(pt * 0.5) - 1;
|
|
pt = abs(pt);
|
|
|
|
half2 coord = half2(pt, 0.5);
|
|
return tex2D(_shaderTex, coord);
|
|
} else if (_tileMode == 2) { // repeated
|
|
pt = frac(pt);
|
|
|
|
half2 coord = half2(pt, 0.5);
|
|
return tex2D(_shaderTex, coord);
|
|
}
|
|
|
|
return half4(0, 0, 0, 0);
|
|
}
|
|
|
|
|
|
half2 shader_image_layout(half2 pos) {
|
|
half4 p4 = half4(pos, 0.0, 1.0);
|
|
return mul(_shaderMat, p4).xy;
|
|
}
|
|
|
|
half4 shader_image_colorize(half2 pt) {
|
|
if (_tileMode == 0) { // clamp
|
|
pt.x = clamp(pt.x, 0.0, 1.0);
|
|
pt.y = clamp(pt.y, 0.0, 1.0);
|
|
} else if (_tileMode == 1) { // mirror
|
|
pt.x = pt.x - 1;
|
|
pt.x = pt.x - 2 * floor(pt.x * 0.5) - 1;
|
|
pt.x = abs(pt.x);
|
|
pt.y = pt.y - 1;
|
|
pt.y = pt.y - 2 * floor(pt.y * 0.5) - 1;
|
|
pt.y = abs(pt.y);
|
|
} else if (_tileMode == 2) { // repeated
|
|
pt.x = frac(pt.x);
|
|
pt.y = frac(pt.y);
|
|
}
|
|
|
|
return tex2D(_shaderTex, pt);
|
|
}
|
|
|
|
half4 prealpha(half4 color) {
|
|
return half4(color.x * color.w, color.y * color.w, color.z * color.w, color.w);
|
|
}
|
|
|
|
half4 shader_color (v2f i) {
|
|
half4 c;
|
|
|
|
#if defined(UIWIDGETS_COLOR)
|
|
c = adjust_color(_color);
|
|
#elif defined(UIWIDGETS_IMAGE)
|
|
half2 pt = shader_image_layout(i.fpos);
|
|
c = shader_image_colorize(pt);
|
|
#else
|
|
half pt = shader_gradient_layout(i.fpos);
|
|
c = shader_gradient_colorize(pt);
|
|
#endif
|
|
|
|
c.w *= _alpha;
|
|
return c;
|
|
}
|
|
|
|
|
|
v2f vert (appdata_t v) {
|
|
v2f o;
|
|
o.ftcoord = v.tcoord;
|
|
o.fpos = v.vertex;
|
|
|
|
float3x3 mat = float3x3(_mat[0], _mat[1], _mat[2], _mat[3], _mat[4], _mat[5], 0, 0, 1);
|
|
|
|
float2 p = mul(mat, float3(v.vertex.xy, 1.0)).xy - _viewport.xy;
|
|
|
|
#if UNITY_UV_STARTS_AT_TOP
|
|
o.vertex = float4(2.0 * p.x / _viewport.z - 1.0, 2.0 * p.y / _viewport.w - 1.0, 0, 1);
|
|
#else
|
|
o.vertex = float4(2.0 * p.x / _viewport.z - 1.0, 1.0 - 2.0 * p.y / _viewport.w, 0, 1);
|
|
#endif
|
|
|
|
return o;
|
|
}
|
|
|
|
fixed4 frag (v2f i) : SV_Target {
|
|
return prealpha(shader_color(i));
|
|
}
|
|
|
|
fixed4 frag_stencil (v2f i) : SV_Target {
|
|
return half4(0, 0, 0, 0);
|
|
}
|
|
|
|
fixed4 frag_tex (v2f i) : SV_Target {
|
|
half4 tintColor = shader_color(i);
|
|
|
|
half4 color = tex2D(_tex, i.ftcoord);
|
|
if (_texMode == 0) { // post alpha
|
|
color = color * tintColor;
|
|
color = prealpha(color);
|
|
} else if (_texMode == 1) { // pre alpha
|
|
color = color * tintColor;
|
|
color = half4(color.x * tintColor.w, color.y * tintColor.w, color.z * tintColor.w, color.w);
|
|
} else if (_texMode == 2) { // alpha only
|
|
color = half4(1, 1, 1, color.w) * tintColor;
|
|
color = prealpha(color);
|
|
}
|
|
|
|
return color;
|
|
}
|
|
|
|
fixed4 frag_mf (v2f i) : SV_Target {
|
|
half4 color = half4(0, 0, 0, 0);
|
|
|
|
float2 coord = i.ftcoord - _mf_radius * _mf_imgInc;
|
|
int width = _mf_radius * 2.0 + 1; // use 2.0 to avoid "bitfieldInsert"
|
|
|
|
[unroll(25)]
|
|
for (int i = 0; i < width; i++) {
|
|
color += tex2D(_tex, coord) * _mf_kernel[i];
|
|
coord += _mf_imgInc;
|
|
}
|
|
|
|
return color;
|
|
}
|
|
|
|
float strokeMask(float u, float v) {
|
|
return min(1.0, (1.0 - abs(u * 2.0 - 1.0)) * 1.0) * min(1.0, v);
|
|
}
|
|
|
|
fixed4 frag_stroke_alpha(v2f i) : SV_Target {
|
|
return prealpha(shader_color(i)) * strokeMask(i.ftcoord.x, i.ftcoord.y);
|
|
}
|