Shader "Mobile/CustomFogCube" { Properties { _FogStart("Fog Start", float) = 0 //объявляем наши новые переменные для тумана _FogEnd("Fog End", float) = 50 } SubShader { Tags{ "RenderType" = "Opaque" } Fog{ Mode off } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile _ LIGHTMAP_ON #include "UnityCG.cginc" half _FogStart; //определяем новые переменные в рамках CGPROGRAM half _FogEnd; struct appdata { float4 vertex : POSITION; float4 color : COLOR; float4 uv : TEXCOORD1; }; struct v2f { float4 pos : SV_POSITION; float4 uv : TEXCOORD1; half fog : TEXCOORD2; //добавляем новую переменную для расчета расстояния отображения тумана и последующей передачи в fragment функцию float4 color : COLOR; half3 viewDir : TEXCOORD3; }; v2f vert(appdata v) { v2f o; o.color = v.color; o.pos = UnityObjectToClipPos(v.vertex); //lightmaps o.uv.xy = v.uv.xy * unity_LightmapST.xy + unity_LightmapST.zw; //fog высчитываем положение тумана в зависимости от заданных значений half fogz = UnityObjectToViewPos(v.vertex).z; o.fog = saturate((fogz + _FogStart) / (_FogStart - _FogEnd)); float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; o.viewDir = -(normalize(UnityWorldSpaceViewDir(worldPos))); return o; } half4 frag(v2f i) : COLOR { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); fixed4 c = i.color * 0.5; //lightmaps #ifdef LIGHTMAP_ON fixed4 lm = UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uv.xy); c.rgb *= lm.rgb * 4; #endif //fog заменяем плавно цвет поверхности на цвет кубомапы (он же наш туман). Кубомапу нужно задать в настройках освещение (Lighting > Scene > Environment Reflection > Source = Custom > Cubemap = Ваша кубомапа) half4 fogCube = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, i.viewDir); return lerp(c, fogCube, i.fog); } ENDCG } } Fallback "Mobile/VertexLit" }