游戏里的水面是怎么做的

发布时间:2026/9/29 21:52:21

游戏里的水面是怎么做的 最难渲染的自然现象之一实时渲染系列水是游戏中最难渲染的自然现象之一。它同时涉及几何变形、光学效应和流体动力学。但拆开来看每一步都不复杂。一、水面渲染的核心要素一个令人信服的水面需要这几个视觉特征特征实现手段波浪起伏顶点位移Gerstner 波 / FFT表面细节法线贴图扰动反射平面反射 / SSR / 环境贴图折射屏幕空间折射 深度着色反射与折射的比例菲涅尔效应水下雾化基于深度的颜色衰减泡沫/浪花基于曲率或深度的白色叠加焦散投影纹理 / 光线追踪二、波形生成方法一正弦波叠加最简单// 多个正弦波叠加floatwaveHeight(vec2 pos,floattime){floath0.0;h0.5*sin(pos.x*0.3time*1.2);h0.3*sin(pos.y*0.5time*0.8);h0.1*sin((pos.xpos.y)*1.0time*2.0);returnh;}问题正弦波的波峰和波谷一样圆润不像真实海浪波峰尖、波谷平。方法二Gerstner 波游戏主流Gerstner 波不仅让顶点上下移动还让顶点水平移动产生真实的尖峰效果// Gerstner 波顶点同时水平和垂直位移vec3gerstnerWave(vec2 pos,floattime,vec2 dir,floatamplitude,floatfrequency,floatsteepness){floatphasefrequency*dot(dir,pos)time;floatQsteepness/(frequency*amplitude);// 控制尖锐度vec3 offset;offset.xQ*amplitude*dir.x*cos(phase);offset.zQ*amplitude*dir.y*cos(phase);offset.yamplitude*sin(phase);returnoffset;}// 叠加多个不同方向、频率的 Gerstner 波vec3 totalOffsetvec3(0);totalOffsetgerstnerWave(pos,t,vec2(1,0),0.5,0.8,0.6);totalOffsetgerstnerWave(pos,t,vec2(0.7,0.7),0.3,1.2,0.5);totalOffsetgerstnerWave(pos,t,vec2(-0.3,0.9),0.2,2.0,0.4);方法三FFT 海洋3A 级基于 Tessendorf 的论文用海洋频谱Phillips Spectrum在频域生成波浪再通过 FFT 变换到空间域。Phillips 频谱 → 随机相位 → IFFT → 高度场 法线 位移优点物理正确视觉效果极佳。缺点计算量大通常在 Compute Shader 中实现。三、法线贴图小尺度细节大波浪用顶点位移小波纹用法线贴图。两张法线贴图以不同速度和方向滚动叠加产生复杂的水面细节// 双层法线贴图滚动vec2 uv1worldPos.xz*0.1time*vec2(0.02,0.01);vec2 uv2worldPos.xz*0.05time*vec2(-0.01,0.02);vec3 n1texture(normalMap1,uv1).xyz*2.0-1.0;vec3 n2texture(normalMap2,uv2).xyz*2.0-1.0;// 混合两层法线UDN blendingvec3 Nnormalize(vec3(n1.xyn2.xy,n1.z*n2.z));进阶Flow Map 可以控制水流方向让河流沿着河道流动而不是均匀滚动。四、菲涅尔效应反射与折射的比例这是水面看起来真实的最关键因素。物理规律正对水面看垂直入射→ 主要看到水下折射为主斜着看水面掠射角→ 主要看到反射// Schlick 近似菲涅尔floatfresnel(vec3 V,vec3 N){floatF00.02;// 水的基础反射率floatcosThetamax(dot(V,N),0.0);returnF0(1.0-F0)*pow(1.0-cosTheta,5.0);}// 最终颜色 反射和折射的混合floatFfresnel(viewDir,normal);vec3 colormix(refractionColor,reflectionColor,F);很多看起来不对的水面问题就出在没有菲涅尔。加上菲涅尔效果立刻提升一个档次。五、反射方法一平面反射最准确把相机关于水面做镜像再渲染一遍场景得到反射贴图。镜像相机 → 裁剪水面以下 → 渲染到 FBO → 作为反射贴图采样缺点要多渲染一遍场景开销翻倍。方法二屏幕空间反射SSR在屏幕空间做光线步进沿反射方向搜索已有像素。优点不需要额外渲染。缺点只能反射屏幕上可见的东西。方法三环境贴图最便宜用 Cubemap 提供远处的反射。适合天空和远景近处物体反射不准确。实际游戏通常混合使用近处用 SSR远处用环境贴图特殊场景用平面反射。六、折射与水下效果// 屏幕空间折射vec2 screenUVgl_FragCoord.xy/screenSize;vec2 distortionnormal.xz*refractionStrength;vec3 refrColortexture(sceneColorTex,screenUVdistortion).rgb;// 基于深度的水下雾化floatwaterDepthtexture(depthTex,screenUV).r-gl_FragCoord.z;vec3 deepColorvec3(0.0,0.05,0.1);// 深水颜色floatdepthFactor1.0-exp(-waterDepth*0.5);refrColormix(refrColor,deepColor,depthFactor);效果水浅的地方能看到水底水深的地方逐渐变成深蓝/深绿色。七、泡沫与浪花泡沫通常出现在波峰处Gerstner 波的 Jacobian 行列式 0 时水面与物体交界处基于深度差岸边基于水深// 基于深度的岸边泡沫floatshoreDepthtexture(depthTex,screenUV).r-fragDepth;floatfoam1.0-smoothstep(0.0,foamWidth,shoreDepth);foam*texture(foamNoise,uv*4.0time*0.1).r;// 叠加到最终颜色colormix(color,vec3(1.0),foam*0.8);八、完整的水面着色器框架// water.frag - 完整水面片段着色器框架voidmain(){// 1. 法线从法线贴图获取扰动后的法线vec3 NgetWaterNormal(worldPos,time);// 2. 菲涅尔决定反射/折射比例floatFfresnelSchlick(viewDir,N);// 3. 反射vec3 reflDirreflect(-viewDir,N);vec3 reflectionsampleReflection(reflDir,screenUV,N);// 4. 折射 水下雾化vec3 refractionsampleRefraction(screenUV,N,waterDepth);// 5. 混合vec3 colormix(refraction,reflection,F);// 6. 高光colorsunSpecular(N,viewDir,lightDir);// 7. 泡沫colorapplyFoam(color,worldPos,waterDepth,time);fragColorvec4(color,1.0);}九、性能优化技术说明LOD远处水面降低网格密度和法线细节半分辨率反射反射贴图用一半分辨率渲染TessellationGPU 动态细分近处密远处疏Compute ShaderFFT 海洋在 CS 中计算不占顶点管线时间复用反射/折射隔帧更新十、不同游戏的水面方案级别方案适用场景低端法线贴图 菲涅尔 环境贴图手游、独立游戏中端Gerstner 波 SSR 深度雾主流 PC/主机游戏高端FFT 海洋 平面反射 体积光 焦散3A 大作水面渲染没有银弹。核心是理解每个视觉特征背后的物理原理然后根据性能预算选择合适的近似方案。菲涅尔 法线扰动是性价比最高的组合。
延伸阅读

