Unity水面Shader实现详解
创作时间:
作者:
@小白创作中心
Unity水面Shader实现详解
引用
1
来源
1.
https://bbs.huaweicloud.com/blogs/442614
在Unity中实现逼真的水面效果是许多游戏开发者追求的目标。本文将详细介绍如何通过编写自定义Shader来实现这一效果,包括具体的代码实现和材质设置步骤。
效果预览
Shader代码实现
首先,创建一个新的Shader文件,并命名为"Custom/WaterShader"。以下是完整的Shader代码:
Shader "Custom/WaterShader"
{
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+0.0001);
uv.y = 1-uv.y;
fixed4 refTex = tex2D (_ReflectionTex,uv + worldNormal.xy*0.02 );
//这个变量一般在Forward渲染路径下使用,存储的是重要的pixel光源方向,没错,的确是使用w来判断这个光源的类型的,一般和_LightColor0配合使用
//float3 LView=_WorldSpaceLightPos0.xyz;
float3 LView = _LightDir.xyz;
//if(_WorldSpaceLightPos0.w == 0.0){
// L = normalize(_WorldSpaceLightPos0.xyz);
// }
// else{
// L = normalize(_WorldSpaceLightPos0.xyz - i.worldPos);
// }
//根据世界法线 ,世界视向量+光向量 得出高光 系数
float dotSpecular = dot(worldNormal, normalize( worldView+LView));
//控制高光的范围
float3 specularReflection = pow(saturate(dotSpecular), _SpecularRatio);
float4 col;
float fresnel = 0.5*LdotN+0.5;
//根据法线的强度 来确定两种颜色之间的混合 ????
col.rgb = lerp(_BottomColor.xyz, _TopColor.xyz, fresnel);
col.rgb = saturate (LdotN) *col.rgb;
//加上高光
col.rgb += specularReflection;
col.rgb = lerp (col.rgb,refTex.rgb*_ReflectionLight,0.7);
//col.rgb +=refTex.rgb*_ReflectionLight;
//加上灯光颜色
col.rgb*=lightColor;
col.rgb *= i.VertColor.rgb;
//控制透明度
col.a =i.VertColor.a * _Alpha;
return col;
}
ENDCG
}
}
FallBack "Diffuse"
}
材质球设置步骤
- 新建一个材质球,并将渲染模式更改为刚刚创建的"Custom/WaterShader"。
- 在材质球属性中,上传两张法线贴图和一张水的照片作为反射贴图。
- 根据需要调整其他参数,如波浪尺度、波浪速度、反射强度等。
通过以上步骤,你就可以在Unity中实现一个基本的水面效果。这个Shader通过结合法线贴图、反射效果和光照计算,能够模拟出较为真实的水面波纹和反射效果。
热门推荐
万姓的起源:从鲜卑族到儒家文化
辐射散热降温涂料:零能耗新型高效散热技术的革新应用
最新发布!江苏8500户家庭,资产过亿
中世纪盔甲简史
相机SD卡误删怎么恢复?试试这5个找回方法!
天津科技大学2024年在江苏录取分数线公布:物理类最低534分
不同季节丝袜怎么选?厚度背后的时尚与舒适平衡
点痣伤口可以用创可贴吗
电影《731》预告震撼发布,揭黑暗历史引发深思
陶喆:台湾“R&B教父”的音乐传奇
高光谱分类任务数据集介绍
鸡腿的十种简单美味做法,总有一款适合你
羊毛被大讲堂:羊毛被与蚕丝被优缺点大比拼
机械电子工程专业课程设置及学习难度分析
内容优化:如何让你的文章更容易被搜索引擎收录?
不同级别的公务员工资标准有什么区别?
广式腊肉(少盐)制作教程
足球裁判等级怎么分的(怎么样才能当一名好的足球裁判员)
花艺插花需要用到的十种工具推荐 插花用具及辅助材料有哪些
中央一号文件首提农业新质生产力意味着什么?
高三数学复习第十四章概率第二讲古典概型与几何概型理省公开课一等奖新课获奖课件
卡片笔记写作法:从卢曼到实践指南
四季轮回中的自然之美与生活哲理
国产蓝莓卖爆了!科技赋能国产蓝莓增产提质→
文班亚马站立起跳摸高竟然比姚明还高19厘米,如此成绩能排第几
古代名将卫青的军事生涯,为何能让他名垂青史?
如何制作 MG 动画 - 超好玩的 MG 动画制作分享
红牛一天为什么不能超过2瓶
KOL与KOC如何塑造品牌影响力与消费者信任关系?
时空猎人3审判搭配阵容:法律视角下的游戏机制分析