Shader "Unlit/IsoShader" { Properties { _MainTex ("Texture", 2D) = "white" {} _CenterPoint ("Object Center", Vector) = (0,0,0,0) _TextureOffset("Texture Offset", Vector) = (0,0,0,0) _PixelsPerUnit("Pixels Per World Unit", Float) = 1 } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; float4 screenPos : TEXCOORD1; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _MainTex_TexelSize; float4 _CenterPoint; float4 _TextureOffset; float _PixelsPerUnit; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); o.screenPos = ComputeScreenPos(o.vertex) UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { // unity_OrthoParams.xy / 0.70710678 = Wu/Vp // PixelsPerUnit = Px/Wu // _MainTex_TexelSize.xy = Uv/Px // we want Uv from: // (i.screenPos.xy - CenterPoint.xy) = Vp // (i.screenPos.xy - CenterPoint.xy) * unity_OrthoParams.x * _PixelsPerUnit * _MainTex_TexelSize.xy = Uv float2 worldUnitScale = unity_OrthoParams.xy / 0.70710678; float2 offset = float2(i.screenPos.x - _CenterPoint.x, _CenterPoint.y - i.screenPos.y); float2 uvs = float2((offset.x * worldUnitScale.x * _PixelsPerUnit - _TextureOffset.x) * _MainTex_TexelSize.x, 1 - (offset.y * worldUnitScale.y * _PixelsPerUnit - _TextureOffset.y) * _MainTex_TexelSize.y); // sample the texture fixed4 col = tex2D(_MainTex, uvs); clip(col.a - 0.5); //fixed4 col = fixed4(uvs.x, 0, 0, 1); //fixed4 col = fixed4(uvs.xy, 0, 1); // apply fog //UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } } }