|

楼主 |
发表于 2011-12-4 16:26:00
|
显示全部楼层
Re: d3dx9做的波浪水面效果
晕,回复的时候发现没办法放图上去
原理解释:
本例使用的波浪分为两种,物理波浪与纹理波浪,
物理波浪为FX文件里面定义的
truct WAVE
{
float freq; //wave's frequency =2*PI/wavelength
float amp; //amplitude
float phase; // = speed*2*PI/wavelength
float2 dir; //wave's moving direction at a plante XY
};
//in this sample ,dana use 2 sin waves
WAVE wave[NWAVES]=
{
{1.0,0.15,0.5,float2( -1.0,0.0)},
{2.0,0.10,1.3,float2(-0.7,0.7) },
};
这里定义了两重的物理波浪,第一重是波幅0.15方向 -1.0,0.0
第二重物理波是波幅0.10 方向-0.7,0.7的
显示时,使用两重物理波叠加来模拟波浪效果。
纹理波浪:这个例子里的纹理波浪不是真正的纹理,是一张wave.dds的法线图取样而来,虽然使用切空间,但进顶点SHADER的时候顶点的定义为:
struct V_IN
{
float4 v4Pos OSITION;
float2 v2Tex :TEXCOORD0;
float3 v3Normal :NORMAL;
};
即没有TANGENT 与BINORMAL的定义,所以,嘿嘿,顶点的切空间是在顶点着色器里虚拟建立的(建立切空间的那段基本上完全源自FX COMPOSER里的例子,当然,个人感觉这个切空间做的不是很合理,如果对切空间不能理解,可以到网上找相关文章,或者QQ我)。
有了切空间后,就可以从法线图里面找出模型上每个点对应的法线,进入光照模型计算COLOR,
本例使用了3个纹理波
v2BumpUV0.xy=IN.v2Tex.xy*v2TexScale*0.5 + cycle*v2BumpSpeed*1.9;
v2BumpUV1.xy=IN.v2Tex.xy*v2TexScale*1.1 + cycle*v2BumpSpeed*3.1;
v2BumpUV2.xy=IN.v2Tex.xy*v2TexScale*2.1 + cycle*v2BumpSpeed*9.5;
3个纹理波使用不同移动的方向,不同的速度,不同的UV值,叠加生成。
第一次写程序的原理解释,估计文采不好造成理解难度加大,如果有疑问也可以QQ我 61092517 |
|