【Unity】管道流动模拟Shader

2024-02-21 16:12

本文主要是介绍【Unity】管道流动模拟Shader,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Unity】管道流动模拟Shader

抽象模拟管道介质流动的效果,使用顶点片元着色器。可以调整管线光泽,颜色,流动方向,透明度,流动体粗细,流动速度和横断面。

实现效果

Demo效果

Demo下载地址

管线光泽调整

管线颜色调整

流动方向调整

透明度调整

流动体粗细调整

管线横断

流动速度调整

shader源码

Shader "Unlit/PipeShaderTwoPass"
{Properties{_MoveTex("MoveTexture", 2D) = "white" {}_PipeTex("PipeTexture", 2D) = "white" {}_Color("Color",Color) = (1,1,1,0)[HDR]_MoveColor("MoveColor",Color) = (1,1,1,0)_CutVector("CutVector",Vector) = (0, 1, 0, 0)_CutCenter("CutCenter",Vector) = (0, 1, 0, 0)[Enum(Off,0,On,1)]_isCut("isCut",int) = 1[Enum(Off,0,On,1)]_isFront("isFront",int) = 1[Enum(Off,0,On,1)]_isMove("isMove",int) = 1_Alpha("Alpha",Range(0.85, 1.0)) = 1_Speed("Speed",Range(1, 3)) = 0.1_Metallic("Metallic", Range(0.0, 1.0)) = 0.5_Smoothness("Smoothness", Range(1.0, 2.0)) = 0.5_R("R",Range(0,1)) = 1}SubShader{Pass{Tags { "RenderType" = "Opaque"  }LOD 100ZWrite OnCull Off  //关闭剔除  CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MoveTex;float4 _MoveTex_ST;float4 _CutCenter;float4 _CutVector;float4  _MoveColor;int _isCut;int _isFront;int _isMove;float _Speed;float _R;struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float3  worldPos  : TEXCOORD1;};v2f vert(appdata v){v2f o;o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.vertex = UnityObjectToClipPos(v.vertex - (v.normal * _R));o.uv = TRANSFORM_TEX(v.uv, _MoveTex);return o;}fixed4 frag(v2f i) : SV_Target{float2 uv = i.uv;if (_isFront){uv = float2(i.uv.x, -i.uv.y);}fixed4 col = tex2D(_MoveTex, uv - float2(0, _isMove * _Speed * _Time.y));if (_isCut == 1){float3 cutVector = normalize(_CutVector.xyz);//切割向量float3 targetVer = i.worldPos - _CutCenter;//切割原点到模型点上的向量float angel = -dot(cutVector, normalize(targetVer));//切割向量和targetVer点乘,正则同方向,父则反方向clip(angel);//反方向剔除}clip(col.x - 0.1);return col* _MoveColor;}ENDCG}Pass{Tags { "RenderType" = "Opaque" "IgnoreProjector" = "True" "Queue" = "Geometry" }LOD 100ZWrite OnCull Off  //关闭剔除  Blend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "UnityLightingCommon.cginc" // 对于 _LightColor0struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float3  worldPos  : TEXCOORD1;half3 worldNormal : TEXCOORD2;fixed4 diff : COLOR0; // 漫射光照颜色};sampler2D _PipeTex;float4 _PipeTex_ST;float4 _CutCenter;float4 _CutVector;int _isCut;fixed _Verical;float _Alpha;float4 _Color;float _Metallic;float _Smoothness;v2f vert(appdata v){v2f o;o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _PipeTex);o.worldNormal = UnityObjectToWorldNormal(v.normal);half nl = max(0, dot(o.worldNormal, _WorldSpaceLightPos0.xyz) * 0.5 + 0.5);o.diff = nl * _LightColor0;o.diff.rgb += ShadeSH9(half4(o.worldNormal, 1));return o;}fixed4 frag(v2f i) : SV_Target{float2 uv = i.uv;fixed4 col = tex2D(_PipeTex, uv);if (_isCut == 1){float3 cutVector = normalize(_CutVector.xyz);//切割向量float3 targetVer = i.worldPos - _CutCenter;//切割原点到模型点上的向量float angel = -dot(cutVector, normalize(targetVer));//切割向量和targetVer点乘,正则同方向,父则反方向clip(angel);//反方向剔除}// 计算视图方向和反射矢量// 此处为每像素计算half3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));half3 worldRefl = reflect(-worldViewDir, i.worldNormal);// 与在先前的着色器中相同half4 skyData = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, worldRefl);half3 skyColor = DecodeHDR(skyData, unity_SpecCube0_HDR);fixed4 c = 0;c.rgb = skyColor * _Metallic;half4 endColor;endColor = fixed4(((_Color + c) * i.diff * _Smoothness).rgb, _Color.a);return fixed4(endColor.rgb, _Alpha);}ENDCG}}
}

这篇关于【Unity】管道流动模拟Shader的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/732346

相关文章

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多