210 lines
10 KiB
Markdown
210 lines
10 KiB
Markdown
|
---
|
|||
|
title: 海洋、云Demo制作方案
|
|||
|
date: 2022-11-04 09:38:11
|
|||
|
excerpt:
|
|||
|
tags:
|
|||
|
rating: ⭐
|
|||
|
---
|
|||
|
# 海洋方案
|
|||
|
浅墨的总结:https://zhuanlan.zhihu.com/p/95917609
|
|||
|
|
|||
|
波形:Gerstner 波、快速傅立叶变换、空间-频谱混合方法、离线FFT贴图烘焙(Offline FFT Texture)
|
|||
|
着色:Depth Based LUT Approach、Sub-Surface Scattering Approximation Approach
|
|||
|
白沫:浪尖=>[Tessendorf 2001] 基于雅克比矩阵的方法、岸边=》[GDC 2018]《孤岛惊魂5》基于有向距离场的方法、交互白浪:ASher的Niagara方案https://zhuanlan.zhihu.com/p/100700549
|
|||
|
|
|||
|
## 波形方案
|
|||
|
### 线性波形叠加方法
|
|||
|
正弦波(Sinusoids Wave)[Max 1981]
|
|||
|
Gerstner 波 (Gerstner Wave) [Fournier 1986]
|
|||
|
|
|||
|
### 统计学模型法
|
|||
|
快速傅立叶变换(Fast Fourier Transform)[Mastin 1987]
|
|||
|
空间-频谱混合方法(Spatial -Spectral Approaches)[Thon 2000]
|
|||
|
|
|||
|
### 波动粒子方法(不考虑)
|
|||
|
波动粒子方法((Wave Particles) [Yuksel 2007]
|
|||
|
水波小包方法(Water Wave Packets)[Jeschke 2017]
|
|||
|
水面小波方法(Water Surface Wavelets)[Jeschke 2018]
|
|||
|
|
|||
|
### 预渲染
|
|||
|
流型图(Flow Map)[Vlachos 2010]
|
|||
|
离线FFT贴图烘焙(Offline FFT Texture) [Torres 2012]
|
|||
|
离线流体帧动画烘焙(bake to flipbook)[Bowles 2017]
|
|||
|
|
|||
|
## 水体渲染中的着色方案
|
|||
|
《神秘海域3》在2012年SIGGRAPH上的技术分享中有一张分析水体渲染技术非常经典的图,如下。
|
|||
|
|
|||
|

|
|||
|
|
|||
|
- 漫反射(Diffuse)
|
|||
|
- 镜面反射(Specular)
|
|||
|
- 法线贴图(Normal Map)
|
|||
|
- 折射(Reflection)
|
|||
|
- 通透感(Translucency)
|
|||
|
- 基于深度的查找表方法(Depth Based LUT Approach)
|
|||
|
- 次表面散射(Subsurface Scattering)
|
|||
|
- 白沫(Foam/WhiteCap)
|
|||
|
- 流动表现(Flow)
|
|||
|
- 水下雾效(Underwater Haze)
|
|||
|
|
|||
|
### 通透感(Translucency)
|
|||
|
#### 水体散射效果
|
|||
|
##### 基于深度的查找表方法(Depth Based LUT Approach)
|
|||
|
Depth Based-LUT方法的思路是,计算视线方向的水体像素深度,然后基于此深度值采样吸收/散射LUT(Absorb/Scatter LUT)纹理,以控制不同深度水体的上色,得到通透的水体质感表现。
|
|||
|
|
|||
|

|
|||
|

|
|||
|
|
|||
|
##### 次表面散射近似方法(Sub-Surface Scattering Approximation Approach)
|
|||
|
- [SIGGRAPH 2019] Crest Ocean System改进的《盗贼之海》SSS方案。
|
|||
|
- [GDC 2011] 寒霜引擎的Fast SSS方案。
|
|||
|
|
|||
|
经过Crest Ocean System改进的《盗贼之海》的SSS方案可以总结如下:
|
|||
|
|
|||
|
假设光更有可能在波浪的一侧被水散射与透射。
|
|||
|
基于FFT模拟产生的顶点偏移,为波的侧面生成波峰mask
|
|||
|
根据视角,光源方向和波峰mask的组合,将深水颜色和次表面散射水体颜色之间进行混合,得到次表面散射颜色。
|
|||
|
将位移值(Displacement)除以波长,并用此缩放后的新的位移值计算得出次表面散射项强度。
|
|||
|
对应的核心实现代码如下:
|
|||
|
```hlsl
|
|||
|
float v = abs(i_view.y);
|
|||
|
half towardsSun = pow(max(0., dot(i_lightDir, -i_view)),_SubSurfaceSunFallOff);
|
|||
|
half3 subsurface = (_SubSurfaceBase + _SubSurfaceSun * towardsSun) *_SubSurfaceColour.rgb * _LightColor0 * shadow;
|
|||
|
subsurface *= (1.0 - v * v) * sssIndensity;
|
|||
|
```
|
|||
|
col += subsurface;
|
|||
|
其中,sssIndensity,即散射强度,由采样位移值计算得出。
|
|||
|

|
|||
|
|
|||
|
图 《Crest Ocean System》中基于次表面散射近似的水体表现
|
|||
|

|
|||
|
|
|||
|
|
|||
|
[GDC 2011] 寒霜引擎的Fast SSS方案
|
|||
|
[GDC 2011]上,Frostbite引擎提出的Fast Approximating Subsurface Scattering方案,也可以用于水体渲染的模拟。
|
|||
|
|
|||
|

|
|||
|
|
|||
|
### 白沫(Foam/WhiteCap)
|
|||
|
白沫(Foam),在有些文献中也被称为Whitecap,White Water,是一种复杂的现象。即使白沫下方的材质具有其他颜色,白沫也通常看起来是白色的。出现这种现象的原因是因为白沫是由包含空气的流体薄膜组成的。随着每单位体积薄膜的数量增加,所有入射光都被反射而没有任何光穿透到其下方。这种光学现象使泡沫看起来比材质本身更亮,以至于看起来几乎是白色的。
|
|||
|

|
|||
|
|
|||
|
对于白沫的渲染而言,白沫可被视为水面上的纹理,其可直接由对象交互作用,浪花的飞溅,或气泡与水表面碰撞而产生。
|
|||
|
|
|||
|
白沫的渲染方案,按大的渲染思路而言,可以分为两类:
|
|||
|
- 基于动态纹理(dynamic texture)
|
|||
|
- 基于粒子系统(particle system)
|
|||
|
|
|||
|
按照类型,可以将白沫分为三种:
|
|||
|
- 浪尖白沫
|
|||
|
- 岸边白沫
|
|||
|
- 交互白沫
|
|||
|
|
|||
|
而按照渲染方法,可将白沫渲染的主流方案总结如下:
|
|||
|
- 基于粒子系统的方法[Tessendorf 2001]
|
|||
|
- 基于Saturate高度的模拟方法 [GPU Gems 2]
|
|||
|
- 基于雅可比矩阵的方法 [Tessendorf 2001]
|
|||
|
- 屏幕空间方法 [Akinci 2013]
|
|||
|
- 基于场景深度的方法 [Kozin 2018][Sea of Thieves]
|
|||
|
- 基于有向距离场的方法 [GDC 2018][Far Cry 5]
|
|||
|
|
|||
|
#### 浪尖白沫
|
|||
|
##### 5.2.1 浪尖白沫:[Tessendorf 2001] 基于雅克比矩阵的方法
|
|||
|
Tessendorf在其著名的水体渲染paper《Simulating Ocean Water》[Tessendorf 2001]中提出了可以基于雅克比矩阵(Jacobian)为负的部分作为求解白沫分布区域的方案。据此,即可导出一张或多张标记了波峰白沫区域的Folding Map贴图。
|
|||
|

|
|||
|
|
|||
|
《战争雷霆(War Thunder)》团队在CGDC 2015上对此的改进方案为,取雅克比矩阵小于M的区域作为求解白沫的区域,其中M~0.3...05。
|
|||
|

|
|||
|
|
|||
|
图 《战争雷霆(War Thunder)》选取雅克比矩阵小于M的区域作为求解白沫的区域 [CGDC 2015]
|
|||
|
|
|||
|
另外,《盗贼之海(Sea of Thieves)》团队在SIGGRPAPH 2018上提出,可以对雅可比矩阵进行偏移,以获得更多白沫。且可以采用渐进模糊(Progressive Blur)来解决噪点(noisy)问题以及提供风格化的白沫表现。
|
|||
|

|
|||
|
!(https://vdn1.vzuu.com/SD/cfb76434-ec75-11ea-acfd-5ab503a75443.mp4?disable_local_cache=1&bu=pico&expiration=1601438226&auth_key=1601438226-0-0-1b75c02f8faa2d5a94b74ad8ebb6e595&f=mp4&v=hw)
|
|||
|
|
|||
|
图 《盗贼之海》基于雅可比矩阵偏移 + 渐进模糊(Progressive Blur)的风格化白沫表现
|
|||
|
|
|||
|
##### 浪尖白沫:[GPU Gems 2] 基于Saturate高度的方法
|
|||
|
《GPU Gems 2》中提出的白沫渲染方案,思路是将一个预先创建的白沫纹理在高于某一高度H0的顶点上进行混合。白沫纹理的透明度根据以下公式进行计算:
|
|||
|
|
|||
|
`$ Foam.a=saturate(\frac {H-H_0} {H_{max}-H_0}) $`
|
|||
|
|
|||
|
- 其中, `$H_{max}$` 是泡沫最大时的高度, `$H_0$` 是基准高度,`$H$` 是当前高度。
|
|||
|
- 白沫纹理可以做成序列帧来表示白沫的产生和消失的演变过程。此动画序列帧既可以由美术师进行制作,也可以采用程序化生成。
|
|||
|
- 将上述结果和噪声图进行合理的结合,可以得到更真实的泡沫表现。
|
|||
|
|
|||
|
#### 岸边白沫:[2012]《刺客信条3》基于Multi Ramp Map的方法
|
|||
|
《刺客信条3》中的岸边白沫的渲染方案可以总结为:
|
|||
|
|
|||
|
- 以规则的间距对地形结构进行离线采样,标记出白沫出现的区域。
|
|||
|
- 采用高斯模糊和Perlin噪声来丰富泡沫的表现形式,以模拟海岸上泡沫的褪色现象。
|
|||
|
- 由于白沫是白色的,因此在R,G和B通道中的每个通道中都放置三张灰度图,然后颜色ramp图将定义三者之间的混合比率,来实现稠密、中等、稀疏三个级别的白沫。要修改白沫表现,美术师只需对ramp图进行颜色校正即可。如下图所示:
|
|||
|
|
|||
|

|
|||
|

|
|||
|
|
|||
|
#### 浪尖白沫&岸边白沫:[GDC 2018]《孤岛惊魂5》基于有向距离场的方法
|
|||
|
GDC 2018上《孤岛惊魂5》团队分享的白沫渲染技术也不失为一种优秀的方案,主要思路是基于单张Noise贴图控制白沫颜色,结合两个offset采样Flow Map控制白沫的流动,并基于有向距离场(Signed Distance Field,SDF)控制岩石和海岸线处白沫的出现,然后根据位移对白沫进行混合。
|
|||
|
|
|||
|

|
|||
|
|
|||
|
### 水面高光
|
|||
|

|
|||
|
|
|||
|
### 水焦散
|
|||
|
水焦散的渲染 (Rendering Water Caustics)
|
|||
|
|
|||
|
GPU Gems 1
|
|||
|
ShaderBits.com
|
|||
|
### 其他Demo
|
|||
|
6.5 NVIDIA UE4 WaveWorks
|
|||
|
GDC 2017上,NVIDIA和Unreal Engine合作推出了WaveWorks,以集成到Unreal Engine 4.15引擎中的形式放出。
|
|||
|
|
|||
|
源代码传送门:https://github.com/NvPhysX/UnrealEngine/tree/WaveWorks
|
|||
|
|
|||
|
demo视频:https://www.youtube.com/watch?v=DhrNvZLPBGE&list=PLN8o8XBheMDxCCfKijfZ3IlTP3cUCH6Jq&index=11&t=0s
|
|||
|
|
|||
|
## 云方案
|
|||
|
|
|||
|
eg2020的一篇很思路很新的论文
|
|||
|
有空写篇文章分享一下思路
|
|||
|
下面是改编了一下的shader
|
|||
|
raymarch的次数降低了很多倍(同样也增加了不少sdf的采样次数)
|
|||
|
优化思路想到再发。
|
|||
|
|
|||
|
https://www.shadertoy.com/view/WdKczW
|
|||
|
### ASher的方案
|
|||
|
https://zhuanlan.zhihu.com/p/107016039
|
|||
|
https://www.bilibili.com/video/BV1FE411n7rU
|
|||
|
|
|||
|
https://www.bilibili.com/video/BV1L54y1271W
|
|||
|
|
|||
|
### 大表哥2
|
|||
|
分帧渲染
|
|||
|
https://zhuanlan.zhihu.com/p/127435500
|
|||
|
|
|||
|
安泊霖的分析:
|
|||
|
https://zhuanlan.zhihu.com/p/91359071
|
|||
|
|
|||
|
### 地平线:黎明时分
|
|||
|
在有道云里有pdf
|
|||
|
https://zhuanlan.zhihu.com/p/97257247
|
|||
|
https://zhuanlan.zhihu.com/p/57463381
|
|||
|
|
|||
|
### UE4云层阴影实现
|
|||
|
https://zhuanlan.zhihu.com/p/130785313
|
|||
|
|
|||
|
## 其他相关
|
|||
|
### GPU Gems 1
|
|||
|
https://developer.nvidia.com/gpugems/gpugems/foreword
|
|||
|
|
|||
|
http://http.download.nvidia.com/developer/GPU_Gems/CD_Image/Index.html
|
|||
|
|
|||
|
浅墨的总结:
|
|||
|
https://zhuanlan.zhihu.com/p/35974789
|
|||
|
https://zhuanlan.zhihu.com/p/36499291
|
|||
|
|
|||
|
真实感水体渲染(Realistic Water Rendering)
|
|||
|
无尽草地的渲染(Rendering Countless Blades of Waving Grass)
|
|||
|
水焦散渲染(Rendering Water Caustics)
|