更多相关文章

2026/9/28 23:42:12

如何在Mac上完美使用Xbox控制器:360Controller驱动终极指南

如何在Mac上完美使用Xbox控制器:360Controller驱动终极指南 【免费下载链接】360Controller TattieBogle Xbox 360 Driver (with improvements) 项目地址: https://gitcode.com/gh_mirrors/36/360Controller 你是否曾为在Mac上使用Xbox控制器而烦恼&#xff…

2026/9/30 1:42:47

Python AI智能体开发指南:从基础到实战

1. Python AI 智能体开发概述AI智能体(AI Agent)是一种能够感知环境、自主决策并执行动作的智能系统。它不同于传统的程序,具备一定程度的自主性和适应性。Python凭借其丰富的库生态系统和简洁的语法,成为开发AI智能体的首选语言。…

2026/9/29 22:53:39

如何在3分钟内完成Android开发环境配置:新手友好指南

如何在3分钟内完成Android开发环境配置:新手友好指南 【免费下载链接】Latest-adb-fastboot-installer-for-windows A Simple Android Driver installer tool for windows (Always installs the latest version) 项目地址: https://gitcode.com/gh_mirrors/la/Lat…

2026/9/30 12:13:03

GO [ 泛型 ]

泛型 前面我们已经学习了 Go 的变量、常量、数据类型、输入输出、条件控制、切片、字符串、映射表、指针、结构体、函数、方法、接口、类型、错误、文件和反射。接下来学习 Go 语言中一个很重要、也最容易被“写复杂”的能力:泛型(Generics)…

2026/9/30 12:13:03

STM32上电启动全流程解析:从复位向量到RTOS第一个任务

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 12:13:03

国产车规MCU首次量产主动悬架:从工程视角拆解核心技术

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 12:13:03

DeepSeek-VL2在证券结算对账中的多模态核验实战

简介:本资源是一份面向金融科技从业者、量化系统开发工程师及AI模型落地工程师的深度技术方案文档,聚焦证券交易结算对账这一高精度、强合规场景,系统性提出基于DeepSeek-VL2多模态大模型的自动化核验与差异归因框架。全文610页、61章&#x…

2026/9/30 12:08:02

整车性能目标书(QR)完全指南:模板、分解与版本管理

我在主机厂调试了十来年整车性能,接手新项目的第一件事永远是同一件:翻开上一代车型的性能目标书,和动力总成、底盘、NVH、总布置几个team的人一起过一遍。很多新同事不理解,项目启动阶段最要紧的是节点计划,是零件定点…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/30 10:28:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