星鸿阁

 找回密码
 立即注册
搜索
热搜: 活动 交友 动画
查看: 402|回复: 2

水波算法

[复制链接]

2250

主题

2760

帖子

9610

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9610
发表于 2022-11-11 11:47:48 | 显示全部楼层 |阅读模式
  1. float4 offsetColor = (tex2D(_BumpTex, IN.uv_WaterTex + float2(_WaterSpeed*_Time.x,0))+tex2D(_BumpTex, float2(1-IN.uv_WaterTex.y,IN.uv_WaterTex.x) + float2(_WaterSpeed*_Time.x,0)))/2;
  2.                         half2 offset = UnpackNormal(offsetColor).xy * _Refract;//法线偏移程度可控

  3.                     //让水面检测深度并根据Grab贴图 显示;
  4.                         float2 uv = IN.proj.xy/IN.proj.w;   // 获取屏幕纹理坐标信息

  5.                         fixed4 water = (tex2D(_WaterTex, IN.uv_WaterTex ));  //采样water贴图

  6.                         half4 bott = tex2D(_GrabTexture, uv+offset);         //采样渐变贴图

  7.                         fixed dis1 = distance(IN.uv_WaterTex,fixed2(0.5,0.5));
  8.                         fixed2 uv1 =IN.uv_WaterTex + 2*sin(_Time.y + dis1*2);
  9.                         fixed4 c =tex2D(_WaterTex,uv1);
  10.                        
  11.                         //计算当前像素深度
  12.                         float depth = tex2Dproj (_CameraDepthTexture, IN.proj).r;  //UNITY_PROJ_COORD:深度值 [0,1]
  13.                         half m_depth = LinearEyeDepth(depth);                      //深度根据相机的裁剪范围的值[0.3,1000],将经过透视投影变换的深度值还原
  14.                         half deltaDepth = m_depth - IN.proj.z;

  15.                         fixed4 waterColor = tex2D(_GTex, float2(min(_Range.y,deltaDepth)/_Range.y,1));   //根据深度显示水的颜色

  16.                         //采样两次法线,交叉移动形成波光粼粼的样子
  17.                         float4 bumpColor1 = tex2D(_BumpTex, IN.uv_WaterTex + offset + float2(_WaterSpeed*_Time.x,0));
  18.                         float4 bumpColor2 = tex2D(_BumpTex, float2(1-IN.uv_WaterTex.y,IN.uv_WaterTex.x)+offset + float2(_WaterSpeed*_Time.x,0));
  19.                         o.Normal = UnpackNormal((bumpColor1+bumpColor2)/2).xyz;  //采样法线贴图,并移动。

  20.                         o.Specular = _Specular;  //镜面反射系数
  21.                         o.Gloss = _Gloss;  //实时调整光泽系数  就是光强

  22.                         //深度 控制 颜色
  23.                         half water_w = min(_Range.w, deltaDepth)/_Range.w;  

  24.                         o.Albedo = bott.rgb * (1 - water_w) + waterColor.rgb * water_w;             //输出纹理

  25.                         o.Alpha = min(_Range.x, deltaDepth)/_Range.x;   //岸边为透明,所以a的值是根据深度来控制的
复制代码


回复

使用道具 举报

2250

主题

2760

帖子

9610

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9610
 楼主| 发表于 2022-11-11 16:23:40 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

2250

主题

2760

帖子

9610

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9610
 楼主| 发表于 2022-11-11 16:24:19 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|starfluidga

GMT+8, 2024-12-30 07:07 , Processed in 0.014765 second(s), 21 queries .

Made by Liga 星鸿阁

Copyright © 2020-2048, LigaStudio.

快速回复 返回顶部 返回列表