UnityShader——玩弄GlobalFog

Unity 后处理(Post-Processing) -- (2)创建与配置Volume Profile实战指南 本文是Unity后处理实战指南的第二部分,详细讲解了如何从零创建与配置Volume Profile。文章通过对比两种创建方法,深入剖析了Volume的参数配置逻辑,并以Bloom和Vignette为例演示了如何调出电影感画面。同时,针对URP与HDRP管线的配置差异提供了清晰说明,并分享了核心的性能优化技巧,帮助开发者高效管理后处理效果。 阅读详情

Unity 自带的 GlobalFog 通过一个屏幕特效实现了全局雾效,之前一直没太留意,最近正好有时间就把它的代码看了一遍顺便自己改了改玩,嗯,所以取了这么个标题。

1、代码分析


            Camera cam = GetComponent<Camera>();
            Transform camtr = cam.transform;
            float camNear = cam.nearClipPlane;
            float camFar = cam.farClipPlane;
            float camFov = cam.fieldOfView;
            float camAspect = cam.aspect;

            Matrix4x4 frustumCorners = Matrix4x4.identity;

            float fovWHalf = camFov * 0.5f;

            Vector3 toRight = camtr.right * camNear * Mathf.Tan (fovWHalf * Mathf.Deg2Rad) * camAspect;
            Vector3 toTop = camtr.up * camNear * Mathf.Tan (fovWHalf * Mathf.Deg2Rad);

            Vector3 topLeft = (camtr.forward * camNear - toRight + toTop);
            float camScale = topLeft.magnitude * camFar/camNear;

            topLeft.Normalize();
            topLeft *= camScale;

            Vector3 topRight = (camtr.forward * camNear + toRight + toTop);
            topRight.Normalize();
            topRight *= camScale;

            Vector3 bottomRight = (camtr.forward * camNear + toRight - toTop);
            bottomRight.Normalize();
            bottomRight *= camScale;

            Vector3 bottomLeft = (camtr.forward * camNear - toRight - toTop);
            bottomLeft.Normalize();
            bottomLeft *= camScale;

            frustumCorners.SetRow (0, topLeft);
            frustumCorners.SetRow (1, topRight);
            frustumCorners.SetRow (2, bottomRight);
            frustumCorners.SetRow (3, bottomLeft);

首先 Unity 通过上面一大堆代码算出了相机在远截面的四个角的位置,实际上用下面的函数可以代替:

Vector3[] corners = new Vector3[4];
cam.CalculateFrustumCorners(new Rect(0, 0, 1, 1),cam.farClipPlane , Camera.MonoOrStereoscopicEye.Mono, corners);


接下来的 CustomGraphicsBlit 函数就是核心所在

static void CustomGraphicsBlit (RenderTexture source, RenderTexture dest, Material fxMaterial, int passNr)
        {
            RenderTexture.active = dest;

            fxMaterial.SetTexture ("_MainTex", source);

            GL.PushMatrix ();
            GL.LoadOrtho ();

            fxMaterial.SetPass (passNr);

            GL.Begin (GL.QUADS);

            GL.MultiTexCoord2 (0, 0.0f, 0.0f);
            GL.Vertex3 (0.0f, 0.0f, 3.0f); // BL

            GL.MultiTexCoord2 (0, 1.0f, 0.0f);
            GL.Vertex3 (1.0f, 0.0f, 2.0f); // BR

            GL.MultiTexCoord2 (0, 1.0f, 1.0f);
            GL.Vertex3 (1.0f, 1.0f, 1.0f); // TR

            GL.MultiTexCoord2 (0, 0.0f, 1.0f);
            GL.Vertex3 (0.0f, 1.0f, 0.0f); // TL

            GL.End ();
            GL.PopMatrix ();
        }

利用 GL 库绘制了一个四边形,在 XY 平面,四边形刚好覆盖整个屏幕,Z 坐标则对应了 frustumCorners 矩阵中的行,并在 vertex shader 中赋值

o.interpolatedRay = _FrustumCornersWS[(int)index];
o.interpolatedRay.w = index;

于是,经过光栅化的插值以后 interpolatedRay 则是由相机出发射向远截面的每一像素的向量,乘上深度纹理的值后,通过脚本传入的相机世界坐标,便可得到屏幕上每个像素点的世界坐标

