【Unity3D Shader】学习笔记-水②

简介: 具有深度的水,能够表现水面与岸边的过渡,对于清澈的小溪水面还可以看见水底的内容,本篇就介绍如何实现这种清澈的小溪水。一、制作过程 在顶点着色器中需要获得当前平面的屏幕坐标,使用内置方法进行获取,具体代码如下:

【Unity3D Shader】学习笔记-水②


前言


   具有深度的水,能够表现水面与岸边的过渡,对于清澈的小溪水面还可以看见水底的内容,本篇就介绍如何实现这种清澈的小溪水。


微信图片_20220424154025.gif

图1 清澈的水


一、制作过程


       在顶点着色器中需要获得当前平面的屏幕坐标,使用内置方法进行获取,具体代码如下:

 // 模型顶点在屏幕中的坐标
o.screenPos = ComputeScreenPos(o.vertex);


       通过摄像机深度纹理获得当前水面以下的深度数据,具体的操作下面的代码已经给出。然后获得的效果应该跟图2类似,边上深度浅的地方应该呈现灰色,而深水区则是全白色。


// 提取深度值 - 非线性
float depth = SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos)).r;
// 获取视野线性深度值
depth = LinearEyeDepth(depth); 
// 减去当前面片屏幕深度值,获得水下深度
float depthInWater = saturate(depth - i.screenPos.w);
// 用于查看结果
return fixed4(depthInWater, depthInWater, depthInWater, 1);


微信图片_20220424154030.png

图2 水面深度


   上面的边界区域太小,不是很明显。引入新的2个参数来控制水深的范围以及浅水区的强度。


// 除以参数z来控制中间白色部分的范围
float depthInWater = saturate((depth - i.screenPos.w) / _WaveDirection.z);
// 对结果进行pow,使得小于0的部分更小,用于让浅水的地方更淡
depthInWater = pow(depthInWater , _WaveDirection.w);


微信图片_20220424154035.png

图3 改变参数获得的新的深度


   现在可以将这个深度数据作为最终水面颜色的Alpha值,这里需要注意Shader需要修改一下RenderType和Queue使用Transparent,并且设置Blend参数。现在的水面与地形交界处可以看见淡淡的地形了。


微信图片_20220424154038.gif

图4 将深度应用透明通道


   引入一个新的参数用于控制整体的透明度,这样就可以得到一个简单的清澈水面效果。


// col 是上一篇水的最终颜色,额外加上了环境光。
return fixed4(col, depthInWater) * _WaterTransparent;


微信图片_20220424154041.gif

图5 整体透明


二、后记


   虽然可以看到水底,但还不太真实。水面因为折射和运动应该会导致水底的东西看起来有一定扭曲,并且带有一定的焦散效果。本篇就先完成这样的效果吧,后面学习了再做更加真实的效果。

相关文章
|
8天前
|
图形学
unity噪声消融效果Shader实现
在 Unity 中实现噪声消融效果,利用噪声纹理和透明度裁剪技术。噪声纹理(如 Perlin 噪声)为物体表面提供随机参考值,透明度裁剪通过设置阈值控制显示与消失。具体步骤包括引入噪声纹理、设置阈值和边缘颜色,使用自定义着色器代码实现物体部分消失的视觉效果。通过调整材质球和噪声贴图,可优化最终呈现。
|
6月前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
441 0
|
6月前
|
缓存 图形学
Unity3D学习笔记12——渲染纹理
Unity3D学习笔记12——渲染纹理
58 2
|
6月前
|
API C# 图形学
Unity3D学习笔记9——加载纹理
Unity3D学习笔记9——加载纹理
68 2
|
6月前
|
API 图形学 异构计算
Unity3D学习笔记7——GPU实例化(2)
Unity3D学习笔记7——GPU实例化(2)
51 2
|
6月前
|
存储 缓存 图形学
Unity3D学习笔记11——后处理
Unity3D学习笔记11——后处理
80 1
|
6月前
|
测试技术 C# 图形学
Unity3D学习笔记10——纹理数组
Unity3D学习笔记10——纹理数组
71 0
|
6月前
|
图形学 异构计算
Unity3D学习笔记8——GPU实例化(3)
Unity3D学习笔记8——GPU实例化(3)
85 0
|
6月前
|
存储 API 图形学
Unity3D学习笔记6——GPU实例化(1)
Unity3D学习笔记6——GPU实例化(1)
93 0
|
6月前
|
API 图形学 索引
Unity3D学习笔记5——创建子Mesh
Unity3D学习笔记5——创建子Mesh
46 0