github unity 图片切换效果_[图解]Unity3D雨天Shader效果的制作!

蛮牛:最近群友反馈,希望多发一些Shader的内容和其他进阶的内容,所以...

本篇将图解每个步骤,让大家都可以看懂~

效果预览

现在我们先做涟漪部分

首先Shader 需要一个 材质时间 ,Frac 函数可以让我们得到这样一条曲线

float3 emissive = Frac((_Time *_speed));
5889f88cb365e64dc8329c6f364c3694.png

我们先直接返回到屏幕可以看到这样的黑白渐变效果 return float4(emissive,1);

8960263b6949b86b7b756d187d82e431.gif

下面我们需要准备一张这样的图片(如何生成这张图片那就是在水一篇了,滑稽.jpg)

文章底部打包下载链接

fb62ca34d7d0dd427e6b5b6aaacc4acf.png

用刚才的那张黑白渐变图 反向后 减去这张,会得到下图的效果

float3 emissive = 1-(Frac((_Time *_speed)));
float3 _Texture_var = tex2D(_Texture,TRANSFORM_TEX(i.uv0, _Texture)).rgb;
return float4(emissive - _Texture_var,1);

f9c826674451bf175949558bebdeb6bb.gif

接着 使用距离函数 distance 来进一步计算得到圆环形状,原理如下

distance 和 0.05 比较

0.05 = 0 黑 0.05< 灰/白 0.05 > 灰/白

float3 emissive = 1-(Frac((_Time *_speed)));
float3 _Texture_var = tex2D(_Texture,TRANSFORM_TEX(i.uv0, _Texture)).rgb;
float maskColor = distance(emissive.r - _Texture_var.r,0.05);
return float4(maskColor,maskColor,maskColor,1);
d95b38f7e28d99671aa59b76d19f502e.png

然后我们会得到这样一张图

1b9cf893aa2bc5535d47575fd138d29d.gif

然后再让这张图除以 0.05

float3 emissive = 1-(Frac((_Time *_speed)));
float3 _Texture_var = tex2D(_Texture,TRANSFORM_TEX(i.uv0, _Texture)).rgb;
float maskColor = subtract(distance(emissive.r - _Texture_var.r,0.05)/0.05);
return float4(maskColor,maskColor,maskColor,1);
5bc3ecd08a7f0186851769e181ad1d60.png

会得到下图效果,此时基础的涟漪Mask 就有了

cd29924b3bc6807c88e302f903799ddb.gif

通过偏移时间并对刚才过程如法炮制并偏移一点UV 将两张图Add到一起,混合的时候可以引入sin曲线 让两图图交替淡入

01fdce3b6e5a6f537a63b149b5a9ab77.gif

float3 emissive = 1-(Frac((_Time *_speed)));
float3 emissive2 = 1-(Frac((_Time *_speed)+ 0.5));//偏移一点时间,让涟漪扩散时间错开float3 _Texture_var = tex2D(_Texture,TRANSFORM_TEX(i.uv0, _Texture)).rgb;
//UV 也偏移一点,让两张图错开一些float3 _Texture_var2 = tex2D(_Texture,TRANSFORM_TEX(i.uv0 + float2(0.5,0.5), _Texture)).rgb;
float maskColor = saturate(1 - distance(emissive.r - _Texture_var.r,0.05)/0.05);
float maskColor2 = saturate(1 - distance(emissive2.r - _Texture_var2.r,0.05)/0.05);
float maskSwitch = saturate(abs(sin((_Time * 0.5))));//两张图交替淡入float finalColor = lerp(maskColor , maskColor2 ,maskSwitch );
return float4(finalColor ,finalColor ,finalColor ,1);

931e41d6e379a8c7a47ad5fdf4393384.gif

涟漪现在有了,我们开始制作 墙面/玻璃 流水的效果 ,首先流水的部分肯定是垂直于地面,我们可以用世界空间位置来投影

我们使用这张图 水痕图

e4e12a8e7b7edf24a1e0ca6262493d27.png

以世界空间xy ,zy投影后 再使用 世界空间abs(normalDir)方向 来控制投影的范围 可以得到这样的效果

            struct VertexInput {
float4 vertex : POSITION;
float2 texcoord0 : TEXCOORD0;
float3 normal : NORMAL;
};
struct VertexOutput {
float4 pos : SV_POSITION;
float2 uv0 : TEXCOORD0;
float4 posWorld : TEXCOORD1;
float3 normalDir : TEXCOORD2;
float4 objectPos : TEXCOORD3;
};
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.uv0 = v.texcoord0;
o.pos = UnityObjectToClipPos( v.vertex );
o.posWorld = mul(unity_ObjectToWorld, v.vertex);
o.normalDir = normalize(UnityObjectToWorldNormal(v.normal));
o.objectPos = mul(unity_ObjectToWorld, float4(0, 0, 0, 1));
return o;
}
float4 frag(VertexOutput i) : COLOR {
float2 verticalUv = float2(i.posWorld.x, i.posWorld.y) * _Tiling;
float2 verticalUv2 = float2(i.posWorld.z, i.posWorld.y) * _Tiling;
float4 Texture_var = tex2D(_Texture, TRANSFORM_TEX(verticalUv, _Texture) );
float4 Texture_var2 = tex2D(_Texture, TRANSFORM_TEX(verticalUv2, _Texture) );
float4 finalColor = lerp(Texture_var ,Texture_var2 , abs(i.normalDir.x));
return float4(finalColor);
}

fc3b4b82005d47f00e52da54dbf7d9ac.png

这时我们移动球,贴图是在世界方向固定的

06dc135336a5838ce4f6b6237aa37b02.gif

如果想跟随球体只需要 物体坐标 减去 世界坐标 即可

                float2 verticalUv = float2(i.objectPos.x - i.posWorld.x, i.objectPos.y - i.posWorld.y) * _Intensity;
float2 verticalUv2 = float2(i.objectPos.z - i.posWorld.z, i.objectPos.y - i.posWorld.y) * _Intensity;

0ad5e55f792a2585a64c5b97b784a128.gif

我们这时需要再增加一张Mask贴图

df117029165447029a75745e9e039290.png

然后乘以刚才的水痕图 并控制UV 移动得到这样的流动效果

7ef74ed33dcd421aabcefe2a389db2c8.gif

最后再用 i.normalDir.y 来区分顶面和侧面

ee9ae9ebf6fa086bcd690f42f9677868.png

e2cf22403374f25410156aeab79914ae.gif

接下来你可以把这个黑白图 当成高光,转换为法线,增亮Diffuse 等等,

如果你用的是一些光照模型,例如PBR 只需要传入相应的通道就可以了

关于法线还有一些特殊的地方 由于是世界空间投影所以 在背面UV会是反向的,对于Diffuse来说 重复的纹理反向的也没什么问题,但对于法线来说给人的凹凸感就是反的 ,所以需要特殊处理一下 ,两个投影面xy ,zy分别是

if(i.normalDir.z < 0)
{
return UV;
}
else
{
float x = UV.x;
x = -x + 1;
return float2(x, UV.y);
}

if(i.normalDir.x > 0)
{
return UV;
}
else
{
float x = UV.x;
x = -x + 1;

return float2(x, UV.y);
}
ebc176205e5ac36e9d03ba126b60c96d.png

我们增加上法线后的效果 ,现在根题图效果只差 后处理,粒子系统 了

https://github.com/Unity-Technologies/PostProcessing

使用到的后处理有:

  • 屏幕空间反射

  • 屏幕空间AO

  • 景深

  • Color Grading(ACES )

  • Bloom

  • 粒子系统 :略

贴图打包下载:

链接: pan.baidu.com/s/1jyD5yE 提取码: hmjg

参考:

Rainy Surface Shader Part 1: Ripples

https://deepspacebanana.github.io/deepspacebanana.github.io/blog/shader/art/unreal%20engine/Rainy-Surface-Shader-Part-1