float rawDepth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, UnityStereoTransformScreenSpaceTex(i.uv_depth));
float dpth = Linear01Depth(rawDepth);
float4 wsDir = dpth * i.interpolatedRay;
float4 wsPos = _CameraWS + wsDir;

至此,该有的条件都有了,便可以计算雾了,距离雾的计算较为简单,高度雾的计算则完全采用了 论文 中的方法,连变量名都没改。


2、修改
根据论文的计算方法,在高度计算中加入了噪声,这里就没有考虑效率了,并且只是简单的将原本高度替换为交电处的噪声采样高度

//custom
        if(FdotC * FdotP < 0.0)
        {
            float x = FdotC/V.y * V.x;
            float z = FdotC/V.y * V.z;
            float2 spos = C.xz + float2(x,z);
            spos *= 0.1;
            float NH = tex2D(_NoiseTex, spos + float2(_Time.x,0.0)).r * _NoiseScale;
            float differ = NH - FH;
            FdotC += differ;
            FdotP += differ;
            if(FdotC <= 0.0)
                k = 1.0;
            else
                k = 0.0;
        }

效果如下:


同样的在距离雾中加入了噪声

        float3 wpos = camDir/dist;
        float ND = tex2D(_NoiseTex, wpos.xy + float2(_Time.x,0.0)).r;
        dist -= pow(ND,5) * _NoiseScaleDis;
        return max(dist,0.0);

效果如下:


两者一起效果如下:



3、天空盒 Blend


图片是 Github 上某大佬改进的全局雾效果,留着接下来有时间再补吧。

to be continue…

unity体积雾通用插件Fog Volume 3 Fog Volume 3 版本3.4.1, 是一个体积雾渲染器,设计用于模拟各种大气效果。它提供了大量的控制,以帮助您调整到您的外观和性能的需求。与版本2相比,在视觉外观和灵活性上有了重大的飞跃, 立即下载

相关推荐

Unity3d特效插件 Fog Volume 体积雾 视觉特效

内有现成Demo,可供学习参考,有需要的下载。

Unity3D图像后处理特效——Global Fog

The Global Fog image effect creates camera-based exponential fog. All calculations are done in world space which makes it possible to have height-based fog modes that can be used for sophisticated e

游戏点滴 8190

Unity3D全局雾效

本资源基于Unity3D实现了雾效特效,效果见博客→https://zhyan8.blog.youkuaiyun.com/article/details/131317362

Unity全局雾效

Exponential Squared(指数的平方)的计算公式:f = 1 – e^(−(density−|d|)²)它通过在场景中加入雾的效果,使得距离摄像机较远的物体看起来逐渐被雾气覆盖,从而创造出一种朦胧、模糊的视觉效果。全局雾效(Global Fog)是一种视觉效果,用于在3D场景中模拟大气中的雾气对远处物体的遮挡。Unity自带的全局雾效的实现原理,start代表雾开始的距离(可控)end代表雾最强时的距离(可控)这里的距离都是相对于摄像机的。这里的距离都是相对于摄像机的。d代表里摄像机的距离。

Go_Accepted的博客 1567

告别双系统!用Ventoy把Ubuntu 22.04装进U盘,打造你的随身开发环境(附保姆级避坑指南)

本文详细介绍了如何使用Ventoy将Ubuntu 22.04安装到U盘,打造便携式开发环境。通过即插即用的特性,开发者可以在任何x86电脑上快速启动完整的Ubuntu系统,无需配置双系统或虚拟机。文章提供了从硬件准备到系统优化的全流程指南,帮助用户高效创建随身开发环境。

weixin_31569671的博客 364

龙虾 Skill 技能库|OpenClaw+Hermes 全集成 一键调用所有 AI 技能

龙虾 Skill 技能库、OpenClaw、Hermes Agent、AI 技能集成、本地 AI 自动化、办公工具、数字员工

weixin_42219287的博客 624

Unity中雾效的开启

1、对于雾效的开启在新版的Unity中通过界面菜单Windows->Lighting窗口中Scene页签打开 2、勾选Fog即开启雾效,雾效三种方式(雾的浓度和距离相机的距离有关,详细请参考Unity中雾效的模拟) 1)、Linear 即线性可配参数Start、End两个距离,雾效从Start开始越接近End越浓,到达End时达到最大浓度,End之后也为最大浓度

Rhett 2万+

Abaqus梁模型仿真中的常见陷阱与优化策略

