GPU Based Water Simulator
来源:互联网 发布:网络诈骗报警平台登录 编辑:程序博客网 时间:2024/06/03 20:34
这个方法非常方便美术来编辑,美术只需要提供高度图就可以生成整个地图的水域,包括河流。交互的方法也很简单,效果很不错效率也还可以,交互的波遇到障碍物还会反弹,水流的效果是根据高度的梯度算出来的,效果很逼真。
This is something I played with two years ago - I posted it as a demo on gamedev.net forums (link)>
The goal of this whole thing was to render realistic flowing water for big terrain areas on DirectX9 generation hardware.
The basic idea was to precalculate water flow over a static terrain represented by a heightfield and then use this data in the realtime application (game, simulation, etc) to do a simpler and cheaper localised wave simulation and rendering.
The process is thus split into two stages:
- Waterflow simulation (editor) stage
- Realtime 3D visualisation stage
The demo project contains both stages (modes), which can be toggled between using F5 key. See Readme.txt contained in the archive for more details.
Waterflow simulation (editor) stage
This is the 'editor' stage (it would go into a tools pipeline / editor in the case of a game engine): it takes a heightmap as input and, in my case, a list of springs which add water to the simulation. It outputs the state of the simulation - usually once it is stabilised. This simulation process can take tens of minutes or hours, based on the terrain size and other parameters. Once the user is happy with the way water is flowing across the terrain, it can save a 'snapshot' of the simulation state which exports it in a format used by the next, realtime renderer stage.
One good example of a similar algorithm that can be used for this, with more realistic simulation and terrain erosion, is described the "Interactive Terrain Modeling Using Hydraulic Erosion" (link). I am not going to explain my version as it is pretty similar, but feel free to dive into (pun not intended) source code and ask any questions.
Here is a short video of the algorithm in action:
Realtime 3D stage
The renderer stage will not further modify the base water flow, but will use simpler surface wave simulation and effects to provide the illusion of moving water. This is enough for most visualisation or game purposes and is fast and scalable.
A couple of effects are used to provide the appearance of moving water:
Simple localised surface wave simulation that affects normal map and displaces water vertices to a certain degree and can bounce from river banks or other objects. I think I based my algorithm on this article and with a little bit of tweaking made it work on the GPU. This simulation is then moved using the velocity map from the simulation stage to add the realistic water flow effect.
This simulation will only be performed on a rectangular block representing the area around the observer. When the observer moves, the simulation area is updated accordingly. Since this is a relatively fast simulation, newly added area will quickly stabilise into the regular wave pattern for the represented area, so few or no visible artifacts will be induced (unless observer moves too fast).
To allow for a distance based level of detail and add more wave frequencies, multiple simulation layers are run in a cascaded fashion, with each cascade covering the smaller one and its surroundings with the observer near the center.
Water perturbance is added to simulation cascades at real time based on the first stage (flow) simulation state, at areas of high velocity deltas. It will also be added for any other input such as wind or floating/splashing objects.
One additional channel in the simulation texture is used to store a quantity representing the amount of foam which is propagated in parallel with the simple wave simulation well using the velocity map from the flow simulation stage. This adds to the appearance of faster moving and/or splashing water areas.
The foam is rendered using foam tiled texture mapped using UVs that move along the velocity map direction. To prevent UV stretching (as the velocities are different on different areas), three overlapping layers (with slightly different UV scales and offsets) are continuously blended between in such way that the blending is always done between two textures while the third one is not visible and can have its UVs reset to prevent stretching. This is further augmented by a noise based blending mask to hide tiling details and hide blending artifacts.
Same (or very similar) technique for achieving flowing normal and colour maps was recently presented in SIGGRAPH 2010 Water Flow in Portal 2.
Finally, high frequency waves are added to areas of higher water velocity by simply adding animated normal 'noise' wave map on top using the same technique of moving UVs as for displaying the foam texture.
There you go! Of course, there are many things that can be improved and also two stages could be combined to add a completely simulated realtime flow effect. This would enable you to do something like the upcoming Ubisoft's 'From Dust' game, which looks amazing indeed!
The project with the full source code (DirectX9, C++, VisualStudio 2010) can be downloaded from here.
Just the binaries can be downloaded from here.
Datasets can be downloaded from:
hetch_half_dataset (lo-res - good for playing with simulator as it's quick)
hetch_full_dataset (hi-res - looks much better)
4k_x_2k_dataset (big one, pretty unfinished, I could've added more rivers)
If you wish to use your own heightmap, there's an explanation on how to set up a project in the readme file, and you'll need this to convert from a 16bit grayscale .tiff heightmap into .tbmp format used by RiverSim. Have fun and I'll be glad to answer any questions!
- GPU Based Water Simulator
- GPU Gems 2 Water
- Cognitive Radio Cognitive Network Simulator (NS3 based)
- [Attila GPU] Attila OGL2/D3D9 GPU C Model Simulator
- convolution based algorithm for animated water waves
- GPU-based Supercomputing Could Face Price Hikes
- Terrain Rendering Using GPU-Based Geometry Clipmaps
- GPU performance tune on tile-based architecture
- simulator
- [读书笔记-GPU GEMS C1] Effective Water Simulation from Physical Models
- [gpu pro]Fast, Stencil-Based Multiresolution Splatting for Indirect Illumination
- [gpu pro]hybrid min/max plane-based shadow maps
- 关于工业级GPU C-model所使用的性能模拟器(preformance simulator)
- 基于GPU的光线投射体绘制(GPU-Based Ray-Casting Volume Rendering)入门学习
- 基于GPU的光线投射体绘制(GPU-Based Ray-Casting Volume Rendering)入门学习
- 【GPU编程】基于GPU的光线投射体绘制(GPU-Based Ray-Casting Volume Rendering)入门学习
- Water
- WATER
- Hadoop 2.2.0 + HBase 0.96.1.1 + Hive 0.12.0 整合
- DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKCONSTRAINTS检查当前数据库中指定表上的指定约束或所有约束的完整性
- Android开发(7)数据库和Content Provider
- More Effective C++
- iOS中消息的传递机制
- GPU Based Water Simulator
- 使用 Selenium RC 测试 web 应用程序
- VNC 配置方法
- 和规范和方式的
- C++生成不重复的随机数
- JS 计算TextBox文本框值
- os.path关于路径的方法整理
- Android:事件处理
- python else 用法