Unity Shader Example 19 (fog)

参考:

http://tgerm.org/Fog/

游戏里对雾的模拟就是根据物体距离摄像机的远近来混合雾和物体本身的颜色。u3d中内置的雾效的渲染有三种模式:Linear,Exponential,Exp2 ,三种模式使用不同的公式计算雾的影响因子:

  • Linear:

    f=dmax|z|dmaxdmin   f=dmax−|z|dmax−dmin

dmax受雾影响的最远距离,dmin受雾影响的最小距离,z表示顶点距相机的距离。

  • Exponential:

    f=e d|z|   f=e−d|z|

d表示雾的浓度,z表示顶点到相机的距离。

  • Exp2:

    f=e (dz) 2    f=e−(dz)2

d表示雾的浓度,z表示顶点到相机的距离。

实现:

代码:

Shader "Unlit/LinearFog"
{
	Properties
	{
		_fogColor ("Base Color", color) = (1, 1, 1, 1)
		_nearFogDist ("Near Distance", float) = 0
		_farFogDist ("Far Distance", float) = 30
		_fogIntensity("Fog Intensity", float) = 0.5
		_MainTex ("My Texture", 2D) = "white" {}
	}
	SubShader
	{
		
		Tags { "RenderType"="Opaque" }
		Fog { Mode off}
		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"
			
			#define mix lerp
			
			struct v2f
			{	
				float4 vertex : SV_POSITION;
				float2 uv_MainTex : TEXCOORD1;
				float4 viewSpacePos : TEXCOORD2;
			};

			float4 _fogColor;
			float _nearFogDist;
			float _farFogDist;
			float _fogIntensity;
			sampler2D _MainTex;
			
			v2f vert (appdata_base v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.uv_MainTex = v.texcoord.xy;
				o.viewSpacePos = mul(UNITY_MATRIX_MV, v.vertex);
				return o;
			}
			
			fixed4 frag (v2f i) : COLOR
			{
				float4 diffuseColor = tex2D(_MainTex, i.uv_MainTex);
				
				i.viewSpacePos.w = 0;
				float dist = length(i.viewSpacePos);
				//linear
//				float fogFactor = (_farFogDist - abs(dist))/(_farFogDist - _nearFogDist);
				//Exponential
				float fogFactor = exp(-abs(_fogIntensity * dist));
				//Exp2
//				float fogFactor = exp(-(_fogIntensity * dist) * (_fogIntensity * dist));
				
				fogFactor = clamp(fogFactor, 0.0, 1.0);
				float3 fogC = mix(_fogColor.rgb, diffuseColor.rgb, fogFactor);
				
				return float4(fogC, diffuseColor.a);
			}
			ENDCG
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值