来源知乎作者:面向搜索引擎编程

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要下载Unity滑动效果插件,需要遵循以下步骤: 1. 打开一个可靠的资源网站,比如Unity Asset Store、Github等,确保能够安全和合法地下载插件。 2. 在资源网站的搜索栏中输入关键词“滑动效果插件”或具体的插件名称。 3. 得出搜索结果后,阅读插件的描述、评级和用户评论等信息,以便判断是否满足你的需求。 4. 确认插件后,点击相应的下载按钮或链接。 5. 根据网站的指示和要求,可能需要进行注册并提供相关信息,以便完成插件的下载和安装。 6. 下载完成后,双击插件文件或选择导入插件的方式将其添加到Unity项目中。 7. 在Unity编辑器中,根据插件的文档和指示,使用相应的代码或UI元素将滑动效果应用到场景中的对象上。 8. 调试和调整滑动效果,确保其在游戏或应用中的表现符合预期。 9. 如果遇到问题或需要进一步的指导,可以查阅插件的文档、教程或寻求社区的帮助。 总结起来,下载Unity滑动效果插件的步骤包括搜索、选择、下载、安装、应用和调试。通过正确的流程和谨慎的选择,可以方便地获得所需的插件并增强Unity项目的滑动效果。 ### 回答2: Unity是一款功能强大的跨平台游戏开发引擎,它提供了各种各样的插件和扩展来帮助开发者实现各种效果。针对滑动效果Unity的Asset Store中有很多滑动效果插件可以下载使用。 其中一个比较受欢迎的插件是"Mobile Swipe Menu"。这个插件提供了一个简单易用的界面,可以快速实现滑动菜单的效果。开发者只需将插件导入Unity项目中,在场景中放置好滑动菜单的UI元素,然后调用相应的API即可实现滑动效果。插件还提供了丰富的配置项,可以自定义滑动的方向、速度以及结束位置等。 另外一个插件是"DoozyUI: Complete UI Management System"。这个插件不仅支持滑动效果,还提供了更多的功能。它包含了各种UI元素的管理器,可以轻松地创建和管理复杂的UI界面。开发者可以使用插件提供的可视化编辑器来自定义滑动效果,并且可以在场景中预览效果。插件还支持多平台适配,开发者可以在不同的设备上实现一致的滑动效果。 除了这两个插件,还有许多其他的滑动效果插件可供选择。开发者可以在Unity的Asset Store中搜索"滑动效果"等关键词,浏览并下载适合自己项目需求的插件。 总之,Unity提供了许多滑动效果插件供开发者使用。这些插件可以帮助开发者快速实现滑动效果,提高开发效率,同时还可根据项目需求进行自定义和调整。 ### 回答3: Unity中的滑动效果插件有很多种,可以根据不同的需求选择合适的插件进行下载使用。以下是几款常用的Unity滑动效果插件: 1. EasyTouch:EasyTouch是一个功能强大且易于使用的滑动效果插件。它可以在Unity中实现触控、手势、摇杆等多种交互效果,适用于2D和3D场景。你可以在Unity Asset Store中搜索并下载它。 2. TouchKit:TouchKit是一个专门为移动设备设计的滑动效果插件,它为Unity开发者提供了一套简单易用的触控解决方案。使用TouchKit,你可以轻松实现触摸、滑动、拖拽等交互效果。 3. FingerGestures:FingerGestures是一个高度自定义的滑动效果插件,它提供了强大的手势识别功能,可以轻松地实现滑动、缩放、旋转等多种触摸交互效果。你可以在Unity官方Asset Store中找到并下载。 4. LeanTouch:LeanTouch是一个免费且易于使用的滑动效果插件,它提供了一套简单而强大的触摸解决方案。LeanTouch支持多点触摸、拖拽、旋转、缩放等多种交互效果,并可以方便地集成到你的Unity项目中。 无论你选择哪种滑动效果插件,都可以在Unity Asset Store中找到并下载。根据你的需求和项目要求,选择合适的插件并按照它们的说明进行安装和使用即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值