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}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/170709.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OpenCV实现图像:用OpenCV图像处理技巧之白平衡算法】

文章目录 概要加载样例图像统计数据分析White Patch Algorithm小结 概要 白平衡技术在摄影和图像处理中扮演着至关重要的角色。在不同的光照条件下,相机可能无法准确地捕捉到物体的真实颜色,导致图像呈现出暗淡、色调不自然或者褪色的效果。为了解决这个…

基于SSM的网络直播带货网站

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Java 之集合框架的详细介绍

文章目录 总的介绍1. **Collection 接口**2. **List 接口**3. **Set 接口**4. **Map 接口**5. **HashMap、LinkedHashMap、TreeMap**6. **Queue 接口**7. **Deque 接口** ArrayList 类1. **创建 ArrayList:**2. **添加元素:**3. **插入元素:*…

深度学习基于python+TensorFlow+Django的花朵识别系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 花朵识别系统,基于Python实现,深度学习卷积神经网络,通过TensorFlow搭建卷积神经…

视觉大模型DINOv2:自我监督学习的新领域

1 DINOv2 1.1 DINOv2特点 前段时间,Meta AI 高调发布了 Segment Anything(SAM),SAM 以交互式方式快速生成 Mask,并可以对从未训练过的图片进行精准分割,可以根据文字提示或使用者点击进而圈出图像中的特定…

Spring-Security前后端分离权限认证

前后端分离 一般来说,我们用SpringSecurity默认的话是前后端整在一起的,比如thymeleaf或者Freemarker,SpringSecurity还自带login登录页,还让你配置登出页,错误页。 但是现在前后端分离才是正道,前后端分离的话,那就…

Postgresql数据类型-数组类型

PostgreSQL支持一维数组和多维数组,常用的数组类型为数字类型数组和字符型数组,也支持枚举类型、复合类型数组。 数组类型定义 先来看看数组类型的定义,创建表时在字段数据类型后面加方括号“[]”即可定义数组数据类型,如下所示…

JVS低代码表单自定义按钮的使用说明和操作示例

在普通的表单设计中,虽然自带的【提交】、【重置】、【取消】按钮可以满足基本操作需求,但在面对更多复杂的业务场景时,这些按钮的显示控制就显得有些力不从心。为了更好地满足用户在表单操作过程中的个性化需求,JVS低代码推出了表…

【03】Istio Gateway示例配置

3.1 开放kiali至集群外部 首先将istio-inressateway暴露集群外部; 在node02的ens33网卡上面有多余的ip地址,将该地址绑定在igressgateway的svc 上面。 kubectl edit svc istio-ingressgateway -n istio-system定义kiali的ingress gateway的资源配置清单 apiVersion:…

阿里云服务器搭建sql 服务

阿里云搭建mysql服务 环境准备 系统镜像 ubuntu 如果买点的实例不是ubuntu 系统镜像,需要停止服务之后,更改镜像 更新 apt-get : 更新apt-get: sudo apt-get update 如果没有出现:apt-get 找不到此命令的错误,可能是…

【KVM-4】硬件虚拟化技术(详)

前言 大家好,我是秋意零。 经过前面章节的介绍,已经知道KVM虚拟化必须依赖于硬件辅助的虚拟化技术,本节就来介绍一下硬件虚拟化技术。 👿 简介 🏠 个人主页: 秋意零🔥 账号:全平…

OpenCV:图像噪点消除与滤波算法

人工智能的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心,我为大家整理了一份600多G的学习资源,基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…