六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 277|回复: 0

Introduction to my galaxy engine 8 : Real Time Fluid Rendering

[复制链接]

升级  7.33%

72

主题

72

主题

72

主题

举人

Rank: 3Rank: 3

积分
222
 楼主| 发表于 2012-12-30 11:51:33 | 显示全部楼层 |阅读模式
Introduction to my galaxy engine 8 : Real Time Fluid Rendering

<div id="cnblogs_post_body">最近正在研究real time fluid effect方面的问题,主要适用于液体,烟雾,火焰方面的实时模拟。一般是通过GPGPU(general purpose GPU)来实现的。


以下是2D Fluid初步实验的截图:


要理解实现原理,首先要熟悉其基于的物理模型:“stable fluids” by Stam 1999. 从实现角度来说,根据fluid effect的计算公式

主要考虑如下几个要素:Advection [气]水平对流, pressure, diffusion, (Vorticity [涡旋] Confinement 主要用于烟雾,火焰), external forces. 每一个要素的作用大小是通过读取其对应的图片来获取的。
具体实现步骤如下:
1.将屏幕分为一定大小数量的网格,如图所示:

由于我的窗口大小设定为800*600,横行分为了80*2格,纵向分为了60*2格.之后的相关计算都是以格子为单位。蓝色为边界部分,不做为渲染区域。
2. 根据网格生成顶点。
<div class="cnblogs_code">    VS_INPUT_FLUIDSIM_STRUCT tempVertex1;    VS_INPUT_FLUIDSIM_STRUCT tempVertex2;    VS_INPUT_FLUIDSIM_STRUCT tempVertex3;    VS_INPUT_FLUIDSIM_STRUCT tempVertex4;    int w = m_dim[0];    int h = m_dim[1];    float left   = -1.0f + 2.0f/w;//exclude the boundary cell, each cell size is 2.0f/w    float right  =  1.0f - 2.0f/w;    float top    =  1.0f - 2.0f/h;    float bottom = -1.0f + 2.0f/h;    tempVertex1.Pos = D3DXVECTOR3( left, top, 0.0f);//projection screen pos    tempVertex1.Tex = D3DXVECTOR3( 1.0f, 1.0f, 0.0f);//texture pos, exclude boundary cell    tempVertex2.Pos = D3DXVECTOR3( right, top, 0.0f);    tempVertex2.Tex = D3DXVECTOR3( (w-1.0f), 1.0f, 0.0f);    tempVertex3.Pos = D3DXVECTOR3( right, bottom, 0.0f);    tempVertex3.Tex = D3DXVECTOR3( (w-1.0f), (h-1.0f), 0.0f);    tempVertex4.Pos = D3DXVECTOR3( left, bottom, 0.0f);    tempVertex4.Tex = D3DXVECTOR3( 1.0f, (h-1.0f), 0.0f);    (*vertices)[index++] = tempVertex1;    (*vertices)[index++] = tempVertex2;    (*vertices)[index++] = tempVertex3;    (*vertices)[index++] = tempVertex1;    (*vertices)[index++] = tempVertex3;    (*vertices)[index++] = tempVertex4;
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表