UnityShader_水面海水渲染的技术总结

本文探讨了游戏开发中水体渲染的各种技术,包括屏幕深度系数、法线、折射、焦散、水体明暗、反射、高光、点光源、水面互动和抗锯齿等。通过实例和公式,解释了如何实现逼真的水体效果,特别强调了水面高度、深度图的处理和水波纹的扩散方程。同时,提到了使用Swizzle节点处理透明度以增强真实感,并分享了代码组织和变量管理的建议。

这个文章只想记录一些效果图,GIF图,不想多做技术讨论(理论太长了,实际应用又太短)

2022年,增加一些ASE(连连看)截图

目录

技术分别有:

屏幕深度系数(深度图)

法线

折射

焦散

水体明暗

反射

高光

点光源

水面互动

抗锯齿

相关参考公式


无图,或者会后补吧

公式也是

技术分别有:

屏幕深度系数(深度图)

深度系数= pow( saturate ( 屏幕深度/ 过渡深度), 过渡系数)

水体基础颜色= lerp( 浅水颜色, 深水颜色, 深度系数)

小技巧

float waterDepthDfference01 = saturate(depthDifference / _DepthMaxDistance);

重点是,一个数(深度图Depth值)再除以一个可以无限大的分量,作用是??

法线

水面高度

比波浪公式重要

Fft海洋+曲面细分+反射+高光+白浪

这里写图片描述

这里写图片描述

折射

这里写图片描述

焦散

水体明暗

(待补充)

反射

高光

点光源

轻舟,渔火

水面互动

参考大佬的:

水波纹的生成

扩散方程

目前游戏内生成的水波纹的基础也就是获取触发水波纹的具体坐标,是通过水波纹的扩散公式,用两张rendertexture分别作为compute shader的输入和输出来循环计算的。

流程图如下所示

抗锯齿

(待补充)

海水半透明

ASE连线:

1.左上,先动过2个图(一深蓝,一浅蓝)+ 透明度(alpha)做一个见百年(alpha计算没标出)

2.右下,通过Swizzle节点(ASE编辑器),颜色通道(4通道)转 A通道(单通道)

为得出海水透明度,其实直接用 alpha(下图没标出) 也可以,但通过Swizzle节点取出的透明度,其实是颜色+深度透明度的混合,则最终结果比较符合实际原理

Alpha公式:

alpha  = worldPos - eyeDepthScreenPos;//或者需要反相

海岸边白泡沫

 

其实关键就2个东西,Add 增加范围, Multipy 成颜色,但变量太多,又是渲染的中间部分,很容易出错

但也是这2个关键中的关键,说明还是程序的老套路,

1.变量命必须命名好;名字起的好,心中不会乱

2.变量的作用范围;该做保护的做保护,杜绝溢出,但不要过分validate

相关参考公式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值