本文深入探讨了Abaqus梁模型仿真中的常见陷阱与优化策略,涵盖几何建模、材料属性设置、边界条件处理等关键环节。针对梁截面方向定义、网格划分、复合截面建模等典型问题,提供了实用的Python脚本示例和优化方案,帮助工程师避免计算错误并提升仿真精度。文章特别强调了动力分析中的网格密度要求和材料非线性考虑,为复杂工程应用提供专业指导。

weixin_29099217的博客 461

体积雾 global fog unity 及改进

https://github.com/keijiro/KinoFog lighting box 2.7.2 halfspace fog 相机位于一个位置 这个位置可以在fog volumn里面或者外面 雾开始的地方就是文中的plane http://www.terathon.com/lengyel/Lengyel-UnifiedFog.pdf 这个fog ...

anfu8346的博客 926

短视频团队架构&工作流程---2025.3.30

1、负责短视频日常内容分发上线,包括视频头图、标题、简介、推荐位及部分内容元数据的日常导入、审核、上线、下线,并提供各品类短视频的内容上线计划表。(20)运营:视频推送后,实时跟进视频数据,定期统计分析数据报表,根据数据表现 找到问题,并发送给各个小组的负责人,对下一期视频内容进行调整。(4)运营:收到成片,设计视频头图、标题、简介、推荐位等,分发到各个平台,统计分析视频的数据,对各个平台的视频进行管理、用户互动等。1、负责影视、戏剧、广告、专题片等的策划、组稿选题、材料收集、内容策划。

超越神明 2153

AI计算,为什么要用GPU?

几年后,2012年,神经网络之父杰弗里·辛顿(Geoffrey Hinton)的两个学生——亚历克斯·克里切夫斯基(Alex Krizhevsky)、伊利亚·苏茨克沃(Ilya Sutskever),利用“深度学习+GPU”的方案,提出了深度神经网络AlexNet,将识别成功率从74%提升到85%,一举赢得Image Net挑战赛的冠军。根据形态,GPU可分为独立GPU(dGPU,discrete/dedicated GPU)和集成GPU(iGPU,integrated GPU),也就是常说的独显、集显。

经营范围: CTA、SRRC、CCC、移动、电信、联通入库 1675

Unity-HDRP-Sense-11

本章详细介绍HDRP配置文件,以及HDRP配置文件、Defualt Frame Settings (默认的帧设置)、相机和Reflection Probe上的Cunstom Frame Settings(自定义的帧设置)与场景中Volume之间的关系。还介绍了如何为不同的HDRP配置文件。Spnaza_HDRP这个示例项目为大家更深入介绍了Volume框架上 主要的Overried(重载)。

Asincereman的专栏 1476

01-系统技术架构师必备——软件架构设计基础与核心概念

摘要 本文系统阐述了软件架构设计的核心概念与方法论,重点涵盖以下内容:1)软件架构的四大要素(构件、连接件、约束、配置)及其边界划分;2)Garlan & Shaw五大架构风格(数据流、调用/返回、独立构件、虚拟机、仓库)的典型应用场景;3)基于电商库存系统的架构选型实战案例,展示如何根据业务需求(高并发、最终一致性)选择事件驱动架构配合Saga模式;4)介绍ABSD、DSSA等主流架构方法论及ISO/IEEE标准体系。文章融合金融与互联网领域的架构实践经验,为技术架构师提供系统性的知识框架和决策参考。

模界 | AI工程化实践者 182

Unity 之 Profiler概述

Unity Profiler overview Profiler overview 是什么?

陈言必行 -- Unity游戏开发领域优质博主 2838

Python爬虫-汽车之家各车系月销量榜数据

本文是该专栏的第41篇,后面会持续分享python爬虫干货知识。本文以某汽车平台为例,基于python采集该平台“各车系月销量”的榜单数据。具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码)

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 1619

手把手教你双目测距理论及生成视差图,深度图,点云图像

Stereo Vision, 也叫双目立体视觉,它的研究可以帮助我们更好的理解人类的双眼是如何进行深度感知的。双目视觉在许多领域得到了应用,例如城市三维重建、3D模型构建(如kinect fusion)、视角合成、3D跟踪、机器人导航(自动驾驶)、人类运动捕捉(Microsoft Kinect)等等。双目测距也属于双目立体视觉的一个应用领域,双目测距的基本原理主要是三角测量原理,即通过视差来判定物体的远近。

qq_53545309的博客 2280

[Unity]Scene Render Settings怎么找到Fog设置在哪里

