您的位置:首页 > 移动开发 > Unity3D

Unity ShaderLab: 2D/3D Wave Flag Shader(飘动旗帜)的实现

2017-04-25 19:23 1596 查看
个人实现的第一个在实际项目中使用的shader。

2D Wave Flag Shader

效果图:



Shader "Custom/WaveFlag2D"
{

Properties
{
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Texture", 2D) = "white" { }
_WaveX ("Wave x", Range(0, 1))  = 0.1
_WaveZ ("Wave z", Range(0, 1)) = 0.1
_WindSpeed("Wind Speed", Range(50,200)) = 100
}

SubShader
{
Pass
{
CULL Off

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "AutoLight.cginc"

float4 _Color;
sampler2D _MainTex;
fixed _WaveX;
fixed _WaveZ;
float _WindSpeed;

struct a2v {
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;
};

struct v2f {
float4 pos : POSITION;
float2 uv: TEXCOORD0;
};

v2f vert (a2v v) {
v2f o;

float angle= _Time * _WindSpeed;

if(v.vertex.x < 5)
{
v.vertex.z = v.vertex.z + sin(v.vertex.x + angle) * _WaveX ;
v.vertex.x = v.vertex.x + sin(v.vertex.z + angle) * _WaveZ;
}

v.vertex.z -=  (v.vertex.x) * 0.4;

o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
o.uv = v.texcoord;

return o;
}

float4 frag (v2f i) : COLOR
{
half4 color = saturate(tex2D(_MainTex, i.uv)) * 0.8;
return color;
}

ENDCG

}
}
Fallback "VertexLit"
}


3D Wave Flag Shader

效果图:



Shader "Custom/WaveFlag3D"
{

Properties
{
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Texture", 2D) = "white" { }
_WaveY ("Wave y", Range(0, 1))  = 0.1
_WindSpeed("Wind Speed", Range(50,200)) = 100
}

SubShader
{
Pass
{
CULL Off

CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "AutoLight.cginc"

float4 _Color;
sampler2D _MainTex;
fixed _WaveY;
float _WindSpeed;

struct a2v {
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;
};

struct v2f {
float4 pos : POSITION;
float2 uv: TEXCOORD0;
};

v2f vert (a2v v) {
v2f o;

float angle= _Time * _WindSpeed;

if(v.vertex.z < 5)
v.vertex.y = v.vertex.y + sin(v.vertex.z + v.vertex.x + angle) * _WaveY;

v.vertex.x = v.vertex.x  + v.vertex.z * 0.4;

o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
o.uv = v.texcoord;
return o;
}

float4 frag (v2f i) : COLOR
{
half4 color = saturate(tex2D(_MainTex, i.uv.xy));
return color;
}

ENDCG
}
}
Fallback "VertexLit"
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: