Unity中Shader雾效的实现方法一
文章目录
- 前言
- 一、在片元着色器中使用如下公式计算
- `最终的颜色 = lerp(雾效颜色,物体颜色,雾效混合因子)`
- 1、获取雾效颜色
- 2、物体的颜色一般通过纹理采样得到,此处用 1 代替测试
- 3、获取 雾效混合因子(由 雾的距离 和 雾的浓度决定)
- 二、在顶点着色器中,计算不同类型的雾效混合因子(在顶点着色器计算节省性能)
- Unity预定义好方便我们计算的四维变量 unity_FogParams
- 1、计算线性雾的雾效混合因子
- 2、计算指数雾1 的雾效混合因子
- 3、计算指数雾2 的雾效混合因子
- 三、最终测试代码
前言
Unity中Shader雾效的实现方法一,按照之前的公式, 我们自己来实现一下
- Unity中Shader雾效的原理
基于上一篇文章继续:
- Unity中Shader的雾效
一、在片元着色器中使用如下公式计算
最终的颜色 = lerp(雾效颜色,物体颜色,雾效混合因子)
不管是什么类型的雾,这个雾效的公式都是统一的
1、获取雾效颜色
unity_FogColor
2、物体的颜色一般通过纹理采样得到,此处用 1 代替测试
3、获取 雾效混合因子(由 雾的距离 和 雾的浓度决定)
雾效混合因子是由,之前的三个雾效衰减公式计算得到的
- Unity中Shader雾效的原理
因为在片元着色器中计算雾效需要使用该因子
所以在 v2f 中定义一个 TEXCOORD 类型的 float 变量 fogFactor
float fogFactor : TEXCOORD1;
二、在顶点着色器中,计算不同类型的雾效混合因子(在顶点着色器计算节省性能)
Unity预定义好方便我们计算的四维变量 unity_FogParams

1、计算线性雾的雾效混合因子

- 获取 z :这个z是摄像机到物体的距离
z = (用摄像机的世界坐标 - 顶点的世界坐标)的 模长
计算需要准备:
摄像机的世界坐标:_WorldSpaceCameraPos
顶点的世界坐标:mul(unity_ObjectToWorld,v.vertex)
float z = length(_WorldSpaceCameraPos - worldPos);
- 获取 start 和 end
上面的公式可以等价为:
fogFactor
= (end - z) / (end - start)
= (end / (end - start)) + z * (-1 / (end - start))
使用Unity预定义的公式后:
= unity_FogParams.w + z * unity_FogParams.z ;
//(end - z) / (end - start)= (end / (end - start)) + z * (-1 / (end - start))
o.fogFactor = z * unity_FogParams.z + unity_FogParams.w;
效果:

2、计算指数雾1 的雾效混合因子

fogFactor
= exp2(-density * z)
使用Unity预定义的公式后:
= exp2(-unity_FogParams.y * z)
//exp2(-density * z)
o.fogFactor = exp2(-unity_FogParams.y * z);
效果:

3、计算指数雾2 的雾效混合因子

fogFactor
= exp2(-(density * z)^2)
使用Unity预定义的公式后:
= exp2(-(unity_FogParams.x * z)^2)
//exp2(-(density * z)^2)
float density = unity_FogParams.x * z;
o.fogFactor = exp2(-density * density);
效果:

