核心算法 非常简单 主要就是把一个点的世界坐标转换到贴图的UV坐标
给整个场景一个大的plane 加上写的shader
摄像机位置调成plane的正上方

Shader "Unlit/FogRender"
{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags{ "Queue" = "Transparent+151" "IgnoreProjector" = "True" "RenderType" = "Transparent" }Blend SrcAlpha OneMinusSrcAlphaZWrite OffZTest OffCull BackPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma fragmentoption ARB_precision_hint_fastest #include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{// sample the texturehalf4 col = tex2D(_MainTex, i.uv);return col;}ENDCG}}
}

给plane加上渲染的脚本 随便写的 0.0

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class FogSystem : MonoBehaviour {public Material material;private Texture2D mTexture;private float worldToTex;private int textureSize = 50;private int inputSize = 2;private float transScale;private Vector2Int worldPos = new Vector2Int(0,0);// Use this for initializationvoid Start () {transScale = transform.localScale.x * 10;worldToTex = textureSize/transScale;UpdateTexture();}// Update is called once per framevoid Update () {if (Input.GetMouseButtonDown(0)){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;if (Physics.Raycast(ray, out hit)){// or hit.collider.transform;Vector2 v2 = new Vector2(hit.point.x + transScale / 2, hit.point.z + transScale / 2) * worldToTex;worldPos = new Vector2Int((int)v2.x,(int)v2.y); UpdateTexture();}}}void UpdateTexture(){if (mTexture == null){// Native ARGB format is the fastest as it involves no data conversionmTexture = new Texture2D(textureSize, textureSize, TextureFormat.ARGB32, false);mTexture.wrapMode = TextureWrapMode.Clamp;Color32[] defaultColor = new Color32[textureSize * textureSize];for (int i = 0; i < defaultColor.Length; i++){defaultColor[i] = Color.black;}mTexture.SetPixels32(defaultColor);mTexture.Apply();}else{ Color32[] colors = new Color32[inputSize * inputSize];for (int i = 0; i < colors.Length; i++){colors[i] = Color.white;colors[i].a = 0;}mTexture.SetPixels32(worldPos.x, worldPos.y, inputSize, inputSize, colors);mTexture.Apply();}}private void OnWillRenderObject(){material.SetTexture("_MainTex", mTexture);}
}

有一篇写的比较好的博客
优化了算法 加入了多线程

Unity3D游戏高性能战争迷雾系统实现
mBuffer1 用来计算 是否可见
mBuffer2 用来计算 模糊
最终使用的是mBuffer0 多线程 就是要麻烦一点
边缘模糊使用的是均值模糊均值模糊

Unity Shader unity文档学习笔记(十一):战争迷雾核心算法相关推荐

  1. 【ember zigbee】序章:协议栈相关文档学习笔记

    原文地址:https://blog.csdn.net/tainjau/article/details/90648114 文章目录 写在前面 一.材料出处 二.文档解析 2.1.EZSP Protoco ...

  2. python定义函数的组成部分有_Python文档学习笔记(4)--定义函数

    定义函数 关键字 def 引入函数的定义.其后必须跟有函数名和以括号标明的形式参数列表.组成函数体的语句从下一行开始,且必须缩进. 执行 一个函数会引入一个用于函数的局部变量的新符号表. 因此,在函数 ...

  3. IAM 策略文档学习笔记

    策略文档 IAM 许可策略 附加到确定角色可执行哪些任务的角色.将许可限定为仅角色需要进行的操作,以及仅为进行这些操作角色需要的资源.您可以使用 AWS 管理的或客户创建的 IAM 许可策略 操作:您 ...

  4. w3schools文档学习笔记 - XML

    http://www.w3school.com.cn/xml/xml_syntax.asp 在 XML 中,省略关闭标签是非法的.所有元素都必须有关闭标签 声明不属于XML本身的组成部分.它不是 XM ...

  5. Vue3 文档学习笔记

    vue3学习笔记 setup() 生命周期的与vue2的不同点在:beforeCreated.created都在setup()里进行默认调用,其他的都要写在setup()里面,算做compositio ...

  6. Unity Shader unity文档学习笔记(十七):径向模糊 实现类似冲锋时的速度感

    实现思路:离中心点越远的像素 模糊效果越明显 UV偏移的量越大 shader // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'Uni ...

  7. Django1.10文档学习笔记二

    创建应用 1 创建project Django-admin startproject mysite 自动创建目录结构: mysite/    #项目容器 Manage.py    #命令行工具 mys ...

  8. Unity功能—— 在VS中快速访问Unity API对应文档

    声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改. Unity功能-- 在VS中快速访问Unity API对应文档 文章目录 Unity功能-- ...

  9. 《Unity Shader入门精要》笔记:初级篇(2)

    本篇博客主要为个人学习所编写读书笔记,不用于任何商业用途,以及不允许任何人以任何形式进行转载. 本篇博客会补充一些扩展内容(例如其他博客链接). 本篇博客还会提供一些边读边做的效果截图.文章内所有数学 ...

最新文章

  1. SpringBoot开启异步方法
  2. Collections.sort()的使用
  3. 网页布局(固定与不固定原理)
  4. 给采购凭证分配合作伙伴方案
  5. bat kafka启动_windows下搭建Kafka,并通过命令窗口收发消息
  6. [转]jQuery设计思想
  7. nginx 重启和配置include的位置
  8. (36)FPGA原语设计(BUFIO)
  9. c#养老院老人信息管理系统源码 论文_[源码和文档分享]基于JSP和MYSQL实现的学生信息管理系统...
  10. Java的Exception解析
  11. 网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
  12. SpringBoot+SpringMVC+MybatisPlus框架整合实现分页插件查询
  13. Zilliqa Scilla入门
  14. Java经典实例:在正则表达式中控制大小写
  15. 邮件服务器加密方式,盈世Coremail邮件系统四种安全加密方式揭秘
  16. MyBatis实现中间表关联查询
  17. ubuntu系统下格式化移动硬盘
  18. JVM监控及诊断工具命令行篇之jps
  19. 开机显示:你可能是软件盗版的受害者...解决办法
  20. 如何用C#制作简易的飞行棋(内有详细步骤,代码和解析,欢迎讨论学习)

热门文章

  1. 精容数安政务云灾备解决方案
  2. 数据埋点、公司SOP流程
  3. 脚本录制工具__UIRecorder使用说明文档
  4. 《公路工程适应自动驾驶附属设施总体技术规范(征求意见稿)》公开征求意见...
  5. USB Type-C PD诱骗芯片-LDR6328S
  6. 易语言 超级列表框 设置选中状态-选择框的 方法
  7. iOS 知识点整理 (持续更新...)
  8. 如何将AE动画导出为json文件
  9. rufus-scheduler 定时任务示例
  10. 苹果官网再降价 没赶上的用户还能退差价