Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

Изменение цвета спрайта на более светлый в Unity 3D

Как можно высветлить спрайт, если его цвет в Sprite Rendrer и так самый белый? Пробовал менять шейдер на какой-нибудь другой, но из стандартных шейдеров получится сделать только полностью белым, а мне так не надо.


Ответ

Стандартные шейдеры на то и стандартные, что не всегда помогают.
Поэтому для разных задач можно пробовать писать свой на основе этих самых стандартных (переделывая их)
Не знаю, какие есть варианты решений данной задачи помимо шейдеров, но если решать её именно с помощью шейдеров, то вот данный код (более менее гибкий) может несколько помочь:
Shader "Custom/MyShader" { Properties { [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} _Color("Tint", Color) = (1, 1, 1, 1) _ShineLocation("ShineLocation", Range(0, 1)) = 0 _ShineWidth("ShineWidth", Range(0, 1)) = 0 [MaterialToggle] PixelSnap("Pixel snap", Float) = 0 }
SubShader { Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane" "CanUseSpriteAtlas" = "True" }
Cull Off Lighting Off ZWrite Off Blend One OneMinusSrcAlpha
Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile _ PIXELSNAP_ON #include "UnityCG.cginc"
struct appdata_t { float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; };
struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 texcoord : TEXCOORD0; };
fixed4 _Color;
v2f vert(appdata_t IN) { v2f OUT; OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex); OUT.texcoord = IN.texcoord; OUT.color = IN.color * _Color; #ifdef PIXELSNAP_ON OUT.vertex = UnityPixelSnap(OUT.vertex); #endif
return OUT; }
sampler2D _MainTex; sampler2D _AlphaTex; float _AlphaSplitEnabled; float _ShineLocation; float _ShineWidth;
fixed4 SampleSpriteTexture(float2 uv) { fixed4 color = tex2D(_MainTex, uv);
#if UNITY_TEXTURE_ALPHASPLIT_ALLOWED if (_AlphaSplitEnabled) color.a = tex2D(_AlphaTex, uv).r; #endif //UNITY_TEXTURE_ALPHASPLIT_ALLOWED

float lowLevel = _ShineLocation - _ShineWidth; float highLevel = _ShineLocation + _ShineWidth; float currentDistanceProjection = (uv.x + uv.y) / 2; if (currentDistanceProjection > lowLevel && currentDistanceProjection < highLevel) { float whitePower = 1 - (abs(currentDistanceProjection - _ShineLocation) / _ShineWidth); color.rgb += color.a * whitePower; }
return color; }
fixed4 frag(v2f IN) : SV_Target { fixed4 c = SampleSpriteTexture(IN.texcoord) * IN.color; c.rgb *= c.a;
return c; } ENDCG } } }
Пробовал в Unity 4.6
Или еще:
Shader "Custom/MyShader" { Properties { [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} _Color("Tint", Color) = (1, 1, 1, 1) [MaterialToggle] PixelSnap("Pixel snap", Float) = 0 }
SubShader { Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" "PreviewType" = "Plane" "CanUseSpriteAtlas" = "True" }
Cull Off Lighting Off ZWrite Off Fog{ Mode Off } Blend SrcAlpha OneMinusSrcAlpha
Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile DUMMY PIXELSNAP_ON #include "UnityCG.cginc"
struct appdata_t { float4 vertex : POSITION; float4 color : COLOR; float2 texcoord : TEXCOORD0; };
struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; half2 texcoord : TEXCOORD0; };
fixed4 _Color;
v2f vert(appdata_t IN) { v2f OUT; OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex); OUT.texcoord = IN.texcoord; OUT.color = IN.color; #ifdef PIXELSNAP_ON OUT.vertex = UnityPixelSnap(OUT.vertex); #endif
return OUT; }
sampler2D _MainTex;
fixed4 frag(v2f IN) : COLOR { fixed4 c = tex2D(_MainTex, IN.texcoord); c.a *= IN.color.a; c.rgb = lerp(c.rgb, step(0.5, IN.color.rgb), abs(IN.color.rgb - 0.5) * 2); return c * _Color; } ENDCG } } }
При данном шейдере дефолтный цвет спрайта (в SpriteRenderer -> Color) должен быть не белый, а, допустим с параметрами rgba(128,128,128,255)

Комментариев нет:

Отправить комментарий