2021-04-29 19:06发布
文章主要为大家详细介绍了Unity Shader实现水波纹效果,文中示例代码介绍的非常详细
具体代码实现如下:
Shader "Custom/shuibowen"{
Shader
"Custom/shuibowen"
{
Properties{
_MainTex(
"Base (RGB)"
,2D)=
"white"
{}
_distanceFactor(
"Distancefactor"
,
float
)=1
_timeFactor(
"time factor"
)=2
_totalFactor(
"total factor"
)=3
_waveWidth(
"wave width"
)=4
_curWaveDis(
"curwave dis"
)=5
_startPos(
"star pos"
,Vector) = (1,1,1,1)
_MainTex_TexelSize(
"Maintex_texelSize"
,vector)=(1,1,1,1)
}
CGINCLUDE
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
float4 _MainTex_TexelSize;
uniform
_distanceFactor;
_timeFactor;
_totalFactor;
_waveWidth;
_curWaveDis;
uniform float4 _startPos;
fixed4 frag(v2f_img i) : SV_Target
//DX下纹理坐标反向问题
#if UNITY_UV_STARTS_AT_TOP
if
(_MainTex_TexelSize.y < 0>
_startPos.y = 1 - _startPos.y;
#endif
//计算uv到中间点的向量(向外扩,反过来就是向里缩)
float2 dv = _startPos.xy - i.uv;
//按照屏幕长宽比进行缩放
dv = dv * float2(_ScreenParams.x / _ScreenParams.y, 1);
//计算像素点距中点的距离
dis = sqrt(dv.x * dv.x + dv.y * dv.y);
//用sin函数计算出波形的偏移值factor
//dis在这里都是小于1的,所以我们需要乘以一个比较大的数,比如60,这样就有多个波峰波谷
//sin函数是(-1,1)的值域,我们希望偏移值很小,所以这里我们缩小100倍,据说乘法比较快,so...
sinFactor = sin(dis * _distanceFactor + _Time.y * _timeFactor) * _totalFactor * 0.01;
//距离当前波纹运动点的距离,如果小于waveWidth才予以保留,否则已经出了波纹范围,factor通过clamp设置为0
discardFactor = clamp(_waveWidth - abs(_curWaveDis - dis), 0, 1) / _waveWidth;
//归一化
float2 dv1 = normalize(dv);
//计算每个像素uv的偏移值
float2 offset = dv1 * sinFactor * discardFactor;
//像素采样时偏移offset
float2 uv = offset + i.uv;
return
tex2D(_MainTex, uv);
ENDCG
SubShader
Pass
ZTest Always
Cull Off
ZWrite Off
Fog { Mode off }
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
Fallback off
画一个蓝色框 选一个滤镜 自己找 有个水波的 就ok了
1.水波的Shader,2.水花的特效。
实现思路就是场景默认播放水波,当与物体发生碰撞的时候播放水花特效。
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/WaterWave" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_WaveStrength("Wave Strength",Float) = 0.01
_WaveFactor("Wave Factor",Float) = 50
_TimeScale("Time Scale",Float) = 10
SubShader {
#pragma vertex vert
struct appdata
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float4 vertex:SV_POSITION;
float2 uv:TEXCOORD0;
sampler2D _MainTex;
float _WaveStrength;
float _WaveFactor;
float _TimeScale;
v2f vert (appdata v)
v2f o;
o.uv = v.uv;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
fixed4 frag(v2f IN):COLOR
fixed2 uvDir = normalize(IN.uv - fixed2(0.5, 0.5));
fixed dis = distance(IN.uv, fixed2(0.5, 0.5));
fixed2 uv = IN.uv + _WaveStrength * uvDir * sin(_Time.y * _TimeScale + dis * _WaveFactor);
return tex2D(_MainTex, uv);
FallBack "Diffuse" FallBack "Diffuse"
可以直接使用水波纹的模型,纹理有做好的水波纹效果。
如果想自己制作,就要用到shader写代码了。
还是要学好编程基础呀如果你觉得编程很苦难 不一定要从c#开始学 学学js flash as等等 有个梯度就好多了如果要用好unity 不会编程那是不行的 学习的过程中都有个头疼的过程 记住 头越痛 代表你要接受的东西越多 坚持 你的大脑在和知识兼容中:D...
可以先思考学习的目的,是什么因素在驱动你。是完成一款作品?进入某个行业?还是探究某类问题?否则和技术相关的知识浩如烟海,很容易迷失在细枝末节上。而要找到动力源头。个人的经验,就是关注一些和自己同方向,同类型的创作者。他们输出的作品会激励你,...
可以让模型师直接作出这样的形状,如果用纯Unity制作,就要用基本游戏对象拼接了,包括楼梯,城堡,都可以拼接出来。正常情况不会这样做,因为不够精美,都是建模师来实现,毕竟Unity不属于专业的建模软件,侧重于实现功能。...
Shader Unlit/Test{Properties{_MainTex(MainTex,2D)=white{}_MainColor(MainColor,COLOR)=(1,1,1,1)_AddTex(AddTex,2D)=white{}_Maxset(Max,Range(0.1,1.0))=0.1}SubShader{Tags{RenderType=Transparent Queue=Tran...
策划的最基本的原则就是:改进缺点,做别人没有做到的。无论游戏策划还是其它策划都是一样! 游戏策划的第二个原则:放飞思想。也许你认为我是说策划们应该充满想象力,能想一些匪夷所思的东西!对不起。不是这意思!一个合格的策划不是为了发泄自己的...
可以多玩一些其它的游戏,看一些科幻电影等,寻找灵感。
游戏架构与设计不纯粹是一门科学,它不需要提出假设或探究真理,也不被逻辑或正规方法的严格标准所束缚。游戏的目的就是通过玩来获得娱乐,因此游戏设计即需要艺术家一样的创造力,也需要工程师一样的精心规划。游戏设计是一门手艺,就像好莱坞的电影摄像或服...
void Update(){ transform.rotation = Quaternion.Euler(Vector3.zero);}可以试一下,保证物体x轴和z轴为0就可以使其一直垂直。
界面左右移动、上下移动。。本质都是:手指滑动。。。可以参考这些:https://www.cnblogs.com/coldcode/p/5362537.htmlhttps://blog.csdn.net/totosj/article/details/80112852https://blog.csdn.net/zcc858079762/article/details/85253120...
首先新建一个C#脚本,命名为MyFollow,然后把以下代码粘贴进去,保存:AخA 1using UnityEngine;2using System.Collections;3public class MyFollow : MonoBehaviour4{5 public float distanceAway = 5; // distance...
安装高通的Vuforia插件即可。
不可以,只能一个工程打一个包。
Edit->Project Settings->Graphics 找到Shader Stripping 中fog mode设置为custom(原来是Automatic),然后选中你想要的模式,最后重新打包就ok
用到的插件:System.Drawing.dllSystem.Windows.Forms.dllSystem.Deployment.dll(运用基于.Net4.x的dll打包时,需要用到该dll,否则会报错)代码如下:using System;using System.Runtime.InteropServices;using UnityEngine;using UnityEngine.UI; p......
如下图,设置为none,然后删掉滑动条就可以了。
最多设置5个标签!
文章主要为大家详细介绍了Unity Shader实现水波纹效果,文中示例代码介绍的非常详细
具体代码实现如下:
Shader
"Custom/shuibowen"
{
Properties{
_MainTex(
"Base (RGB)"
,2D)=
"white"
{}
_distanceFactor(
"Distancefactor"
,
float
)=1
_timeFactor(
"time factor"
,
float
)=2
_totalFactor(
"total factor"
,
float
)=3
_waveWidth(
"wave width"
,
float
)=4
_curWaveDis(
"curwave dis"
,
float
)=5
_startPos(
"star pos"
,Vector) = (1,1,1,1)
_MainTex_TexelSize(
"Maintex_texelSize"
,vector)=(1,1,1,1)
}
CGINCLUDE
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
float4 _MainTex_TexelSize;
uniform
float
_distanceFactor;
uniform
float
_timeFactor;
uniform
float
_totalFactor;
uniform
float
_waveWidth;
uniform
float
_curWaveDis;
uniform float4 _startPos;
fixed4 frag(v2f_img i) : SV_Target
{
//DX下纹理坐标反向问题
#if UNITY_UV_STARTS_AT_TOP
if
(_MainTex_TexelSize.y < 0>
_startPos.y = 1 - _startPos.y;
#endif
//计算uv到中间点的向量(向外扩,反过来就是向里缩)
float2 dv = _startPos.xy - i.uv;
//按照屏幕长宽比进行缩放
dv = dv * float2(_ScreenParams.x / _ScreenParams.y, 1);
//计算像素点距中点的距离
float
dis = sqrt(dv.x * dv.x + dv.y * dv.y);
//用sin函数计算出波形的偏移值factor
//dis在这里都是小于1的,所以我们需要乘以一个比较大的数,比如60,这样就有多个波峰波谷
//sin函数是(-1,1)的值域,我们希望偏移值很小,所以这里我们缩小100倍,据说乘法比较快,so...
float
sinFactor = sin(dis * _distanceFactor + _Time.y * _timeFactor) * _totalFactor * 0.01;
//距离当前波纹运动点的距离,如果小于waveWidth才予以保留,否则已经出了波纹范围,factor通过clamp设置为0
float
discardFactor = clamp(_waveWidth - abs(_curWaveDis - dis), 0, 1) / _waveWidth;
//归一化
float2 dv1 = normalize(dv);
//计算每个像素uv的偏移值
float2 offset = dv1 * sinFactor * discardFactor;
//像素采样时偏移offset
float2 uv = offset + i.uv;
return
tex2D(_MainTex, uv);
}
ENDCG
SubShader
{
Pass
{
ZTest Always
Cull Off
ZWrite Off
Fog { Mode off }
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
ENDCG
}
}
Fallback off
}
画一个蓝色框 选一个滤镜 自己找 有个水波的 就ok了
1.水波的Shader,2.水花的特效。
实现思路就是场景默认播放水波,当与物体发生碰撞的时候播放水花特效。
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/WaterWave" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_WaveStrength("Wave Strength",Float) = 0.01
_WaveFactor("Wave Factor",Float) = 50
_TimeScale("Time Scale",Float) = 10
}
SubShader {
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float4 vertex:SV_POSITION;
float2 uv:TEXCOORD0;
};
sampler2D _MainTex;
float _WaveStrength;
float _WaveFactor;
float _TimeScale;
v2f vert (appdata v)
{
v2f o;
o.uv = v.uv;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag(v2f IN):COLOR
{
fixed2 uvDir = normalize(IN.uv - fixed2(0.5, 0.5));
fixed dis = distance(IN.uv, fixed2(0.5, 0.5));
fixed2 uv = IN.uv + _WaveStrength * uvDir * sin(_Time.y * _TimeScale + dis * _WaveFactor);
return tex2D(_MainTex, uv);
}
ENDCG
}
}
FallBack "Diffuse" FallBack "Diffuse"
}
可以直接使用水波纹的模型,纹理有做好的水波纹效果。
如果想自己制作,就要用到shader写代码了。
相关问题推荐
还是要学好编程基础呀如果你觉得编程很苦难 不一定要从c#开始学 学学js flash as等等 有个梯度就好多了如果要用好unity 不会编程那是不行的 学习的过程中都有个头疼的过程 记住 头越痛 代表你要接受的东西越多 坚持 你的大脑在和知识兼容中:D...
可以先思考学习的目的,是什么因素在驱动你。是完成一款作品?进入某个行业?还是探究某类问题?否则和技术相关的知识浩如烟海,很容易迷失在细枝末节上。而要找到动力源头。个人的经验,就是关注一些和自己同方向,同类型的创作者。他们输出的作品会激励你,...
可以让模型师直接作出这样的形状,如果用纯Unity制作,就要用基本游戏对象拼接了,包括楼梯,城堡,都可以拼接出来。正常情况不会这样做,因为不够精美,都是建模师来实现,毕竟Unity不属于专业的建模软件,侧重于实现功能。...
Shader Unlit/Test{Properties{_MainTex(MainTex,2D)=white{}_MainColor(MainColor,COLOR)=(1,1,1,1)_AddTex(AddTex,2D)=white{}_Maxset(Max,Range(0.1,1.0))=0.1}SubShader{Tags{RenderType=Transparent Queue=Tran...
策划的最基本的原则就是:改进缺点,做别人没有做到的。无论游戏策划还是其它策划都是一样! 游戏策划的第二个原则:放飞思想。也许你认为我是说策划们应该充满想象力,能想一些匪夷所思的东西!对不起。不是这意思!一个合格的策划不是为了发泄自己的...
可以多玩一些其它的游戏,看一些科幻电影等,寻找灵感。
游戏架构与设计不纯粹是一门科学,它不需要提出假设或探究真理,也不被逻辑或正规方法的严格标准所束缚。游戏的目的就是通过玩来获得娱乐,因此游戏设计即需要艺术家一样的创造力,也需要工程师一样的精心规划。游戏设计是一门手艺,就像好莱坞的电影摄像或服...
void Update(){ transform.rotation = Quaternion.Euler(Vector3.zero);}可以试一下,保证物体x轴和z轴为0就可以使其一直垂直。
界面左右移动、上下移动。。本质都是:手指滑动。。。可以参考这些:https://www.cnblogs.com/coldcode/p/5362537.htmlhttps://blog.csdn.net/totosj/article/details/80112852https://blog.csdn.net/zcc858079762/article/details/85253120...
首先新建一个C#脚本,命名为MyFollow,然后把以下代码粘贴进去,保存:AخA 1using UnityEngine;2using System.Collections;3public class MyFollow : MonoBehaviour4{5 public float distanceAway = 5; // distance...
安装高通的Vuforia插件即可。
不可以,只能一个工程打一个包。
Edit->Project Settings->Graphics 找到Shader Stripping 中fog mode设置为custom(原来是Automatic),然后选中你想要的模式,最后重新打包就ok
用到的插件:System.Drawing.dllSystem.Windows.Forms.dllSystem.Deployment.dll(运用基于.Net4.x的dll打包时,需要用到该dll,否则会报错)代码如下:using System;using System.Runtime.InteropServices;using UnityEngine;using UnityEngine.UI; p......
如下图,设置为none,然后删掉滑动条就可以了。