unity5.6.x雾的使用

1.在Window窗口中找到Lighting打开Settings

unity5.6.x雾的使用_第1张图片


2.找到Fog选择,上图包含了一些设置:雾的颜色,模拟雾采用的方法,雾的浓度(只在采用指数方法时有用),受雾影响的距离起点和终点(只在采用线性方法时有效)。

 1)、Linear 即线性可配参数Start、End两个距离,雾效从Start开始越接近End越浓,到达End时达到最大浓度,End之后也为最大浓度

2)、Exponential 指数性可配参数Density,雾的浓度,浓度越大雾越大

3)、Exponential Squared 可配参数Density,越大表示雾越浓


3.当我们开启全局雾效果的时候。3中雾采用的方法,个人觉得Linear (线性)和Exponential这2个效果比较好

利用脚本动态实现雾效果:

    主要有以下参数:

    --开启雾效

    RenderSettings.fog = true;

  --雾效颜色
  RenderSettings.fogColor = Color.red;

  --Linear有效
  RenderSettings.fogStartDistance = 1;
  RenderSettings.fogEndDistance = 3;

  --Exponential Exponential Squared 有效
  RenderSettings.fogDensity = 8;



Fog实现的内部原理(针对面试提问)

1.首先,我们需要在Properties块中添加雾效的几个设置参数:

	Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _Ramp ("Ramp Texture", 2D) = "white" {}
        _Tooniness ("Tooniness", Range(0.1,20)) = 4
        _Outline ("Outline", Range(0,1)) = 0.1
        
        _FogColor("Fog Color", Color) = (1, 0, 0, 0)
        _FogIntensity("Fog Intensity", float) = 0.1
        _FogStart("Fog Start", float) = 0
        _FogEnd("Fog End", float) = 300
    }

2.下面是添加模拟雾效的函数

		float4 SimulateFog(float4 pos, float4 col)
		{
			pos.w = 0.0;
			float dist = length(pos);
//			float dist = pos.z;
			// Linear
//			float fogFactor = (_FogEnd - abs(dist)) / (_FogEnd - _FogStart);
//			fogFactor = clamp(fogFactor, 0.0, 1.0);
			
			// Exponential
//			float fogFactor = exp(-abs(_FogIntensity * dist));
//			fogFactor = clamp(fogFactor, 0.0, 1.0);
			
			// Exp2
			float fogFactor = exp(-(_FogIntensity * dist) * (_FogIntensity * dist));
			fogFactor = clamp(fogFactor, 0.0, 1.0);
			
			float3 afterFog = mix(_FogColor.rgb, col.rgb, fogFactor);
			
			return float4(afterFog, col.a);
		}


解释:有了上面的公式,这个函数很好理解。值得说明的是,函数参数pos是指在view space中顶点的位置,因为只有在这个坐标系中,摄像机的位置总是位于原点。在计算距离摄像机远近时,我们有两种可选方式:一种直接使用pos.z得到近似值,一种是使用真正距离摄像机的距离,即计算xyz平方和后开根号的结果。第二种方法由于使用了计算根号这种操作,因此在性能上略微比第一种查一点,但效果也更真实。





你可能感兴趣的:(自我进步)