【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

相关文章

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、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多

Linux命名管道方式

《Linux命名管道方式》:本文主要介绍Linux命名管道方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、命名管道1、与匿名管道的关系2、工作原理3、系统调用接口4、实现两个进程间通信二、可变参数列表总结一、命名管道1、与匿名管道的关系命名管道由mkf

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技