Unity Shader 消融效果

在这里插入图片描述

消融效果

消融广泛运用于各种场合,例如

  1. 怪物击杀与道具时区(原神)
  2. 燃烧
    注意:根据噪声图的不同,效果有很大的差异,
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

第一步:创建着色器

我们要选择Unlit Shader创建

然后定义如下属性

Properties{//主贴图_MainTex ("Texture", 2D) = "white" {}//噪声图_NoiseMap ("NoiseMap", 2D) = "white" {}//第一种颜色_Color_First ("DissolveColorFirst", Color) = (1, 0, 0, 1)//第二种颜色_Color_Second ("DissolveColorSecond", Color) = (1, 0, 0, 1)//过渡宽度_Width ("LineWidth", Range(0,1)) = 0//消融程度_Value ("Amount", Range(0,1)) = 0//反射光颜色_Diffuse("Diffuse", Color) = (1, 1, 1, 1)}

这里注意,请加上这个,不然单面渲染使得模型内部裸露

Cull Off 

第二步:传入法线

只有这样我们才能计算漫反射


//修改默认的结构体struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;//添加Normal的传递float3 normal: NORMAL;};struct v2f{float2 uv : TEXCOORD0;UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;//自定义的法线信息float3 worldNormal : TEXCOORD1; // 添加了 worldNormal 属性};// 将 变量 声明在全局范围sampler2D _MainTex;float4 _MainTex_ST;sampler2D _NoiseMap;float _Value ;float _Width ;float4 _Color_First;float4 _Color_Second;fixed4 _Diffuse;//要从顶点着色器开始就传入法线v2f vert(appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);//这句是自己写的,将法线信息传递下去o.worldNormal = normalize(UnityObjectToWorldNormal(v.normal));UNITY_TRANSFER_FOG(o, o.vertex);return o;}

第三步:裁剪像素和计算漫反射

这一步的作用是先算出光线的效果,然后跟消融后的效果混合,而不是仅仅有消融的效果

 fixed4 frag(v2f i) : SV_Target{//计算灰度值float gray = dot(tex2D(_NoiseMap, i.uv).rgb, float3(0.299, 0.587, 0.114));//剔除完全消融像素clip(gray - _Value);//获取环境光的属性并标准化fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//标准化世界坐标下光源的光照方向fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);//计算漫反射光照fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(i.worldNormal, worldLightDir));//计算点是否在过渡区域以及混合系数fixed t = 1 - smoothstep(0.0, _Width, gray - _Value);//根据混合系数计算消融颜色fixed3 dissolveColor = lerp(_Color_First, _Color_Second, t);dissolveColor = pow(dissolveColor, 5);fixed3 origin = tex2D(_MainTex,i.uv);// 最终颜色 = (源色+环境光 + 漫反射光照 ) 和消融色的插值fixed3 finalColor =lerp(origin+ ambient + diffuse,dissolveColor,t *step(0.0001, _Value));// 应用雾效UNITY_APPLY_FOG(i.fogCoord, finalColor);return fixed4(finalColor, 1.0);}

完整着色器代码

Shader "Custom/Dissolve"
{Properties{_MainTex ("Texture", 2D) = "white" {}_NoiseMap ("NoiseMap", 2D) = "white" {}_Color_First ("DissolveColorFirst", Color) = (1, 0, 0, 1)_Color_Second ("DissolveColorSecond", Color) = (1, 0, 0, 1)_Width ("LineWidth", Range(0,1)) = 0_Value ("Amount", Range(0,1)) = 0_Diffuse("Diffuse", Color) = (1, 1, 1, 1)}SubShader{Tags { "RenderType"="Opaque"  "LightMode"="ForwardBase" }LOD 100Pass{Tags {"LightMode" = "ForwardBase"}//内部裸露,要开启双面渲染Cull OffCGPROGRAM#pragma vertex vert#pragma fragment frag// 让雾效生效#pragma multi_compile_fog#include "UnityCG.cginc"#include "Lighting.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;//添加Normal的传递float3 normal: NORMAL;};struct v2f{float2 uv : TEXCOORD0;UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;//自定义的法线信息float3 worldNormal : TEXCOORD1; // 添加了 worldNormal 属性};sampler2D _MainTex;float4 _MainTex_ST;sampler2D _NoiseMap;// 将 _Value 声明在全局范围float _Value ;float _Width ;float4 _Color_First;float4 _Color_Second;fixed4 _Diffuse;v2f vert(appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.worldNormal = normalize(UnityObjectToWorldNormal(v.normal));UNITY_TRANSFER_FOG(o, o.vertex);return o;}fixed4 frag(v2f i) : SV_Target{//计算灰度值float gray = dot(tex2D(_NoiseMap, i.uv).rgb, float3(0.299, 0.587, 0.114));//剔除完全消融像素clip(gray - _Value);//获取环境光的属性并标准化fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//标准化世界坐标下光源的光照方向fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);//计算漫反射光照fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(i.worldNormal, worldLightDir));//计算点是否在过渡区域以及混合系数fixed t = 1 - smoothstep(0.0, _Width, gray - _Value);//根据混合系数计算消融颜色fixed3 dissolveColor = lerp(_Color_First, _Color_Second, t);dissolveColor = pow(dissolveColor, 5);fixed3 origin = tex2D(_MainTex,i.uv);// 最终颜色 = (环境光 + 漫反射光照 ) 和消融色的插值fixed3 finalColor =lerp(origin+ ambient + diffuse,dissolveColor,t *step(0.0001, _Value));// 应用雾效UNITY_APPLY_FOG(i.fogCoord, finalColor);return fixed4(finalColor, 1.0);}ENDCG}Pass
{Tags { "LightMode" = "ShadowCaster" }Name "shadowCaster"CGPROGRAM...struct v2f{//frag需要的shadowCaster信息,包括位置、bias、depth等V2F_SHADOW_CASTER;//noise map的纹理坐标float2 uv0 : TEXCOORD0;};v2f vert(appdata_base v){v2f o;//完成://1.UnityClipSpaceShadowCasterPos:根据模型空间pos和normal,计算裁剪空间阴影位置,与光照配置中的NormalBias有关(unity_LightShadowBias.z==NormalBias)//2.UnityApplyLinearShadowBias:增加裁剪空间中Z值。与光照参数中的Bias、UNITY_NEAR_CLIP_VALUE、UNITY_REVERSED_Z有关TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)//根据缩放和偏移计算noise map纹理坐标o.uv0 = TRANSFORM_TEX(v.texcoord, _NoiseMap);return o;}fixed4 frag(v2f i) : SV_Target{//采样noise,与阈值比较,未通过不显示阴影fixed3 noise = tex2D(_NoiseMap, i.uv0).rgb;clip(noise.r - _DissolveThreshold);//平行光、聚光灯情况下返回 0(黑色)//点光源情况下调用UnityEncodeCubeShadowDepth得到cubemap shadow值SHADOW_CASTER_FRAGMENT(i)}ENDCG
}
}}

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

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

相关文章

Spring MVC 是什么?

一、什么是 Spring MVC? 官方对于 Spring MVC 的描述是这样的: Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web …

【教程】查看CPU、GPU架构的拓扑结构和系统信息

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 一些概念 Package:处理器封装。在多处理器系统中,每个物理 CPU 芯片通常被封装在一个单独的封装中,这个封装被称为 Package。一个 Package 可以包含一个或多个物理 CPU 核心。…

一站式解决方案:Qt 跨平台开发灵活可靠

Qt 是一种跨平台开发工具,为开发者提供了一站式解决方案。无论您的项目目标是 Windows、Linux、macOS、嵌入式系统还是移动平台,Qt 都能胜任。这种跨平台的特性不仅节省开支,还推动了战略的快速落地。 适用范围广泛:Qt 可在多种操…

ArgoCD结合Gitlab交付项目到kubernetes集群

ArgoCD结合Gitlab交付项目到kubernetes集群 作者:行癫(盗版必究) 一:环境准备 1.kubernetes集群环境 2.HA_Argocd环境 3.Gitlab集群环境 二:项目配置 1.配置Gitlab 创建仓库,并写入yaml文件,利用yaml构建application;此案例结合了NFS实现持久化存储

平板用的触控笔什么牌子好?ipad第三方电容笔推荐

随着技术的发展,出现了各种各样的平板电容笔。一支好的电容笔,不但可以极大地提升我们的工作效率,还可以极大地提升我们的学习效果。平替的电容笔,无论是在技术方面,还是在质量方面,都还有很大的提升空间&a…

【阿里云试用计划】免费试用GPU

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 前言试用步骤问题No CUDA GPUs are available无故被killed 致谢 前言 算力在深度学习…

Nodejs 安装之后cmd 输入npm -v 提示error的问题解决

1.问题现象: 安装时候选择: 2. 解决问题 卸载nodejs 删除安装路径下的node_modules, 重新安装 按照下面的选择

上海科技大学智能生活组齐聚合合信息,“沉浸式”体验人工智能产品

近期,上海科技大学组织本科生产业实践-校企联合人才培养活动,30余名学生组成的“智能生活组”实地参访人工智能及大数据科技企业上海合合信息科技股份有限公司(简称“合合信息”)。本次活动旨在通过项目体验、主题交流&#xff0c…

uniapp 即时通讯开发流程详解

今天我将为您详细介绍UniApp开发中的即时通讯流程。本文将向您展示如何在UniApp中实现即时通讯功能,为您的应用程序增添交互性和实时性。 1. 准备工作 在开始开发之前,确保您已完成以下准备工作: 确保您已经安装好UniApp开发环境&#xff…

RISC-V汇编指令

写在最前面:这一篇是UC Berkeley的CS61C的笔记,根据我自己的理解进行学习记录,其中贴的一些图片来自于课程PPT。 了解汇编之前,我们需要先了解为什么需要汇编?以下是我的理解: 机器执行的命令都是些二进制…

基于jeecg-boot的任务甘特图显示

更多功能看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 基于项目的任务显…

SpringCloud-Alibaba之Sentinel熔断与限流

一、下载安装运行 http://localhost:8080进行访问 登录账号和密码均为sentinel 二、创建工程,并注册到nacos服务中心 依赖spring-cloud-starter-alibaba-nacos-discovery,spring-cloud-starter-alibaba-sentinel sentine-datasource-nacos (持久化)配置文件 se…

python:基于GeoPandas和GeoViews库将GEDI激光高程数据映射到交互式地图

作者:CSDN @ _养乐多_ 本文将介绍 GEDI(Global Ecosystem Dynamics Investigation)激光雷达数据某数据点波形数据提取,并绘制图表,添加其他图表元素并使图表具有交互性。 在本文中,我们将探索如何打开、读取和处理GEDI数据,并利用地理信息处理库GeoPandas和地理空间数…

使用langchain与你自己的数据对话(二):向量存储与嵌入

之前我以前完成了“使用langchain与你自己的数据对话(一):文档加载与切割”这篇博客,没有阅读的朋友可以先阅读一下,今天我们来继续讲解deepleaning.AI的在线课程“LangChain: Chat with Your Data”的第三门课:向量存储与嵌入。 …

抖音seo账号矩阵系统源码如何开发布局?

目录 一、 抖音SEO账号矩阵系统源码的开发布局步骤如下: 二。 开发部署源码 三、 开发部署功能设计 1. 短视频AI智能创作 2. 托管式账号管理: 3. 数据分析 4. 智能营销获客 四。 抖音seo源码开发部署交付技术文档包含 五。 开发代码展示: 一、 抖…

vuejs源码之模版编译原理

之前我们说过虚拟dom,也就是虚拟dom拿到vnode后所做的事情,而模版编译是如何让虚拟dom拿到vnode。 模版编译的目标就是生成渲染函数,而渲染函数的作用是每次执行它,它就会使用当前最新的状态生成一份新的vnode,然后用…

Idea 开启 lombook 注解插件处理器

Idea 开启 lombook 注解插件处理器 方便编译器识别 勾选 Enable annotation processing

线性DP--BOX

还没学&#xff0c;等学完再仔细写。 #include<bits/stdc.h> using namespace std; typedef long long ll; ll a[1000010]; ll vis[1000010]; ll f[1000010][3]; int main() {ll n,m;cin>>n;for(int i1;i<n;i){cin>>a[i];}for(int i1;i<n;i){cin>&g…

【Python机器学习】实验01 Numpy以及可视化回顾

文章目录 一、Numpy的基础知识实验1 生成由随机数组成的三通道图片&#xff0c;分别显示每个维度图片&#xff0c;并将三个通道的像素四周进行填充&#xff0c;分别从上下左右各填充若干数据。 二、Numpy的线性代数运算实验2 请准备一张图片&#xff0c;按照上面的过程进行矩阵…

C#月数计算器(主要用于社保、医保缴费月数计算)

1、为什么做这个&#xff1f; 工作中&#xff0c;经常需要计算参保人社保、医保缴费月数&#xff0c;之前都是在Excel中写一个DATEDIF公式&#xff0c;修改单元格中的日期&#xff0c;计算间隔的月数&#xff0c;公式如下&#xff1a; DATEDIF(起始日期, 终止日期, 返回类型) …