先上图

1.水shader
Shader "Game_XXX/whater" {
Properties {
_WaterTex ("Normal Map (RGB), Foam (A)", 2D) = "white" {}
_WaterTex2 ("Normal Map (RGB), Foam (B)", 2D) = "white" {}
_Tiling ("Wave Scale", Range(0.00025, 0.1)) = 0.25
_WaveSpeed("Wave Speed", Float) = 0.4
_SpecularRatio ("Specular Ratio", Range(10,500)) = 200
_BottomColor("Bottom Color",Color) = (0,0,0,0)
_TopColor("Top Color",Color) = (0,0,0,0)
_Alpha("Alpha",Range(0,1)) = 1
_ReflectionTex("_ReflectionTex", 2D) = "black" {}
_ReflectionLight("ReflectionLight",Range(0,1)) = 0.3
_LightColorSelf ("LightColorSelf",Color) = (1,1,1,1)
_LightDir ("LightDir",vector) = (0,1,0,0)
}
SubShader {
Tags {
"Queue"="Transparent-200"
"RenderType"="Transparent"
"IgnoreProjector" = "True"
"LightMode" = "ForwardBase"
}
LOD 250
Pass{
Lighting On
ZWrite On
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex Vert
#pragma fragment Frag
#include "UnityCG.cginc"
float _Tiling;
float _WaveSpeed;
float _SpecularRatio;
sampler2D _WaterTex;
sampler2D _WaterTex2;
sampler2D _ReflectionTex;
float4 _LightColorSelf;
float4 _LightDir;
float4 _BottomColor;
float4 _TopColor;
float _Alpha;
float _ReflectionLight;
struct v2f
{
float4 position : POSITION;
float3 worldPos : TEXCOORD0;
float3 tilingAndOffset:TEXCOORD2;
float4 screen:TEXCOORD3;
float4 VertColor :TEXCOORD4;
};
v2f Vert(appdata_full v)
{
v2f o;
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
o.position = UnityObjectToClipPos(v.vertex);
//uv动画
o.tilingAndOffset.z =frac( _Time.x * _WaveSpeed);
o.tilingAndOffset.xy = o.worldPos.xz*_Tiling;
o.screen = ComputeScreenPos(o.position);
o.VertColor = v.color;
return o;
}
float4 Frag(v2f i):COLOR
{
float3 lightColor=_LightColorSelf.rgb*2;
//世界视向量
float3 worldView = -normalize(i.worldPos - _WorldSpaceCameraPos);
float2 tiling = i.tilingAndOffset.xy;
//法线采样
float4 N1 = tex2D(_WaterTex, tiling.yx +float2(i.tilingAndOffset.z,0));
float4 N2 = tex2D(_WaterTex2, tiling.yx -float2(i.tilingAndOffset.z,0));
//两个法线相加,转世界空间,这里没有unpack,所以法线贴图不需要转normal 法线贴图为0-1 两张加起来为0-2 将其x2-2,转换为-2 --2然后将其normalize,变成-1到1
//在遇到两张法线的情况下 ,一般将法线相加 再normalize
float3 worldNormal = normalize((N1.xyz+N2.xyz)*2-2);
//以垂直的方向代替灯光 跟法线做点积 得到漫反射强度
float LdotN = dot(worldNormal, float3(0,1,0));
fixed2 uv = i.screen.xy/(i.screen.w

本文介绍了一种用于游戏开发中的水体Shader实现方法,包括波动效果、反射纹理渲染等关键技术点。同时,提供了使用C#脚本来实现反射相机的具体步骤。
&spm=1001.2101.3001.5002&articleId=78919220&d=1&t=3&u=57d691ec73cf4895978e934a4e0fe0e6)
2992

被折叠的 条评论
为什么被折叠?



