【Unity3d Shader】水面和岩浆效果

游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。

实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。

有要思路是

1,uv按时间去做正弦波移动

2,在1的基础上加个凹凸图混合uv

3,在1、2的基础上加个水流方向

4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)

Shader "mgo/water" 
{
	Properties
	{
		_MainTex("MainTex", 2D) = "White" {}
		_MainColor("MainColor", Color) = (1, 1, 1, 1)
		_F("length", range(1, 200)) = 50
		_A("amplitude", range(0, 0.2)) = 0.04 //幅度值
		_S("speed", range(0, 30)) = 2
		_Tiling("tiling", range(0, 1)) = 1

		_BumpTex("BumpTex", 2D) = "White" {}
		_BumpA("BumpAmplitude", range(0, 100)) = 1 //幅度值

		_UVSpeed("UVSpeed", range(0, 1)) = 0.2

	}

	SubShader
	{
		Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" }
		pass
		{
			Cull Off
			Lighting Off
			ZWrite On
			Blend SrcAlpha OneMinusSrcAlpha

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

			uniform sampler2D _MainTex;
			uniform float4 _MainTex_ST;
			uniform float _F;
			uniform float _A;
			uniform float _S;
			uniform float _Tiling;
			uniform half4 _MainColor;

			uniform sampler2D _BumpTex;
			uniform float _BumpA;

			uniform float _UVSpeed;

			struct v2f {
				float4 pos:POSITION;
				float2 uv:TEXCOORD0;
				UNITY_FOG_COORDS(2)
			};

			struct data
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			v2f vert(data v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				UNITY_TRANSFER_FOG(o, o.pos);
				return o;
			}
			fixed4 frag(v2f IN) : COLOR
			{
				float2 uv = IN.uv;
				float scale = 0;

				scale += _A * sin(-uv.y * _Tiling * _F + _BumpA * (tex2D(_BumpTex, uv).r) + _Time.y * _S);
				uv = uv + uv * scale;
				uv.y = uv.y + -_Time.y * _UVSpeed;
				
				fixed4 color = tex2D(_MainTex, uv);
				color.rgb *= _MainColor.rgb;
				color.a = _MainColor.a;
				UNITY_APPLY_FOG(IN.fogCoord, color);
				
				return color;
			}
			ENDCG
		}
	}
		FallBack "Diffuse"
}

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值