最终效果

一些注意

法线需要顶点法线和图片法线求和归一化。
菲尼尔反射只改变颜色不要改变透明度。
不要加实时反射耗不起,如果加就加CubeMap

源代码

Shader "QQ/Water_Depth_Wave" {Properties {        _WaterColor("海水颜色",Color) = (0,.25,.4,1)_FarColor("海面颜色",Color)=(.2,1,1,.3)[NoScaleOffset]_BumpMap("法线贴图", 2D) = "white" {}_BumpPower("法线强度",Range(-1,1))=.6_EdgeColor("边缘颜色",Color)=(0,1,1,0)[NoScaleOffset]_WaveTex("海浪贴图",2D)="white" {}_WaveSpeed("海浪速度",Range(0,10))=4[NoScaleOffset]_EdgeTex("边缘贴图",2D)="white" {}_EdgeRange("边缘融合",Range(0.1,1))=.4_WaveSize("贴图尺寸",Range(0.01,1))=.25_WaveOffset("xy,zw为偏移",vector)=(.1,.2,-.2,-.1)_LightColor("灯光颜色",Color)=(1,1,1,1)_LightVector("xyz为灯光角度,w为衰减",vector)=(.5,.5,.5,100)}SubShader{Tags{ "RenderType" = "Opaque" "Queue" = "Transparent"}Blend SrcAlpha OneMinusSrcAlphaLOD 200Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fog#pragma multi_compile DEPTH_OFF DEPTH_ON#pragma target 3.0#include "UnityCG.cginc"fixed4 _WaterColor;fixed4 _FarColor;fixed4 _LightColor;sampler2D _BumpMap;float _WaveSize;float4 _WaveOffset;float4 _LightVector;float _BumpPower;#ifdef DEPTH_ONfixed4 _EdgeColor;sampler2D _WaveTex;float _WaveSpeed;sampler2D _EdgeTex;float _EdgeRange;sampler2D_float _CameraDepthTexture;#endifstruct a2v {float4 vertex:POSITION;half3 normal : NORMAL;};struct v2f{float4 pos : POSITION;UNITY_FOG_COORDS(0)half3 normal:TEXCOORD1;float4 screenPos:TEXCOORD2;fixed3 viewDir:TEXCOORD3;fixed2 uv[2] : TEXCOORD4;};v2f vert(a2v v){v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);float4 wPos=mul(unity_ObjectToWorld,v.vertex);o.uv[0]=wPos.xz*_WaveSize+_WaveOffset.xy*_Time.y;o.uv[1]=wPos.xz*_WaveSize+_WaveOffset.zw*_Time.y;o.normal=UnityObjectToWorldNormal(v.normal);o.viewDir= WorldSpaceViewDir(v.vertex);o.screenPos = ComputeScreenPos(o.pos);COMPUTE_EYEDEPTH(o.screenPos.z);return o;}fixed4 frag(v2f i):COLOR {fixed4 col=_WaterColor;half3 nor = UnpackNormal((tex2D(_BumpMap,i.uv[0])+tex2D(_BumpMap,i.uv[1]))*.5f);nor= normalize(i.normal + nor.xzy *half3(1,0,1)* _BumpPower);half spec =max(0,dot(nor,normalize(normalize(_LightVector.xyz)+normalize(i.viewDir))));spec = pow(spec,_LightVector.w);half fresnel=dot(nor,normalize(i.viewDir));fresnel=saturate(dot(nor*fresnel,normalize(i.viewDir)));#ifdef DEPTH_ONhalf depth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos)));depth=saturate((depth-i.screenPos.z)*_EdgeRange);fixed4 edge = (tex2D(_EdgeTex,i.uv[0])+tex2D(_EdgeTex,i.uv[1]));col =lerp(edge*_EdgeColor,col,depth);float time=_Time.x*_WaveSpeed;float wave=tex2D(_WaveTex,float2(time+depth,1)).a;col+=_EdgeColor*saturate(saturate(wave)-depth)*edge.a;#endifcol.rgb=lerp(col,_FarColor,_FarColor.a-fresnel);col.rgb+=_LightColor.rgb*spec*_LightColor.a;return col;}ENDCG}}FallBack OFF
}

摄像机脚本

using UnityEngine;[RequireComponent(typeof(Camera))]
public class WaterConfig : MonoBehaviour
{private Camera cam;[ContextMenu("Depth")]void Start(){if (!cam){cam = GetComponent<Camera>();}if (SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.Depth)){Shader.EnableKeyword("DEPTH_ON");Shader.DisableKeyword("DEPTH_OFF");if (cam)cam.depthTextureMode |= DepthTextureMode.Depth;}else{Shader.EnableKeyword("DEPTH_OFF");Shader.DisableKeyword("DEPTH_ON");}}
}

