Shader "Blocks/VoxelLit" { Properties { _MainTexArray ("Texture Array", 2DArray) = "" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Cull Off // рендерим обе стороны граней — нужно для видимости стен внутри ям Pass { Tags { "LightMode"="ForwardBase" } CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fog #pragma multi_compile_fwdbase #pragma target 3.5 #pragma require 2darray #include "UnityCG.cginc" #include "AutoLight.cginc" UNITY_DECLARE_TEX2DARRAY(_MainTexArray); struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; // UV грани 0-1 float2 uv2 : TEXCOORD1; // x = texIndex, y = face brightness }; struct v2f { float4 pos : SV_POSITION; float3 uvTex : TEXCOORD0; // xy = UV, z = texIndex float bright : TEXCOORD1; // face brightness (0.5 – 1.0) UNITY_FOG_COORDS(2) SHADOW_COORDS(3) }; v2f vert(appdata v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uvTex = float3(v.uv, v.uv2.x); o.bright = v.uv2.y; UNITY_TRANSFER_FOG(o, o.pos); TRANSFER_SHADOW(o); return o; } fixed4 frag(v2f i) : SV_Target { fixed4 col = UNITY_SAMPLE_TEX2DARRAY(_MainTexArray, i.uvTex); // Minecraft-стиль освещения: фиксированная яркость по направлению грани col.rgb *= i.bright; // Тени от directional light fixed shadow = SHADOW_ATTENUATION(i); col.rgb *= lerp(0.5, 1.0, shadow); UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } // Shadow caster pass — нужен чтобы чанки отбрасывали тени Pass { Tags { "LightMode"="ShadowCaster" } Cull Off CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_shadowcaster #pragma target 3.5 #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { V2F_SHADOW_CASTER; }; v2f vert(appdata v) { v2f o; TRANSFER_SHADOW_CASTER_NORMALOFFSET(o) return o; } fixed4 frag(v2f i) : SV_Target { SHADOW_CASTER_FRAGMENT(i) } ENDCG } } }