找回密码
 立即注册
查看: 641|回复: 0

[笔记] Unity空间跳跃效果Shader

[复制链接]
发表于 2020-12-30 09:50 | 显示全部楼层 |阅读模式
诱导已亮,前方净空,准许跳跃,诸君武运昌隆!

正面视角
https://www.zhihu.com/video/1020458059247874048

环绕视角
https://www.zhihu.com/video/1020458082576531456
妈的,这两个月以来的工作竟然让我对敲代码有了一种疏离感,真的太累了。由衷感谢Unity,感谢辻本良三……啊,还有感谢我女朋友。
这两天随便做的一个小玩具,Shader代码放下面,基本逐句注释了,就不多说了……顺带一提GrabPass这种东西PC上玩玩就好,移动端我貌似记得用不了?(求确认)
最后感谢Lex-DRL的SimplexNoise实现。
  1. Shader "Unlit/SpaceJumpArea"
  2. {
  3.         Properties
  4.         {
  5.                 //拉扯的力度
  6.                 _Jitter ("Jitter", Range(0, 0.1)) = 0.1
  7.                 //拉扯的粒度
  8.                 _Density("Density", Range(1, 100)) = 50
  9.                 //拉扯的频率
  10.                 _TimeScale("TimeScale", Range(0, 100)) = 1
  11.                 //中心保持平静的区域门槛
  12.                 _Threshold("Threshold", Range(0, 1)) = 0.35
  13.         }
  14.         SubShader
  15.         {
  16.                 //在所有不透明对象之后绘制,防止出现天空球抓取不到的问题
  17.                 Tags { "RenderType"="Transparent" }
  18.                 //抓取已渲染的部分到缓存中
  19.                 GrabPass { "_SpaceTexture" }
  20.                 //裁剪表面,只显示背面
  21.                 Cull Front
  22.                 LOD 100
  23.                 Pass
  24.                 {
  25.                         CGPROGRAM
  26.                         #pragma vertex vert
  27.                         #pragma fragment frag
  28.                        
  29.                         #include "UnityCG.cginc"
  30.                         #include "noiseSimplex.cginc"
  31.                         struct appdata
  32.                         {
  33.                                 float4 vertex : POSITION;
  34.                                 float2 uv : TEXCOORD0;
  35.                         };
  36.                         struct v2f
  37.                         {
  38.                                 float4 vertex : SV_POSITION;
  39.                                 float4 modelPos : TEXCOORD2;
  40.                         };
  41.                         sampler2D _SpaceTexture;
  42.                         float _Density;
  43.                         float _Jitter;
  44.                         float _TimeScale;
  45.                         float _Shake;
  46.                         float _Threshold;
  47.                         v2f vert (appdata v)
  48.                         {
  49.                                 v2f o;
  50.                                 o.vertex = UnityObjectToClipPos(v.vertex);
  51.                                 o.modelPos = v.vertex;
  52.                                 return o;
  53.                         }
  54.                        
  55.                         fixed4 frag (v2f i) : SV_Target
  56.                         {
  57.                                 //snoise来自Lex-DRL
  58.                                 //2D / 3D / 4D optimised Perlin Noise Cg/HLSL library (cginc) - Unity Forum
  59.                                 //https://forum.unity.com/threads/2d-3d-4d-optimised-perlin-noise-cg-hlsl-library-cginc.218372/
  60.                                 //获取拉扯幅度分布
  61.                                 float noise = snoise(float2(atan(i.modelPos.x / i.modelPos.y) * _Density, _Time.y * _TimeScale));
  62.                                 //获取拉扯的方向
  63.                                 float3 dir = normalize(float3(0,0,1) - i.modelPos.xyz);
  64.                                 float d = abs(dot(dir, normalize(i.modelPos)));
  65.                                 //根据拉扯的方向和球心到球面方向的点积,判断拉扯的程度,为中心部分制造一片不需要拉扯的平静区域
  66.                                 float needDraw = abs(d - _Threshold);
  67.                                 needDraw = needDraw + (1 - step(needDraw, 1)) * needDraw;
  68.                                 //拉扯GrabPass里存下的缓存
  69.                                 float4 grabuv = ComputeGrabScreenPos(UnityObjectToClipPos(float4(i.modelPos.xyz + dir * noise * _Jitter * needDraw, 1)));
  70.                                 float4 col = tex2Dproj(_SpaceTexture, grabuv);
  71.                                 return float4(col.xyz, 1);
  72.                         }
  73.                         ENDCG
  74.                 }
  75.         }
  76. }
复制代码
Github地址:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-12-23 12:25 , Processed in 0.094231 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表