文章目录

  • 目的
  • 思路
  • Script
    • include cginc
    • appled shader
    • csharp
  • 效果

目的

便于后续自己的 CTRL+C,V的面向复制、粘贴编程


思路

非常简单:可以使用 perlin noise,simple noise 或是其他的 noise 函数,又或是 noise tex 来提取顶点 xyz 的偏移

然后 vs 里便宜就好了,需要阴影跟随飘动的投影就加上 “LightMode”=“ShadowCaster” 的 pass


Script


include cginc

#ifndef __WIND_COMMON_H__
#define __WIND_COMMON_H__// jave.lin 2021/04/13#include "UnityCG.cginc"#if defined(_WIND_ON)half  _WindSpeed;
half    _WindWavesScale;
half    _WindForce;
half4   _WindDir;
half    _MoveHeight;
half    _MoveHeightPow;float3 mod3D289(float3 x) { return x - floor(x / 289.0) * 289.0; }float4 mod3D289(float4 x) { return x - floor(x / 289.0) * 289.0; }float4 permute(float4 x) { return mod3D289((x * 34.0 + 1.0) * x); }float4 taylorInvSqrt(float4 r) { return 1.79284291400159 - r * 0.85373472095314; }float snoise(float3 v)
{const float2 C = float2(1.0 / 6.0, 1.0 / 3.0);float3 i = floor(v + dot(v, C.yyy));float3 x0 = v - i + dot(i, C.xxx);float3 g = step(x0.yzx, x0.xyz);float3 l = 1.0 - g;float3 i1 = min(g.xyz, l.zxy);float3 i2 = max(g.xyz, l.zxy);float3 x1 = x0 - i1 + C.xxx;float3 x2 = x0 - i2 + C.yyy;float3 x3 = x0 - 0.5;i = mod3D289(i);float4 p = permute(permute(permute(i.z + float4(0.0, i1.z, i2.z, 1.0)) + i.y + float4(0.0, i1.y, i2.y, 1.0)) + i.x + float4(0.0, i1.x, i2.x, 1.0));float4 j = p - 49.0 * floor(p / 49.0);  // mod(p,7*7)float4 x_ = floor(j / 7.0);float4 y_ = floor(j - 7.0 * x_);  // mod(j,N)float4 x = (x_ * 2.0 + 0.5) / 7.0 - 1.0;float4 y = (y_ * 2.0 + 0.5) / 7.0 - 1.0;float4 h = 1.0 - abs(x) - abs(y);float4 b0 = float4(x.xy, y.xy);float4 b1 = float4(x.zw, y.zw);float4 s0 = floor(b0) * 2.0 + 1.0;float4 s1 = floor(b1) * 2.0 + 1.0;float4 sh = -step(h, 0.0);float4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;float4 a1 = b1.xzyw + s1.xzyw * sh.zzww;float3 g0 = float3(a0.xy, h.x);float3 g1 = float3(a0.zw, h.y);float3 g2 = float3(a1.xy, h.z);float3 g3 = float3(a1.zw, h.w);float4 norm = taylorInvSqrt(float4(dot(g0, g0), dot(g1, g1), dot(g2, g2), dot(g3, g3)));g0 *= norm.x;g1 *= norm.y;g2 *= norm.z;g3 *= norm.w;float4 m = max(0.6 - float4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0);m = m * m;m = m * m;float4 px = float4(dot(x0, g0), dot(x1, g1), dot(x2, g2), dot(x3, g3));return 42.0 * dot(m, px);
}void windNoiseHandle(inout float4 posOS, float modelY, float uv_v)
{if (_MoveHeight <= 0) return; jave.lin 2021/12/13 : 新版本的方式,目前暂时没用上 uv//float hT = modelY / _MoveHeight;//float3 positionOS = posOS;//float windSpeed = _Time.y * (_WindSpeed * 5);//float3 noisePos = (positionOS + windSpeed) * _WindWavesScale;//float windNoise = snoise(noisePos) * (_WindForce * 30);//windNoise *= hT;//windNoise *= pow(hT, _MoveHeightPow);//posOS.xyz = positionOS + _WindDir.xyz * windNoise;// jave.lin : 旧版本的方式float3 positionOS = posOS;float windSpeed = _Time.y * (_WindSpeed * 5);float windNoise = snoise((mul(unity_ObjectToWorld, posOS) + windSpeed) * _WindWavesScale);windNoise = (windNoise * 0.01);//#ifdef _FIXTHEBASEOFFOLIAGE_ON//    windNoise = (windNoise * pow(uv_v, 2.0));//#endif//windNoise = (windNoise * pow(uv_v, 2.0));windNoise = (windNoise * pow(modelY / _MoveHeight, _MoveHeightPow));windNoise = (windNoise * (_WindForce * 30));posOS.xyz += (_WindDir.xyz * windNoise) * (1 + (sin(_Time.y * 0.5) * 0.5 + 0.5));
}#define VERT_WIND(wpos, modelY, uv_v) windNoiseHandle(wpos, modelY, uv_v);#else
#define VERT_WIND(wpos, modelY, uv_v)
#endif#endif