三、最终测试代码
//unity的雾效
//雾效的实现方法一
Shader "MyShader/P1_9_3"
{SubShader{Tags { "RenderType"="Opaque" }Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fog#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;};struct v2f{float4 vertex : SV_POSITION;float fogFactor : TEXCOORD1;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);float4 worldPos = mul(unity_ObjectToWorld,v.vertex);float z = length(_WorldSpaceCameraPos - worldPos);#if defined(FOG_LINEAR)//(end - z) / (end - start)= (end / (end - start)) + z * (-1 / (end - start))o.fogFactor = z * unity_FogParams.z + unity_FogParams.w;#elif defined(FOG_EXP)//exp2(-density * z)o.fogFactor = exp2(-unity_FogParams.y * z);#elif defined(FOG_EXP2)//exp2(-(density * z)^2)float density = unity_FogParams.x * z;o.fogFactor = exp2(-density * density);#endifreturn o;}fixed4 frag (v2f i) : SV_Target{fixed4 c = 0;#if defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2)c = lerp(unity_FogColor,c,i.fogFactor);#endifreturn c;}ENDCG}}
}相关文章:
Unity中Shader雾效的实现方法一
文章目录 前言一、在片元着色器中使用如下公式计算最终的颜色 lerp(雾效颜色,物体颜色,雾效混合因子)1、获取雾效颜色2、物体的颜色一般通过纹理采样得到,此处用 1 代替测试3、获取 雾效混合因子(由 雾的距离 和 雾的浓度决定&am…...
Mac安装配置Tomcat,以及使用(详解)
目录 一、Tomcat下载: 1、左栏选择Tomcat版本 2、点击下载即可,任选其一 编辑3、下载好的文件夹放到用户名下即可(之前已经下载过,这里以Tomcat 8.5.88为演示),这里提供8.5.88的安装包: 二…...
Smart Link 和 Monitor Link应用
定义 Smart Link常用于双上行链路组网,提高接入的可靠性。 Monitor Link通过监视上行接口,使下行接口同步上行接口状态,起到传递故障信息的作用。 Smart Link,又叫做备份链路。一个Smart Link由两个接口组成,其中一个…...
【debug】解决Kali虚拟机开机黑屏,左上角光标一直闪动无法开机问题
做网络攻防实验时,突然Kali无法打开,遇到这个问题。。。。。。 遇到的问题 突然kali虚拟机变成如下黑屏,无法开机,左上角光标闪动,重启无效。 解决办法 在上图界面,按Ctrl F3(不同电脑快捷键…...
目标检测YOLO实战应用案例100讲-基于改进YOLO算法的道路交通目标检测(续)
目录 3.3 实验结果与分析 3.3.1 实验数据集 3.3.2 算法的评价指标 3.3.3 损失函数实验结果...
爬虫怎么伪装才更安全
随着网络技术的不断发展,爬虫技术也越来越成熟,爬虫伪装技术也随之得到了广泛应用。在爬虫伪装技术中,如何伪装成正常的浏览器行为,让目标网站无法辨别出爬虫的存在,是爬虫伪装技术的核心。下面,我将从以下…...
openssl+sha256开发实例(C++)
文章目录 一、 sha256介绍二、sha256原理三、openssl sha256实现 一、 sha256介绍 SHA-256(Secure Hash Algorithm 256-bit)是一种哈希算法,属于 SHA-2(Secure Hash Algorithm 2)家族的一员。SHA-256 产生的哈希值是一…...
【Bug】当用opencv库的imread()函数读取图像,用matplotlib库的plt.imshow()函数显示图像时,图像色彩出现偏差问题的解决方法
一,问题描述 我们在利用opencv的imread读取本地图像,进行一系列处理,但是发现用matplotlib库的imshow()函数显示的时候出现色彩改变,比如图像偏黄,偏红,偏蓝等等,但是对…...
通过顶顶通呼叫中心中间件玩转FreeSWITCH媒体流
怎么获取FreeSWITCH的媒体流是一个老生常谈的问题了,最常见的方法media_bug,我在2019年就做的FreeSWITCH对接ASR开源的例子https://gitcode.net/iyaosan/FreeSWITCH-ASR用的就是media_bug,对接ASR常见的方法还有通过mod_mrcp模块对接mrcp的asrserver。 …...
Maven内网开发使用离线仓库
Maven内网开发使用离线仓库 离线或者内网环境开发与外网不通,中央仓库连不上,使用 Maven 管理项目会遇到很多问题。 比如:依赖包缺失,内网的Nexus私服的包老旧,很久没有维护,项目无法运行打包,…...
CSS特效007:绘制3D文字,类似PS效果
css实战中,怎么绘制3D文字呢? 实际上理论很简单,使用text-shadow,根据需要调整阴影的颜色、大小、偏移量等参数,以达到你想要的立体效果。下面是一个简单的示例。关键点就是知道如何设置text-shadow。 效果图 源代码 …...
LLM 面试总结
溜一遍 MLStack.Cafe - Kill Your Next Machine Learning & Data Science Interview https://www.llmforce.com/llm-interview-questions MLStack.Cafe - Kill Your Next Machine Learning & Data Science Interview An interview with a language model, ChatGPT - W…...
acwing算法基础之数学知识--求小于等于n的所有质数
目录 1 基础知识2 模板3 工程化 1 基础知识 核心思想:把2~n中的非质数打上标记(也即,筛掉),剩余的就是质数。 一般做法: int primes[N]; //存储所有的质数 int st[N]; //存储是否被排除 int cnt; int n;…...
安装和使用 nn-Meter
安装和使用 nn-Meter nn-Meter: Towards Accurate Latency Prediction of Deep-Learning Model Inference on Diverse Edge Devices nn-Meter:精准预测深度学习模型在边缘设备上的推理延迟 Li Lyna Zhang, Shihao Han, Jianyu Wei, Ningxin Zheng, Ting Cao, Yuqin…...
PHP原生类总结利用
再SPL介绍 SPL就是Standard PHP Library的缩写。据手册显示,SPL是用于解决典型问题(standard problems)的一组接口与类的集合。打开手册,正如上面的定义一样,有许多封装好的类。因为是要解决典型问题,免不了有一些处理文…...
C/C++满足条件的数累加 2021年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析
目录 C/C满足条件的数累加 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C满足条件的数累加 2021年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 现有n个整数,将其中个位数…...
zookeeper:服务器有几种状态?
四种: looking(选举中)、leading(leader)、following( follower)、 observer(观察者角色)...
大数据-之LibrA数据库系统告警处理(ALM-12040 系统熵值不足)
告警解释 每天零点系统检查熵值,每次检查都连续检查五次,首先检查是否启用并正确配置了rng-tools工具或者haveged工具,如果没有配置,则继续检查当前熵值,如果五次均小于500,则上报故障告警。 当检查到真随…...
HTML页面模拟了一个类似Excel的表格在线diy修改表格内容
html实现在线表格编辑,可以修改每个表格内容,并且可以添加行和列 这个HTML页面模拟了一个类似Excel的表格,可以添加和删除行和列,并且可以编辑每个表格的内容。通过点击按钮可以添加新的行和列,通过按钮可以删除最后一…...
Unity如何保存场景,如何导出工程文件/如何查看保存位置?【各版本通用】
如何保存场景? 在unity中CtrlS 或者File—>Save 输入你要保存的场景名【建议保存在Scenes文件夹下】 下图,保存场景不在Scenes文件夹下: 下图,保存在Scenes文件夹下: 下图,保存完成 如何导出工程文…...
比迪丽模型Python安装全指南:从环境配置到第一个艺术生成
比迪丽模型Python安装全指南:从环境配置到第一个艺术生成 1. 开篇:为什么选择比迪丽模型? 如果你对AI绘画感兴趣,可能已经听说过比迪丽模型。这是一个强大的文本生成图像模型,能够根据你的文字描述创作出令人惊艳的艺…...
线程同步与互斥(下)
线程同步与互斥(中)https://blog.csdn.net/Small_entreprene/article/details/147003513?fromshareblogdetail&sharetypeblogdetail&sharerId147003513&sharereferPC&sharesourceSmall_entreprene&sharefromfrom_link我们学习了互斥…...
CH343芯片驱动安装全攻略:从Windows到Linux再到MacOS,一篇搞定所有系统
CH343芯片跨平台驱动安装实战指南:从Windows到Linux再到MacOS的完整解决方案 第一次拿到基于CH343芯片的开发板时,我对着电脑上"无法识别的USB设备"提示发呆了十分钟。作为一款支持6Mbps高速传输的USB转串口芯片,CH343在嵌入式开发…...
Llama-3.2V-11B-cot开源模型落地:政务公开图文字说明自动生成系统
Llama-3.2V-11B-cot开源模型落地:政务公开图文字说明自动生成系统 1. 项目背景与价值 在政务公开工作中,大量图片资料需要配以文字说明,传统人工撰写方式效率低下且难以保证一致性。Llama-3.2V-11B-cot多模态大模型为解决这一问题提供了创新…...
氧化镓高体积热容的特性,集成高介电常数界面的结侧冷却架构
速览:技术背景与挑战背景: 虽然宽禁带(WBG)半导体(如SiC、GaN)已取得进展,但超宽禁带(UWBG)材料如氧化镓(Ga₂O₃)具有更高的理论极限。痛点&…...
避坑指南:YOLOv8模型部署到小程序的5个常见错误及解决方案
YOLOv8模型部署到小程序的避坑实战手册 第一次把YOLOv8模型塞进小程序时,我盯着屏幕上那个"500 Internal Server Error"发呆了半小时。这已经是第三次部署失败了,Docker日志里那些红色错误信息像在嘲笑我的天真。后来才发现,原来只…...
Chrono 自然语言日期解析器:从文本到标准日期的完整指南
Chrono 自然语言日期解析器:从文本到标准日期的完整指南 【免费下载链接】chrono A natural language date parser in Javascript 项目地址: https://gitcode.com/gh_mirrors/ch/chrono Chrono 是一款强大的 JavaScript 自然语言日期解析器,能够将…...
DIY电源设计避坑指南:为什么你的滤波电路总达不到理想效果?
DIY电源设计避坑指南:为什么你的滤波电路总达不到理想效果? 在创客工作坊或学生电子竞赛中,一个稳定可靠的电源往往是项目成功的基础。但许多爱好者都会遇到这样的困扰:明明按照教科书设计了滤波电路,示波器上的纹波却…...
CAN总线数字信号特性与抗干扰技术解析
1. CAN总线信号本质解析CAN总线采用数字信号传输机制,这一点可以从其物理层特性得到明确验证。在CAN总线的差分信号线上,实际传输的是经过编码的数字电平信号(显性电平与隐性电平),而非连续变化的模拟电压。这种设计从…...
抖音批量下载工具架构设计与部署实践
抖音批量下载工具架构设计与部署实践 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工具&#x…...
