LoginSignup
14
14

More than 5 years have passed since last update.

Spriteを白く光らせるシェーダー

Last updated at Posted at 2015-08-23

Spriteを真っ白にしたり赤くしたり赤くしたりしたい、のでググってみたけど「ちゃんと真っ白(0xFFFFFF)」になるモノを見つけられなかった(アルファの処理がおかしいのものも多かったような)ので作りました。

基本的にはSprites-Default.shaderの改造。

一応2タイプあって、計算が早いけどグラデーションが雑になるタイプと、一応グラデーションが128分割(0xFFの半分)されるタイプ。お好みでどうぞ。

Color(0.5,0.5,0.5,1.0)で元のテクスチャ色
Color(0.0,0.0,0.0,1.0)で真っ黒。
Color(1.0,1.0,1.0,1.0)で真っ白。

グラデーションがニリア変動じゃなくてsinカーブがいい? それ、作ったら僕にください。

グラデーションが雑だけど処理が早いタイプ

SpritesCustom.shader
/*
    Sprites-Custom.shader
*/

Shader "Sprites/Custom"
{
    Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        [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 One 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;
            };

            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) : SV_Target
            {
                fixed4 c = tex2D (_MainTex, IN.texcoord);

                c.rgb = saturate( c.rgb + (IN.color.rgb-0.5)*2 );
                c.rgb *= c.a;

                return c;
            }
        ENDCG
        }
    }
}

一応128分割するタイプ

SpritesCustom.shader
/*
    Sprites-Custom.shader
*/

Shader "Sprites/Custom"
{
    Properties
    {
        [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
        [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 One 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;
            };

            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) : SV_Target
            {
                fixed4 c = tex2D (_MainTex, IN.texcoord);

                float up = saturate( (IN.color.rgb-0.5)/0.5 );
                float dw = saturate( IN.color.rgb/0.5 );

                c.rgb = c.rgb*dw + (1-c.rgb)*up;
                c.rgb *= c.a;

                return c;
            }
        ENDCG
        }
    }
}

14
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14