appled shader

// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)Shader "OnePiece/Legacy Shaders/Transparent/Cutout/Diffuse_DoubleSide_Wind" {Properties {_Color ("Main Color", Color) = (1,1,1,1)_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}SubShader {Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}LOD 200Cull OffCGPROGRAM
#define _WIND_ON
#pragma surface surf Lambert fullforwardshadows addshadow alphatest:_Cutoff vertex:vert// include 引入
#include "Includes/CG/WindCommon.cginc"sampler2D _MainTex;
fixed4 _Color;struct Input {float2 uv_MainTex;
};void vert(inout appdata_full v)
{// 应用VERT_WIND(v.vertex, v.vertex.y, v.texcoord.y)
}void surf (Input IN, inout SurfaceOutput o) {fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;o.Albedo = c.rgb;o.Alpha = c.a;
}
ENDCG
}Fallback "Legacy Shaders/Transparent/Cutout/VertexLit"
}

csharp

// jave.lin 2021/04/13using UnityEngine;#if UNITY_EDITOR
using UnityEditor;
#endif[ExecuteInEditMode]
public class WindArgsController : MonoBehaviour
{private static int _WindForce = Shader.PropertyToID("_WindForce");private static int _WindWavesScale = Shader.PropertyToID("_WindWavesScale");private static int _WindSpeed = Shader.PropertyToID("_WindSpeed");private static int _WindStrengthen = Shader.PropertyToID("_WindStrengthen");private static int _WindDir = Shader.PropertyToID("_WindDir");private static int _MoveHeight = Shader.PropertyToID("_MoveHeight");private static int _MoveHeightPow = Shader.PropertyToID("_MoveHeightPow");public bool windToggle = true;private bool lastWindToggle = false;[Range(0.0f, 1.0f)]public float WindSpeed = 0.3f;private float lastWindSpeed;[Range(0.0f, 1.0f)]public float WindStrengthen = 1;private float lastWindStrengthen = 1;[Range(0.0f, 1.0f)]public float WindWavesScale = 0.25f;private float lastWindWavesScale;[Range(0.0f, 1.0f)]public float WindForce = 0.5f;private float lastWindForce;public bool DirFromForward = true;public Vector4 WindDir = new Vector4(1, 0, 0, 0);private Vector4 lastWindDir;public float MoveHeight = 5.0f;private float lastMoveHeight;[Range(0.001f, 5.0f)]public float MoveHeightPow = 1.0f;private float lastMoveHeightPow;#if UNITY_EDITORpublic float GizmosDirLineSize = 8.0f;public Color GizmosDirLineColor = Color.green;public Color GizmosCircleColor = Color.red;public int GizmosDirHeadCircleLineSegmentNum = 12;public int GizmosDirHeadCircleLineRadius = 2;
#endifprivate void Start(){WindDir = transform.forward;if (windToggle)Shader.EnableKeyword("_WIND_ON");elseShader.DisableKeyword("_WIND_ON");Shader.SetGlobalFloat(_WindSpeed, WindSpeed);Shader.SetGlobalFloat(_WindWavesScale, WindWavesScale);Shader.SetGlobalFloat(_WindForce, WindForce);Shader.SetGlobalVector(_WindDir, WindDir);Shader.SetGlobalFloat(_MoveHeight, MoveHeight);Shader.SetGlobalFloat(_MoveHeightPow, MoveHeightPow);}private void Update(){if (lastWindToggle != windToggle){lastWindToggle = windToggle;if (windToggle)Shader.EnableKeyword("_WIND_ON");elseShader.DisableKeyword("_WIND_ON");}if (lastWindSpeed != WindSpeed){lastWindSpeed = WindSpeed;Shader.SetGlobalFloat(_WindSpeed, WindSpeed);}if (lastWindStrengthen != WindStrengthen){lastWindStrengthen = WindStrengthen;Shader.SetGlobalFloat(_WindStrengthen, WindStrengthen);}if (lastWindWavesScale != WindWavesScale){lastWindWavesScale = WindWavesScale;Shader.SetGlobalFloat(_WindWavesScale, WindWavesScale);}if (lastWindForce != WindForce){lastWindForce = WindForce;Shader.SetGlobalFloat(_WindForce, WindForce);}if (DirFromForward){WindDir = transform.forward;}if (!lastWindDir.Equals(WindDir)){lastWindDir = WindDir;Shader.SetGlobalVector(_WindDir, WindDir);}if (lastMoveHeight != MoveHeight){lastMoveHeight = MoveHeight;Shader.SetGlobalFloat(_MoveHeight, MoveHeight);}if (lastMoveHeightPow != MoveHeightPow){lastMoveHeightPow = MoveHeightPow;Shader.SetGlobalFloat(_MoveHeightPow, MoveHeightPow);}}#if UNITY_EDITORprivate void OnDrawGizmos(){// jave.lin 2021/12/13 - 添加实现 风向 显示的 Gizmosvar transWPos = transform.position;Vector3 transForward;if (DirFromForward){transForward = transform.forward;}else{transForward = WindDir;}// back up gizmos colvar srcCol = Gizmos.color;int count = GizmosDirHeadCircleLineSegmentNum;float curAngle = 0;float perIterateAngle = (2.0f * Mathf.PI) / count;// center lineGizmos.color = GizmosCircleColor;Gizmos.DrawLine(transWPos, transWPos + transForward * GizmosDirLineSize);// local to world matvar L2WMat = transform.localToWorldMatrix;for (int i = 0; i < count; i++){// draw circleGizmos.color = GizmosCircleColor;var cx = Mathf.Cos(curAngle);var cy = Mathf.Sin(curAngle);var cv = new Vector3(cx, cy, 0) * GizmosDirHeadCircleLineRadius;cv = L2WMat.MultiplyVector(cv);curAngle += perIterateAngle;var nx = Mathf.Cos(curAngle);var ny = Mathf.Sin(curAngle);var nv = new Vector3(nx, ny, 0) * GizmosDirHeadCircleLineRadius;nv = L2WMat.MultiplyVector(nv);Gizmos.DrawLine(transWPos + cv, transWPos + nv);// draw dir lineGizmos.color = GizmosDirLineColor;Gizmos.DrawLine(transWPos + cv, transWPos + cv + transForward * GizmosDirLineSize);}// recovery gizmos colorGizmos.color = srcCol;}
#endif
}

