- Home /
 
               Question by 
               Paum380 · Sep 14, 2021 at 03:05 PM · 
                shadersshader programmingshaderlabshader writing  
              
 
              How i get unity linear fog start and end values in shaderlab.
I'm making a vertical fog shader, and I'd like to use the values used in the linear fog settings, I got the color, but the start and end value I couldn't find.
This is a simplified version of my shader:
 Shader "Custom/HeightFog"
 {
     Properties
     {
         _MainTex("Texture",2D) = "white" {}
     }
     
     SubShader
     {
         Tags{ "RenderType" = "Opaque" }
         LOD 100
         Pass
         {
             Tags{ "LightMode" = "ForwardBase" }
             CGPROGRAM
 
             #pragma vertex vert
             #pragma fragment frag
             #pragma multi_compile_fog
 
 
             #include "UnityCG.cginc"
             #include "Lighting.cginc"
             
             struct appdata
             {
                 float4 vertex : POSITION;
                 float2 uv : TEXCOORD0;
                 float3 normal : NORMAL;
             };
 
             struct v2f
             {
                 float2 uv : TEXCOORD0;
                 float4 vertex : SV_POSITION;
                 float3 normal : TEXCOORD1;
                 float3 world_pos : TEXCOORD2;
             };
             
             float4 _MainTex_ST;
             sampler2D _MainTex;
             
             v2f vert(appdata v)
             {
                 v2f o;
                 o.vertex = UnityObjectToClipPos(v.vertex);
                 o.normal = mul(unity_ObjectToWorld, v.normal);
                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                 
                 o.world_pos = mul(unity_ObjectToWorld, v.vertex); // vertex pos in world space
                 return o;
             }
             
             float invLerp(float a, float b, float t)
             {
                 return clamp((t - a) / (b - a), 0, 1);
             }
             
             fixed3 frag(v2f i) : SV_Target
             {
                 fixed4 col = tex2D(_MainTex, i.uv);
                 col = lerp(col,unity_FogColor, invLerp(-4/*Fog Start Value*/, -5/*Fog End Value*/, i.world_pos.y));
                 return col;
             }
             ENDCG
         }
     }
 }
               Comment
              
 
               
               
               Best Answer 
              
 
              Answer by Namey5 · Sep 15, 2021 at 03:31 AM
The fog density parameters are encoded in the unity_FogParams variable for more efficient use;
https://docs.unity3d.com/Manual/SL-UnityShaderVariables.html 
 As listed here, the linear parameters are encoded as:
 unity_FogParams.z = –1.0 / (end - start);
 unity_FogParams.w = end / (end - start);
Which we can use directly to get the same effect as an inverse-lerp:
 // This;
 invLerp (fogStart, fogEnd, i.worldPos.y);
 
 // Is equivalent to;
 1.0 - saturate (i.worldPos.y * unity_FogParams.z + unity_FogParams.w);
The start and end points seem to be backwards, I would imagine because of how Unity handles fog blending, so just clamp between [0,1] (saturate ()) and flip (1 - x).
Your answer
 
 
              koobas.hobune.stream
koobas.hobune.stream 
                       
               
 
			 
                