Files
2025-01-25 04:38:09 +08:00

178 lines
6.5 KiB
Plaintext

/*
一个水的效果,这个用于晚上的水效果比较好.
*/
Shader "Ares/Water/Water02"
{
Properties
{
_Color("_Color",Color) = (0.084,0.175,0.221,0.716)
_MainTex ("Texture", 2D) = "white" {}
_BumpMap("Normal Map",2D) = "black"{}
_BumpScale1("BumpScale1",float) = 0.3
_BumpScale2("BumpScale2",float) = 0.9
_WaterShadowColor("WaterShadowColor",Color) = (0.11,0.118,0.141,1)
_DiffusePower("DiffusePower",float) = 0.125
_RimAlpha("RimAlpha",float) = 0
_SpecularColor("SpecularColor",Color) = (0.639,0.689,0.741,1)
_SpecPower("SpecPower",float) = 0.9
_Gloss1("Gloss1",float) = 50
_Gloss2("Gloss2",float) = 50
_Gloss3("Gloss3",float) = 90
_Gloss4("Gloss4",float) = 10
_WaveDir("WaveDir",Vector) = (1.5,4,0.5,4)
_WaveSpeed("WaveSpeed",Vector) = ( 0.1,0.1,0.1,0.1 )
}
SubShader
{
Tags { "Queue" = "Transparent" "GonbestBloomType"="BloomMask"}
LOD 100
Pass
{
Tags { "LightMode" = "ForwardBase" }
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha,Zero OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "UnityCG.cginc"
#include "../Gonbest/Include/Base/MathCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float4 uv : TEXCOORD0;
float4 color:COLOR;
float3 normal:NORMAL;
float4 tangent:TANGENT;
};
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
float4 wn:TEXCOORD2;
float4 wt:TEXCOORD3;
float4 wb:TEXCOORD4;
float4 vcolor:TEXCOORD5;
};
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _MainTex_ST;
float4 _Color; //5
float4 _WaterShadowColor; //6
float _RimAlpha; //7
float _DiffusePower; //9
float _BumpScale1; //10
float _BumpScale2; //11
float4 _SpecularColor; //12
float _SpecPower; //13
float _Gloss1; //14
float _Gloss2; //15
float _Gloss3; //16
float _Gloss4; //17
float4 _WaveSpeed; //18
float4 _WaveDir; //19
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
float3 wp = mul(unity_ObjectToWorld,v.vertex);
o.wn.xyz = GBNormalizeSafe(mul(float4(v.normal,0),unity_WorldToObject).xyz);
o.wt.xyz = GBNormalizeSafe(mul(unity_ObjectToWorld,float4(v.tangent.xyz,1)).xyz);
o.wb.xyz = cross(o.wn.xyz,o.wt.xyz) * v.tangent.w;
o.wt.w = wp.x;
o.wb.w = wp.y;
o.wn.w = wp.z;
o.vcolor = v.color;
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float3 WN0 = GBNormalizeSafe(i.wn.xyz);
float3 V = GBNormalizeSafe(_WorldSpaceCameraPos - float3(i.wt.w,i.wb.w,i.wn.w));
float3 L = GBNormalizeSafe(_WorldSpaceLightPos0);
float NoV = max(0, dot(V,WN0));
float3 H = GBNormalizeSafe(L+V);
float NoH = max(0,dot(WN0,H));
float spec4 = pow(NoH,_Gloss4)*_SpecPower;
float2 uv = TRANSFORM_TEX(i.uv,_MainTex);
float4 wDir = _WaveDir * _Time.y;
float2 uv1 = _WaveSpeed.xy * wDir.xy + uv;
float2 uv2 = _WaveSpeed.zw * wDir.zw * 1.2 + uv;
//基础纹理
float2 mainBG1 = tex2D(_MainTex,uv1).yz;
float2 mainBG2 = tex2D(_MainTex,uv2).yz;
mainBG2 = mainBG2 * mainBG1;
//法线混合
float4 norm = (float4)0;
float4 r8 = (float4)0;
norm.xy = tex2D(_BumpMap,uv1).xy;
norm.xyzw = norm.xyxy * 2 - 1;
norm.xyzw = tex2D(_BumpMap,uv2).xyxy * 2 - 1 + norm.xyzw;
norm.xyzw *= float4(_BumpScale1.xx,_BumpScale2.xx);
//N2
float3 TN1 = float3(norm.zw,sqrt(1 - min(dot(norm.zw,norm.zw),1)));
float3 WN1 = GBNormalizeSafe(TN1.x*i.wt.xyz+TN1.y*i.wb.xyz+TN1.z*i.wn.xyz);
float diff = dot(L,WN1)*_DiffusePower - _DiffusePower + 1;
float spec3 = pow(max(dot(H,WN1),0),_Gloss3) * _SpecPower;
float3 specColor0 = spec4 * spec3 * _SpecularColor * mainBG2.y * mainBG1.y ;
//N2
float3 TN2 = float3(norm.xy,sqrt(1 - min(dot(norm.xy,norm.xy),1)));
float3 WN2 = GBNormalizeSafe(TN2.x*i.wt.xyz+TN2.y*i.wb.xyz+TN2.z*i.wn.xyz);
float spec1 = pow(max(0,dot(WN2,H)),_Gloss1) * _SpecPower;
float spec2 = pow(max(0,dot(WN2,H)),_Gloss1) * _SpecPower;
float3 specColor1 = spec1*_SpecularColor * spec2 * _SpecularColor;
specColor1 += specColor0;
float3 diffColor = mainBG2.x * mainBG1.x * mainBG1.y * mainBG2.y * _DiffusePower * 3;
float3 envColor = (_Color - _WaterShadowColor) * NoV * NoV * NoV;
diffColor = (envColor + _WaterShadowColor)* diff + diffColor;
float3 fColor = UNITY_LIGHTMODEL_AMBIENT * _WaterShadowColor * 2 + diffColor + specColor1;
float a = specColor1.z + _Color.w - NoV + 1;
a = (1- _RimAlpha * i.vcolor.a )* a;
return float4(fColor,a);
}
ENDCG
}
}
}