效果

Unity Shader - 板砖日志 - 简单的树、草 等植物的 随风飘扬 动画相关推荐

  1. Unity Shader - 搬砖日志 - URP PBR (抄作业篇,持续更新~)

    文章目录 目的 环境 PBR 主要渲染方程 D 项 GGB(desmos) D_Term 完整 Shader G 项 GGB G_Term 完整 Shader F 项 GGB F_Term 完整 Sh ...

  2. Unity Shader - 搬砖日志 - Dithering

    文章目录 什么时 Dithering 色阶纹理图案 - Texture Dither Pattern 程序化 动态 Dithering - 让 RGBA8888 压缩到 RGBA4444 而没有明显色 ...

  3. Unity Shader - 搬砖日志 - 3D Noise, Noise 3D 相关

    文章目录 GLSL noise 3d Project References 备忘,2D 的 noise 有纹理或是现成的比较多 3D noise 在 unity SG 出奇的没有封装 显示再 shad ...

  4. Unity Shader - Simple Toon Shading - 简单卡通渲染

    文章目录 最终效果 - Final Effect 无光照,只有纹理与主色调 Shader 加描边 - Outline GIF Shader 添加光影 - RecieveShadow 自身接收阴影 Sh ...

  5. Unity shader 护盾shield的简单实现

    扰动 直接对uv进行变换就可以了,记得首先把六边形格子地图的Tilling调高点 先预先调成合适大小的六边形,然后repeat铺满整个护盾 1 2 3 4 5 6 // Tiles and offse ...

  6. 2019年6月日记-Unity Shader Graph 菲尼尔简单边缘发光

    ShaderGraph 菲尼尔反射边缘光 创建菲尼尔反射节点,与Color节点相差获得边缘发光的颜色. 控制菲尼尔节点的大小,调出vector1节点来可视化调整. 新建Remap(重映射)节点,将Ti ...

  7. Unity Shader - 类似七龙珠的人物气焰效果

    文章目录 环境 效果 思路 passes pass - 气焰 优化后的 shader Project 关于效果落地 环境 Unity : 2018.3.11f1 Pipeline : BRP 效果 覆 ...

  8. 《Unity Shader入门精要》 第五章 开始学习Unity Shader之旅 笔记

    开始学习Unity Shader之旅 最简单的片元着色器 #pragma vertex vert #pragma fragment frat 告诉Unity那个函数包括顶点着色器的代码,哪个函数包括片 ...

  9. Unity Shader学习案例一: 流光效果

    Unity Shader Lab新手宝典简单Shader案例一:流光效果 + 相关基础知识说明 Shader "Samples/Light Flow"//shader名称 {Pro ...

