试了下unity自带的雾效,感觉最大的问题就是没有包括天空盒,远处处于天空背景的物体显得不真实,如下图。

因此决定还是自己动手写一个脚本,最终效果如下图:(雾的垂直厚度和水平浓度可调)

思路:很简单,用屏幕后效果实现距离越远雾越浓,但同时从地表向上应该越来越稀薄,不然天空全是雾了,不真实。这主要是shader的作用,脚本很简单,关键代码如下,最后面有3个脚本下载地址。

PostEffectsBase.cs(不需要挂在场景物体上)

using UnityEngine;
using System.Collections;[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
//在编辑状态下也可以执行该脚本
public class PostEffectsBase : MonoBehaviour
{protected void CheckResources(){bool isSupported = CheckSupport();if (isSupported == false){NotSupported();}}// 调用CheckResources检查平台上的支持protected bool CheckSupport(){if (SystemInfo.supportsImageEffects == false ){Debug.LogWarning("This platform does not support image effects or render textures.");return false;}return true;}// Called when the platform doesn't support this effectprotected void NotSupported(){enabled = false;}protected void Start(){CheckResources();}protected Material CheckShaderAndCreateMaterial(Shader shader, Material material){if (shader == null){return null;}if (shader.isSupported && material && material.shader == shader)return material;if (!shader.isSupported){return null;}else{material = new Material(shader);material.hideFlags = HideFlags.DontSave;if (material)return material;elsereturn null;}//CheckShaderAndCreateMaterial函数接受两个参数,第一个参数指定了该特效需要使用Shader,//第二个参数则是用于后期处理的材质。该函数首先检查Shader的可用性,检查通过后就返回一个//使用了该Shader的材质,否则返回null。}
}

Fog_global.cs(继承上面的脚本,需要挂在主摄像机上)

using UnityEngine;
using System.Collections;public class Fog_global : PostEffectsBase
{public Shader fogShader;private Material fogMaterial = null;public Material material{get{fogMaterial = CheckShaderAndCreateMaterial(fogShader, fogMaterial);return fogMaterial;}}private Camera myCamera;public new Camera camera{get{if (myCamera == null){myCamera = GetComponent<Camera>();}return myCamera;}}private Transform myCameraTransform;public Transform cameraTransform{get{if (myCameraTransform == null){myCameraTransform = camera.transform;}return myCameraTransform;}}[Range(0.1f, 40.0f)]public float fogDensity = 25.0f;public Color fogColor = Color.white;public float fogStart = 5f;public float fogEnd = 2000f;public float H_floor = -600f;public float H_top = 200f;void OnEnable(){GetComponent<Camera>().depthTextureMode |= DepthTextureMode.Depth;}//首先计算近裁剪平面的4个角对应的向量,并把他们存储在一个矩阵类型的变量)//(frustumCorners)中。 随后把结果和其他参数传递给材质,并调用Graphics.Blit(src,dest,material)//把渲染结果显示在屏幕上。void OnRenderImage(RenderTexture src, RenderTexture dest){if (material != null){Matrix4x4 frustumCorners = Matrix4x4.identity;float fov = camera.fieldOfView;float near = camera.nearClipPlane;float aspect = camera.aspect;float halfHeight = near * Mathf.Tan(fov * 0.5f * Mathf.Deg2Rad);Vector3 toRight = cameraTransform.right * halfHeight * aspect;Vector3 toTop = cameraTransform.up * halfHeight;Vector3 topLeft = cameraTransform.forward * near + toTop - toRight;float scale = topLeft.magnitude / near;topLeft.Normalize();topLeft *= scale;Vector3 topRight = cameraTransform.forward * near + toRight + toTop;topRight.Normalize();topRight *= scale;Vector3 bottomLeft = cameraTransform.forward * near - toTop - toRight;bottomLeft.Normalize();bottomLeft *= scale;Vector3 bottomRight = cameraTransform.forward * near + toRight - toTop;bottomRight.Normalize();bottomRight *= scale;frustumCorners.SetRow(0, bottomLeft);frustumCorners.SetRow(1, bottomRight);frustumCorners.SetRow(2, topRight);frustumCorners.SetRow(3, topLeft);material.SetMatrix("_FrustumCornersRay", frustumCorners);material.SetFloat("_FogDensity", fogDensity);material.SetColor("_FogColor", fogColor);material.SetFloat("_FogStart", fogStart);material.SetFloat("_FogEnd", fogEnd);material.SetFloat("_H_floor", H_floor);material.SetFloat("_H_top", H_top);material.SetVector("_CamPos", cameraTransform.position);Graphics.Blit(src, dest, material);}else{Graphics.Blit(src, dest);}}
}

Fog_global.shader(拖入Fog_global.cs槽中)

Shader "custom/Fog" {Properties {_MainTex ("Base (RGB)", 2D) = "white" {}_FogDensity ("Fog Density", Float) = 1.0_FogColor ("Fog Color", Color) = (1, 1, 1, 1)_FogStart ("Fog Start", Float) = 0.0_FogEnd ("Fog End", Float) = 1.0}SubShader {CGINCLUDE#include "UnityCG.cginc"float4x4 _FrustumCornersRay;sampler2D _MainTex;half4 _MainTex_TexelSize;//深度纹理sampler2D _CameraDepthTexture;half _FogDensity;fixed4 _FogColor;float _FogStart;float _FogEnd;float4 _CamPos;float _H_floor;float _H_top;struct v2f {float4 pos : SV_POSITION;float2 uv : TEXCOORD0;float2 uv_depth : TEXCOORD1;float4 interpolatedRay : TEXCOORD2;};v2f vert(appdata_img v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = v.texcoord;o.uv_depth = v.texcoord;#if UNITY_UV_STARTS_AT_TOPif (_MainTex_TexelSize.y < 0)o.uv_depth.y = 1 - o.uv_depth.y;#endifint index = 0;if (v.texcoord.x < 0.5 && v.texcoord.y < 0.5) {index = 0;} else if (v.texcoord.x > 0.5 && v.texcoord.y < 0.5) {index = 1;} else if (v.texcoord.x > 0.5 && v.texcoord.y > 0.5) {index = 2;} else {index = 3;}#if UNITY_UV_STARTS_AT_TOPif (_MainTex_TexelSize.y < 0)index = 3 - index;#endifo.interpolatedRay = _FrustumCornersRay[index];return o;}fixed4 frag(v2f i) : SV_Target {float linearDepth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv_depth));float3 worldPos = _WorldSpaceCameraPos + linearDepth * i.interpolatedRay.xyz;float _distance = distance(worldPos,_CamPos);float fogDensity = (_distance-_FogStart)*0.3 / (_FogEnd - _FogStart); //越远越浓fogDensity *=(_H_top - worldPos.y) / (_H_top - _H_floor);//离地面越高越稀薄fogDensity = saturate(fogDensity * _FogDensity) ;fixed4 finalColor= tex2D(_MainTex, i.uv);finalColor.rgb = lerp(finalColor.rgb, _FogColor.rgb, fogDensity*0.3);return finalColor ;}ENDCGPass {              CGPROGRAM  #pragma vertex vert  #pragma fragment frag  ENDCG}} FallBack Off
}

全部脚本下载地址:https://download.csdn.net/download/qq_34593121/11977887

下载内容说明:unity自带的雾效,感觉最大的问题就是没有包括天空盒,远处处于天空背景的物体显得不真实,此脚本可以用屏幕后效果实现距离越远雾越浓,同时从地表向上越来越稀薄,形成比较自然的雾效。

闲云野鹤:吃鸡(二)之场景制作—雾效的制作相关推荐

  1. 免费资源分享(七) 3D吃鸡写实动态场景

    免费分享 Unity3D 吃鸡写实场景,附带动态树木.湖泊等全套资源. 适应版本:Unity 2019.2 链接:https://pan.baidu.com/s/1qy-Nu519CQREW4AXg5 ...

  2. 做了一个仿吃鸡游戏,可多人联网,算是学习总结。

    网上偶见UNITY,很有兴趣于是自学了一段时间,这是我做的一个仿吃鸡游戏DEMO,虽然只是抱着学习实践的很低要求,但从代码.模型.美工.场景都要自己做,繁杂超过了我的预估.对次时代游戏有兴趣可加我qq ...

  3. python的wxpy库_【微信辅助】吃鸡再也不怕了,Python用wxpy实现微信自动回复

    我是程序员小小叶,为大家带来原创精彩技术内容. 首先安装wxpy. pip install wxpy 优点:相比itchat封装了接口,使用较为方便. 注意事项:wxpy 支持 Python 3.4- ...

  4. python评价文本留言答复的质量_【微信辅助】吃鸡再也不怕了,Python用wxpy实现微信自动回复...

    我是程序员小小叶,为大家带来原创精彩技术内容. 首先安装wxpy.pip install wxpy 优点:相比itchat封装了接口,使用较为方便. 注意事项:wxpy 支持 Python 3.4-3 ...

  5. 闲云野鹤:吃鸡(一)之场景制作:使用GPU instancing方式制作刷草插件

    用GPU instancing方式制作刷草插件(unity版本8.2.2) 先上最终效果图(欢迎加我qq交流:358641634): 十种草 混刷生成比较自然的场景(带阴影.风力.草可见距离可调) 插 ...

  6. 闲云野鹤:吃鸡(三)之场景制作:制作毒圈

    先上最终效果图: 电弧为shader动态效果 交界处电弧高亮(也是动态) 上部全透明           思路:毒圈为吃鸡比较有特色的元素,在3dmax里面做一个72段边的圆柱,半径5米,高度500米 ...

  7. Unity3DPhoton制作吃鸡游戏

    Unity3D&Photon制作吃鸡游戏 https://study.163.com/course/courseMain.htm?share=1&shareId=8348227& ...

  8. 吃鸡方向导航功能制作

    吃鸡方向导航功能制作 现在吃鸡游戏大火,吃鸡已经不能是一个游戏了,俨然已经变为了一种游戏玩法游戏机制,类似之前的MOBA, 各种游戏模式与吃鸡的结合,在当下已经变成了一种趋势.吃鸡中的方向导航可能接下 ...

  9. Python制作吃鸡各数据资料查询助手,带你做理论王者~

    前言 大家早好.午好.晚好吖 ❤ ~ 吃鸡想必大家都玩过了 今天来教大家制作一个资料查询助手 1.我们是不是要去获取这些数据 武器配件 首先:对于 武器一个详情页url地址发送请求, 获取 每个武器的 ...

最新文章

  1. CSDN 星城大巡礼,长沙“科技之星”年度企业评选正式开启
  2. 算法竞赛入门经典读书笔记(三)7.2枚举排列
  3. select poll epoll IO操作多路复用及猴子补丁
  4. CodeIgniter学习笔记一
  5. Ubuntu 9.04下让Swing和Swt编写的Java桌面程序运行
  6. 一维数组kmeans聚类c语言,一维数组的 K-Means 聚类算法理解
  7. 同步VS异步,阻塞VS非阻塞
  8. Android usb audio调用流程(二)
  9. Web---session技术代码演示(request,session,servletContext)
  10. Vue开发系列三 调试
  11. 我的小米云端账号服务器,#小米开放云#免费云服务器安装Windows系统
  12. 非线性规划求解器 Lingo, Matlab 使用心得,及使用的求解算法
  13. html中css层叠样式表(行内样式,内嵌式,外部式)
  14. 服务假死问题解决过程实记(一)——问题发现篇
  15. 写给大学男同胞几条择偶建议
  16. Pranava Pra 使用教程
  17. LabelImg 标注 yolo 数据 环境配置和预制标签 predefined_classes.txt 的使用 详解
  18. 红米AX6000折腾链路聚合
  19. 设置鼠标右键文件夹打开idea
  20. numeric_limits

热门文章

  1. 什么是软链接、硬链接
  2. HTML导出生成Word文档
  3. MSP4302553呼吸灯(附代码)
  4. 微信网页授权获取用户基本信息 --- 20/03/16
  5. iOS审核总被拒?腾讯教你提升iOS审核通过率!
  6. python+excel接口自动化测试(实现 数据分离,token获取,数据依赖,发送邮件)
  7. 2022年末最新最全Java学习路线,结合工作经验和培训机构整理
  8. 第15课:ul,添加新闻信息列表ol,添加图书销售排行榜
  9. 小知识 - 恢复chmod执行权限
  10. Consider defining a bean of type ‘cn.itcast.feign.clients.UserClient‘ in your configuration.解决方案