如果在菜单Edit-Lighting,无法找到。 Window-Rendering-LightingSettings Fog设置在哪里 Window-Lighting-Settings-OtherSettings 设置完成后,点击播放,可以看出雾蒙蒙的效果 ...

qq_36998053的博客 2726

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【Unity Shader】 Fog

一、介绍Fog Fog,即雾化。本质是离屏幕越远的物体,就越趋向某种颜色。通常是远处,即离屏幕远的地方,趋向于白色或浅灰色。 二、Unity 灯光的Fog选项 1. Color 雾的颜色 2. Mode 线性(Linear): 其中dmax和dmin分别表示受雾影响的起点和终点。 一次指数(Exponential): d表示雾的浓度,e=2.71828...

赞美月亮的专栏 2793

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Unity Shader:雾的数学运算以及在Unity中使用Fog

Forward,MSAA,Bloom,Global Fog/Exponential Squared/Density 0 Forward,MSAA,Bloom,Global Fog/Exponential Squared/Density 0.045 Forward,MSAA,Bloom,Global Fog/Exponential Squared/Density 0.085 Forw

liu_if_else的博客 6806

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

UnityShader——基于CustomRenderTexture的战争迷雾

Unity 2017版本推出了CustomRenderTexture,个人觉得是个很棒的东西,很多效果不需要再一层一层去申请 RenderTexture 然后 Blit, 而且 CRT 还提供了 UpdateZone 用来更新某一个区域,虽然性能上来说到底有没有提高没测试过不清楚,不过用起来是真的很方便,Unity.jp 的某位大佬用 CRT 实现的水波效果就非常有意思 说到战争迷雾,战争迷雾的...

NotMz 3697

使用点云数据在Unity中渲染场景

使用点云数据在Unity中渲染场景 在博客园看到这篇博文,觉得好有用,转载过来以备留用。谢谢博客园大神: tiancaiKG 原文链接:使用点云数据在Unity中渲染场景 最近接触了一个用点云数据渲染的方案, 非常给力, 几乎就是毫秒级的加载速度, 特别是在显示一些城市大尺度场景的时候,简直快的没法形容, 之前的城市场景用了很多重复模型, 并且大量优化之后加载一个城市不仅时间很久, 10分钟...

weixin_44574918的博客 3343

Unity 根据屏幕位置求相机视锥体四角的世界位置

var dis = 12; //视锥平面距离相机的距离 var leftButtom = new Vector3(0, 0, dis); var leftTop = new Vector3(0, Screen.height, dis); var rightTop = new Vector3(Screen.width, Screen.height, dis); var rightButtom = new Vector3(Screen.width, 0, dis); Cubes[0].transform..

qq_31293317的博客 1795

unity相机锥形视角(剪裁空间)平移

【代码】unity相机锥形视角(剪裁空间)平移。

weixin_41995872的博客 418

Global Fog全局雾特效

s 全局雾图像效果可以创建基于摄像机对象的指数型雾效,该方式基于世界空间计算,所以可以创建出更复杂,真实的雾效,   fog mode:雾效模式,该项用于指定雾效模式 absoluteYanddistance:雾浓度基于Y轴高度绝对值以及距离 absoluteY:雾浓度基于Y轴绝对值 diatance::雾浓度基于距离 relative Yand distance:雾浓度

CyRo 3301

Shader 基础之 Unity Shader概念

默认声明的keyword 都是global的,但是可以在声明keyword type的时候,加上后缀_local 来表示是local的,加上之后表示不可override的,也就是同名的不能复写它。3. 一个shader包含在多个material里面,打进assetbundle中,会导致有多份shader,同时也打断了合批,可以使用。Note:所有的分支都会编译成程序,写进shader里面,这会增加文件的大小,但是相比较多个变体来说,它还是小的。,当该集合中的所有关键字被禁用时,创建一个着色器变体。

qq_37672438的博客 1535

【unity】Shader.SetGlobalFloat/Vector/Texture 不生效

Shader.SetGlobalFloat,Shader.SetGlobalVector,Shader.SetGlobalTexture等等函数不生效是为什么? 答:shader的properties要去掉对应的变量。也就是说shader获取数据要么通过properties赋值(手动拖过去),要么通过代码赋值 ...

weixin_37417198的博客 4264
上一篇: UnityShader——初探Compute Shader
下一篇: 图形学——Make Some Noise
NotMz
博客等级 码龄12年 112粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值