最新文章

  1. python浪漫代码-Python打造浪漫的心形,助你情人节表白成功!
  2. 2.4.安装spaCy
  3. ASP.NET MVC 获取当前访问域名
  4. SIMD学习 -- 用SSE2指令作点乘和累加计算
  5. Java多线程(四)之ConcurrentSkipListMap深入分析
  6. centos7 docker删除端口映射_centos7安装docker,结合docker安装mysql,学习简单使用
  7. 改善深层神经网络:超参数调整、正则化以及优化——2.6 动量梯度下降法
  8. 开关电源怎么测试文波_开关电源纹波标准与规范测试说明
  9. Intel® Nehalem/Westmere架构/微架构/流水线 (2) - 流水线概述
  10. 全球首发!惯性导航导论(剑桥大学)第四部分
  11. div+css二级菜单
  12. springboot之全局处理异常封装
  13. intelliJ IDEA 怎么添加本地的idea web项目
  14. (转载)web.xml中 IntrospectorCleanupListener的作用
  15. chaos-monkey-spring-boot小试牛刀
  16. linux系统如何启动rpcbind,关于Centos6.8操作系统安装配置nfs、rpcbind服务后实现linux系统间文件数据共享(挂载mount共享路径)...
  17. 键盘没有NumLock这个键 怎样解锁数字键盘?
  18. 微信公众号服务器管理员权限,简析公众号管理员和运营者的区别
  19. oracle 包头 和 包体,PL/SQL 包头和包体
  20. 网易云音乐python爬虫搜索接口,评论接口,歌词接口

热门文章

  1. 总结iOS游戏的设计、营销和盈利方式
  2. 心电matlab,基于matlab检测心电信号
  3. 用计算机控制单片机的程序编写,单片机程序编写步骤
  4. 一张属于程序员的图片
  5. ecshop订单总价币种汇率转换paypal付款
  6. 让你自己制作的木马和病毒用360安全卫士杀不出。加壳,免杀,加花,捆绑,压缩。
  7. 影响员工满意度下降的因素
  8. 计算机组成原理相关知识重要吗?
  9. HCIP课程笔记-06-DR/BDR、OSPF各网络环境下的工作方式、OSPF的hello包、DBD包、LSR包、LSU包、LSAck;
  10. 每日简报 5月16日简报新鲜事 每天一分钟 了解新鲜事