[shader]Unity 移动端海面相关推荐

  1. Unity移动端游戏性能优化简谱之 以引擎模块为划分的CPU耗时调优

    <Unity移动端游戏性能优化简谱>从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能 ...

  2. Unity移动端游戏性能优化简谱之 常见游戏内存控制

    <Unity移动端游戏性能优化简谱>从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能 ...

  3. unity Android 剪贴板,Unity移动端的复制要这么写示例代码

    前言 Unity官网提供了详尽的文档和丰富的教学视频,昨天跟着视频做了一个简单的3d游戏"roll-a-ball".游戏涉及了许多Unity的基本知识,用来入门很不错. 本文主要给 ...

  4. unity发布android报错,Unity移动端入门 - Android那些事 /AAR包发布错误

    老师,您好! Unity移动端入门 - Android那些事的第31节 发布JAR包我两次都成功了,但任务32:0506-互相调用模式之导出Aar包 总是失败,卡在这里都半个月了.请老师指点迷津 打包 ...

  5. unity三维地图的经纬度如何在二维地图上表示_接入C++版本recastnavigation寻路库到Unity/服务端中...

    前言 因为Unity版本的更新迭代,老版本的A*插件在新版本Unity已经无法正常使用,包括一些运行时代码也已经过时,重新接入要花费很多时间,干脆接入一个新的寻路方案吧. 这里选择的是久负盛名的htt ...

  6. Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息

    目录 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) 三.操作:一:完成:在同一个Uni ...

  7. 开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一]

    开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一] 1. 简介 1.1 结识Lidgren的机缘巧合 开发Unity的各位或多或少都可能在工作中遇到非客户端开发的一些内容.大型 ...

  8. 2d shader unity 阴影_【Unity Shader】平面阴影(Planar Shadow)

    来介绍一种适用于移动平台的高性能实时阴影解决方案--平面阴影(Planar Shadow). 由于Unity内置的实时阴影实现方式是屏幕空间阴影贴图(Screen Space Shadow Map)非 ...

  9. unity移动端性能优化技术整理(持续更新)

    目录 Overview 性能优化主要针对四大类问题 填充率 发热量 功耗比 瓶颈可能性的顺序 性能分析工具 性能测试方法 确定瓶颈 CPU瓶颈 GPU瓶颈 确定顶点瓶颈 确定片元瓶颈 确定带宽瓶颈 增 ...

最新文章

  1. AlphaZero进化论:从零开始,制霸所有棋类游戏
  2. MySql数据备份与恢复
  3. Python数据分析Numpy库方法简介(三)
  4. 02241107班编程题 切片逆序大小写等
  5. python excelwriter保存路径_太赞!Python和Excel终于可以互通了
  6. 我慕了!腾讯大手一挥,员工买房最高可申请免息借款90万
  7. Centos、Ubuntu的区别
  8. Win7设置自环的方法(网卡终结器)
  9. oracle中md5加密解密_Oracle定义DES加密解密及MD5加密函数示例
  10. 11g表名大小写 oracle_Oracle数据库总结
  11. Linux:configure: error: OpenSSL libcrypto not found
  12. android system image,android systemimage默認大小以及如何修改
  13. 计算机科学渗透信息论的思想,认知主义理论
  14. 【操作系统】GPT和MBR分区的区别
  15. 为什么说软件测试很重要?
  16. Exploit-exercises
  17. vue中友盟统计---事件跟踪部署
  18. 打开共享文件提示服务器空间不足,访问网络共享报告“服务器存储空间不足,无法处理此命令”...
  19. RTTHREAD软件包目录
  20. bcedit双系统更改启动项名称_Win7下双系统修改BCD启动项名称

热门文章

  1. web:常见安全问题
  2. VB.NET连接FireBird(整理最全)
  3. v-for的四种使用方式
  4. C/S客户端渗透测试(一)客户端渗透环境配置
  5. python end函数用法_python end用法是什么?_后端开发
  6. oracle的读写分离实现
  7. 巧用千寻位置GNSS软件|倾斜校准有技巧
  8. 蓝松视频编辑SDK使用说明
  9. Java中::的意思
  10. html 下拉列表框居中,下拉菜单如何居中并全屏宽显示