Search Unity

Question Shaders that add thickness to the sprite.

Discussion in 'Shaders' started by KanghyuckMoon, Jan 12, 2024.

  1. KanghyuckMoon

    KanghyuckMoon

    Joined:
    Nov 27, 2017
    Posts:
    13
    upload_2024-1-12_17-46-55.png
    upload_2024-1-12_17-47-8.png
    I am creating a shader that adds thickness to a sprite to make it look like a 3D object.
    Currently, this shader works very well for sprites without alpha values, but it looks very unnatural when used on sprites with alpha values.
    Please, if anyone has any ideas on how to solve this problem, please let me know.

    Code (CSharp):
    1. Shader "VoxelSpriteShaderMark1"
    2. {
    3.     Properties
    4.     {
    5.         _MainTex ("Texture", 2D) = "white" {}
    6.         _Color ("Tint Color", Color) = (1,1,1,1)
    7.         _Offset ("Offset", float) = 2.0
    8.         _Count ("Count", int) = 2.0
    9.     }
    10.     SubShader
    11.     {
    12.         Tags { "Queue"="AlphaTest" "RenderType"="TransparentCutout" "IgnoreProjector"="True" }
    13.         Cull Off
    14.         ZWrite On
    15.         AlphaToMask On
    16.  
    17.         Pass
    18.         {
    19.             CGPROGRAM
    20.             #pragma vertex vert
    21.             #pragma geometry GSMain
    22.             #pragma fragment frag
    23.             #pragma target 5.0
    24.  
    25.             struct appdata
    26.             {
    27.                 float4 vertex : POSITION;
    28.                 float2 uv : TEXCOORD0;
    29.             };
    30.  
    31.             struct v2f
    32.             {
    33.                 float4 pos : POSITION;
    34.                 float2 uv : TEXCOORD0;
    35.             };
    36.  
    37.             uniform float4 _Color;
    38.             float _Offset;
    39.             int _Count;
    40.  
    41.             v2f vert(appdata v)
    42.             {
    43.                 v2f o;
    44.                 o.pos = v.vertex;
    45.                 o.uv = v.uv;
    46.                 return o;
    47.             }
    48.  
    49.             [maxvertexcount(60)]
    50.             void GSMain(triangle appdata patch[3], inout TriangleStream<v2f> stream)
    51.             {
    52.                 v2f GS;
    53.  
    54.                 for(uint i = 0; i < 3; ++i)
    55.                 {
    56.                     uint index = i;
    57.                     GS.pos = UnityObjectToClipPos(patch[index].vertex);
    58.                     GS.uv = patch[index].uv;
    59.                     stream.Append(GS);
    60.                 }
    61.                 stream.RestartStrip();
    62.  
    63.                 for(uint i = 0; i < 3; ++i)
    64.                 {
    65.                     uint index = i;
    66.                     GS.pos = UnityObjectToClipPos(patch[index].vertex + float4(0, 0, _Offset, 0));
    67.                     GS.uv = patch[index].uv;
    68.                     stream.Append(GS);
    69.                 }
    70.                 stream.RestartStrip();
    71.  
    72.                 for (uint i = 0; i < 3; i++)
    73.                 {
    74.                     uint index = i;
    75.                     uint nextIndex = (index + 1) % 3;
    76.  
    77.                     // Triangle 1
    78.  
    79.                     GS.pos = UnityObjectToClipPos(patch[index].vertex);
    80.                     GS.uv = patch[index].uv;
    81.                     stream.Append(GS);
    82.                     GS.pos = UnityObjectToClipPos(patch[index].vertex + float4(0, 0, _Offset, 0));
    83.                     GS.uv = patch[index].uv;
    84.                     stream.Append(GS);
    85.  
    86.                     GS.pos = UnityObjectToClipPos(patch[nextIndex].vertex + float4(0, 0, _Offset, 0));
    87.                     GS.uv = patch[nextIndex].uv;
    88.                     stream.Append(GS);
    89.  
    90.                     stream.RestartStrip();
    91.  
    92.                     // Triangle 2
    93.  
    94.                     GS.pos = UnityObjectToClipPos(patch[nextIndex].vertex + float4(0, 0, _Offset, 0));
    95.                     GS.uv = patch[nextIndex].uv;
    96.                     stream.Append(GS);
    97.  
    98.                     GS.pos = UnityObjectToClipPos(patch[nextIndex].vertex);
    99.                     GS.uv = patch[nextIndex].uv;
    100.                     stream.Append(GS);
    101.  
    102.                     GS.pos = UnityObjectToClipPos(patch[index].vertex);
    103.                     GS.uv = patch[index].uv;
    104.                     stream.Append(GS);
    105.  
    106.  
    107.  
    108.                     stream.RestartStrip();
    109.                 }
    110.             }
    111.  
    112.             sampler2D _MainTex;
    113.  
    114.             fixed4 frag(v2f i) : COLOR
    115.             {
    116.                 fixed4 col = tex2D(_MainTex, i.uv) * _Color;
    117.                 return col;
    118.             }
    119.             ENDCG
    120.         }
    121.     }
    122. }
    This is my shader code