【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

相关文章

基于 Java 实现的智能客服聊天工具模拟场景

服务端代码 import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;public class Serv

【Unity Shader】片段着色器(Fragment Shader)的概念及其使用方法

在Unity和图形编程中,片段着色器(Fragment Shader)是渲染管线中的一个阶段,负责计算屏幕上每个像素(片段)的颜色和特性。片段着色器通常在顶点着色器和任何几何处理之后运行,是决定最终像素颜色的关键步骤。 Fragment Shader的概念: 像素处理:片段着色器处理经过顶点着色器和几何着色器处理后,映射到屏幕空间的像素。颜色计算:它计算每个像素的颜色值,这可能包括纹理采样、光

【Unity Shader】Alpha Blend(Alpha混合)的概念及其使用示例

在Unity和图形编程中,Alpha Blend(也称为Alpha混合)是一种用于处理像素透明度的技术。它允许像素与背景像素融合,从而实现透明或半透明的效果。Alpha Blend在渲染具有透明度的物体(如窗户、玻璃、水、雾等)时非常重要。 Alpha Blend的概念: Alpha值:Alpha值是一个介于0(完全透明)和1(完全不透明)的数值,用于表示像素的透明度。混合模式:Alpha B

shader language学习(1)——shader language简介背景

shader language,称为着色语言,shade在英语是阴影、颜色深浅的意思。shader language基于物体本身属性和光照条件,计算美格橡塑的颜色值。 实际上这种解释具有明显的时代局限性,在GPU编程发展的早期,shader language的提出目标是加强对图形处理算法的控制,所以对该语言的定义也针对于此。但随着技术的进步,目前的shader language早已经用于通用计算

C# 命名管道中客户端访问服务器时,出现“对路径的访问被拒绝”

先还原一下我出现错误的情景:我用C#控制台写了一个命名管道服务器,然后用ASP.NET写了一个客户端访问服务器,运行之后出现了下面的错误: 原因:服务器端的访问权限不够,所以是服务器端的问题,需要增加访问权限。(网上很多都说是文件夹的权限不够,情况不同,不适用于我这种情况) 解决办法: (1)在服务器端相应地方添加以下代码。 PipeSecurity pse = new PipeSec

Unity Meta Quest 开发:关闭 MR 应用的安全边界

社区链接: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 📕教程说明 这期教程我将介绍如何在应用中关闭 Quest 系统的安全边界。 视频讲解: https://www.bilibili.com/video/BV1Gm42157Zi 在 Unity 中导入 Meta XR SDK,进行环境配置后,打开 Assets > Plugins > An

价格减免(Lc2288)——模拟

句子 是由若干个单词组成的字符串,单词之间用单个空格分隔,其中每个单词可以包含数字、小写字母、和美元符号 '$' 。如果单词的形式为美元符号后跟着一个非负实数,那么这个单词就表示一个 价格 。 例如 "$100"、"$23" 和 "$6" 表示价格,而 "100"、"$" 和 "$1e5 不是。 给你一个字符串 sentence 表示一个句子和一个整数 discount 。对于每个表示价格的单

模拟木马程序自动运行:Linux下的隐蔽攻击技术

模拟木马程序自动运行:Linux下的隐蔽攻击技术 在网络安全领域,木马程序是一种常见的恶意软件,它能够悄无声息地在受害者的系统中建立后门,为攻击者提供远程访问权限。本文将探讨攻击者如何在Linux系统中模拟木马程序的自动运行,以及他们可能使用的技术手段。 木马自动运行的常见方法 攻击者通常会使用以下几种方法来确保木马在Linux系统中自动运行: 计划任务(Crontab): 攻击者可以通

2023-2024 学年第二学期小学数学六年级期末质量检测模拟(制作:王胤皓)(90分钟)

word效果预览: 一、我会填 1. 1.\hspace{0.5em} 1. 一个多位数,亿位上是次小的素数,千位上是最小的质数的立方,十万位是 10 10 10 和 15 15 15 的最大公约数,万位是最小的合数,十位上的数既不是质数也不是合数,这个数是 ( \hspace{4em} ),约等于 ( \hspace{1em} ) 万 2. 2.\hspace{0.5em} 2.

java实训 | 低配版模拟火车订票系统

代码:  import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.util.ArrayList;import java.util.List;public class TrainBookingSystem {private JFrame frame;private JPanel