Search Unity

Seams in Tilemap

Discussion in 'Shaders' started by Spy-Shifty, Feb 26, 2017.

  1. Spy-Shifty

    Spy-Shifty

    Joined:
    May 5, 2011
    Posts:
    546
    Hi all,

    I have a known problem with seams on a tile map.
    upload_2017-2-26_12-29-33.png

    What I've:

    Tile map
    upload_2017-2-26_12-29-53.png

    Custom Shader:
    Settings for this Atlas:
    _AtlasSizeInTiles = (4,4,0,0)
    _NumberOfTiles = 16
    _MapSizeInTiles depends on the game map itself
    Code (CSharp):
    1. Shader "Unlit/TileMapShader"
    2. {
    3.     Properties
    4.     {
    5.         _Tilemap("Tilemap", 2D) = "black" {}
    6.         _Atlasmap("Atlasmap", 2D) = "white" {}
    7.         _NumberOfTiles("Number of Tiles", Int) = 1
    8.         _AtlasSizeInTiles("Atlas Size in Tiles", Vector) = (128, 128,0,0)
    9.         _MapSizeInTiles("Map Size in Tiles", Vector) = (128, 128,0,0)
    10.  
    11.     }
    12.     SubShader
    13.     {
    14.         Tags { "RenderType"="Opaque" }
    15.         LOD 100
    16.  
    17.         Pass
    18.         {
    19.             CGPROGRAM
    20.             #pragma vertex vert
    21.             #pragma fragment frag
    22.             #pragma multi_compile _ PIXELSNAP_ON
    23.             //#pragma multi_compile _ PIXELSNAP_ON
    24.             // make fog work
    25.             //#pragma multi_compile_fog
    26.        
    27.             #include "UnityCG.cginc"
    28.  
    29.             struct appdata
    30.             {
    31.                 float4 vertex : POSITION;
    32.                 float2 uv0 : TEXCOORD0;
    33.                 float2 uv1 : TEXCOORD1;
    34.                 float2 uv2 : TEXCOORD2;
    35.                 float2 uv3 : TEXCOORD3;
    36.             };
    37.  
    38.             struct v2f
    39.             {
    40.                 float2 uv0 : TEXCOORD0;
    41.                 float2 uv1 : TEXCOORD1;
    42.                 float2 uv2 : TEXCOORD2;
    43.                 float2 uv3 : TEXCOORD3;
    44.                 float4 vertex : SV_POSITION;
    45.             };
    46.  
    47.             sampler2D _Tilemap;
    48.             sampler2D _Atlasmap;
    49.             float4 _Atlasmap_TexelSize;
    50.             half _NumberOfTiles;
    51.             half2 _AtlasSizeInTiles;
    52.             half2 _MapSizeInTiles;
    53.        
    54.             v2f vert (appdata v)
    55.             {
    56.                 v2f result;
    57.                 //result.vertex = v.vertex;
    58.                 result.uv0 = v.uv0;
    59.                 result.uv1 = v.uv1;
    60.                 result.uv2 = v.uv2;
    61.                 result.uv3 = v.uv3;
    62.                 result.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
    63.  
    64.                 result.vertex = UnityPixelSnap(result.vertex);
    65.  
    66.                 return result;
    67.             }
    68.  
    69.        
    70.             float2 CalcUV(float mapInput, float2 uv) {
    71.                 int index = mapInput * _NumberOfTiles;
    72.  
    73.                 int xpos = index % _AtlasSizeInTiles.x;
    74.                 int ypos = index / _AtlasSizeInTiles.y;
    75.  
    76.                 ypos += 1;
    77.    
    78.                 float2 uv_tile = float2(xpos, ypos) / (_AtlasSizeInTiles);        
    79.  
    80.                 float2 offset = frac(uv * _MapSizeInTiles.xy) / _AtlasSizeInTiles.xy;
    81.                 // Pixel Perfect
    82.                 //offset = round(offset * _Atlasmap_TexelSize.zw) * _Atlasmap_TexelSize.xy;
    83.                 offset = trunc(offset * _Atlasmap_TexelSize.zw) * _Atlasmap_TexelSize.xy;
    84.                 //offset = floor(offset * _Atlasmap_TexelSize.zw) * _Atlasmap_TexelSize.xy;
    85.  
    86.                 uv_tile += float2(offset.x, -offset.y);
    87.  
    88.                 return uv_tile;
    89.             }
    90.        
    91.             fixed4 frag (v2f i) : SV_Target
    92.             {
    93.                 float2 flipped_uv0 = float2(i.uv0.x, 1.0 - i.uv0.y);
    94.                 float2 flipped_uv1 = float2(i.uv1.x, 1.0 - i.uv1.y);
    95.                 float2 flipped_uv2 = float2(i.uv2.x, 1.0 - i.uv2.y);
    96.                 float2 flipped_uv3 = float2(i.uv3.x, 1.0 - i.uv3.y);          
    97.  
    98.                 float2 uv0 = CalcUV(tex2D(_Tilemap, flipped_uv0).r, i.uv0);
    99.                 float2 uv1 = CalcUV(tex2D(_Tilemap, flipped_uv1).r, i.uv1);
    100.                 float2 uv2 = CalcUV(tex2D(_Tilemap, flipped_uv2).r, i.uv2);
    101.                 float2 uv3 = CalcUV(tex2D(_Tilemap, flipped_uv3).r, i.uv3);
    102.  
    103.                 uv0.y = 1.0f - uv0.y;
    104.                 uv1.y = 1.0f - uv1.y;
    105.                 uv2.y = 1.0f - uv2.y;
    106.                 uv3.y = 1.0f - uv3.y;
    107.  
    108.                 return tex2D(_Atlasmap, uv0);            
    109.                 //return half4(uv0.x, uv0.y, 0, 0);
    110.             }
    111.             ENDCG
    112.         }
    113.     }
    114. }
    115.  
    Can anyone help me?

    Thanks in advance
     
    Last edited: Feb 26, 2017
  2. Spy-Shifty

    Spy-Shifty

    Joined:
    May 5, 2011
    Posts:
    546
  3. unity_gLfPg9OaReQ8kA

    unity_gLfPg9OaReQ8kA

    Joined:
    Jan 30, 2019
    Posts:
    1
    People who actually update their own posts with their solutions are truly the best. Thank you!