当前位置: 首页 > news >正文

unity-urp:视野雾

问题背景

恐怖游戏在黑夜或者某些场景下,需要用雾或者黑暗遮盖视野,搭建游戏氛围

效果

场景中,雾会遮挡场景和怪物,但是在玩家视野内雾会消散,距离玩家越近雾越薄。

当前是第三人称视角,但是可以轻松的把这个效果转换为第一人称视角。

原理

正如屏幕空间的高度雾,这里做一个屏幕空间的视野雾。

采用特殊的材质在相机前方绘制一个能遮盖相机的矩形。如果矩形覆盖的像素点在视野内,就降低雾效果,否则绘制雾效果。

实现

urp下使用RenderFeature + 自定义shader实现

简略步骤

在相机节点下放置一个Plane,隐藏它

编写shader并创建材质

像素着色器代码如下,原理为采样深度,根据深度计算出当前像素的世界坐标,根据坐标和玩家位置的关系确定雾效果

            float4 frag(Varyings input) : SV_Target{UNITY_SETUP_INSTANCE_ID(input);UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);//计算屏幕uvfloat2 screenUV = GetNormalizedScreenSpaceUV(input.positionCS);//采样深度#if UNITY_REVERSED_Zfloat depth = SampleSceneDepth(screenUV);#else// Adjust Z to match NDC for OpenGL ([-1, 1])float depth = lerp(UNITY_NEAR_CLIP_VALUE, 1, SampleSceneDepth(screenUV));#endif//根据深度计算当前像素所代表的世界空间坐标float3 worldPos = ComputeWorldSpacePosition(screenUV, depth, UNITY_MATRIX_I_VP);//计算角色位置和当前渲染的像素所代表的世界坐标的距离float distanceVal = distance(worldPos, _PosWS);//做过渡float t = (max(distanceVal - (_Range * 0.8), 0)) / (_Range * 1.2);//计算透明度,透明度越低雾越薄float alpha = lerp(0, 1, saturate(t * t));//返回像素颜色return float4(_Color.rgb, alpha * _Color.a);}
创建并且配置RenderFeature到URP管线的自定义Renderer

自定义Pass中的核心代码,使用指定的材质绘制隐藏的Plane

    public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){if(null == Renderer){if(null != SceneFogController.Instance){Renderer = SceneFogController.Instance.Renderer;}}if (null == FogMat || null == Renderer){return;}var cmd = CommandBufferPool.Get("FogPass");cmd.DrawRenderer(Renderer, FogMat, 0, 0);//Matrix4x4 material = new Matrix4x4();//material.SetTRS(_renderer.transform.position, _renderer.transform.rotation, Vector3.one);//cmd.DrawMesh(_renderer.gameObject.GetComponent<MeshFilter>().sharedMesh, material, FogMat);context.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}

http://www.lryc.cn/news/313517.html

相关文章:

  • Spring Cloud Gateway介绍及入门配置
  • Thingsboard本地源码部署教程
  • 【MySQL 系列】MySQL 起步篇
  • C++的成员初始化列表
  • 为什么TikTok视频0播放?账号权重提高要重视
  • element---tree树形结构(返回的数据与官方的不一样)
  • Spring Boot工程集成验证码生成与验证功能教程
  • Bert Encoder和Transformer Encoder有什么不同
  • 外汇天眼:频繁交钱却无法出金,只因误入假冒HFM惨成冤大头!
  • Linux-信号3_sigaction、volatile与SIGCHLD
  • STM32 | STM32时钟分析、GPIO分析、寄存器地址查找、LED灯开发(第二天)
  • Python常用语法汇总(一):字符串、列表、字典操作
  • Token的奥秘--一起学习吧之token
  • FlinkCDC快速搭建实现数据监控
  • 应急布控球远程视频监控方案:视频监控平台EasyCVR+4G/5G应急布控球
  • 3.6 C语言和汇编语言混合编程 “每日读书”
  • 利用“定时执行专家”循环执行BAT、VBS、Python脚本——含参数指定功能
  • 【算法集训】基础算法:模拟
  • 基于SSM的房客源信息管理系统设计与实现
  • 常见数据类型
  • 基于vue的联通积分商城数据可视化APP设计与实现
  • 2024年flink面试真题(一)
  • Java面试挂在线程创建后续,不要再被八股文误导了!创建线程的方式只有1种
  • JavaEE面试题
  • 探索macOS上的最佳MySQL客户端工具
  • [Android] MediaPlayer SDK API glance
  • 原始手写helloworld并打jar包允许
  • maven 的安装与配置(Command ‘mvn‘ not found)修改配置文件后新终端依旧无法识别到 mvn 命令
  • Pycharm无法粘贴外部文本问题
  • 学习Java的第四天