您的位置:首页 > 其它

HGE教程翻译(7)

2013-01-16 16:17 246 查看

Tutorial08–天气

这篇教程示范特效和灯光模拟。

天空的渐变

我们用精灵渲染天空而不用纹理。



hgeSprite*sky;


sky=newhgeSprite(0,0,0,SCREEN_WIDTH,SKY_HEIGHT);



它的上下顶点上不同的颜色,平滑过渡。



hgeColorcolSkyTop;

hgeColorcolSkyBtm;


sky->SetColor(colSkyTop.GetHWColor(),0);

sky->SetColor(colSkyTop.GetHWColor(),1);

sky->SetColor(colSkyBtm.GetHWColor(),2);

sky->SetColor(colSkyBtm.GetHWColor(),3);

sky->Render(0,0);



天空的颜色由一天中的时间决定,在一些颜色常量的插补中计算。



hgeColorcol1,col2;


col1.SetHWColor(skyTopColors[seq[seq_id]]);

col2.SetHWColor(skyTopColors[seq[seq_id+1]]);

colSkyTop=col2*seq_residue+col1*(1.0f-seq_residue);


col1.SetHWColor(skyBtmColors[seq[seq_id]]);

col2.SetHWColor(skyBtmColors[seq[seq_id+1]]);

colSkyBtm=col2*seq_residue+col1*(1.0f-seq_residue);

大海和波浪

同样的着色技术可以用于大海。但这次我们用hgeDistortionMesh类代替hgeSprite来模拟波浪。



hgeDistortionMesh*sea;


sea=newhgeDistortionMesh(SEA_SUBDIVISION,SEA_SUBDIVISION);

sea->SetTextureRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT-SKY_HEIGHT);



要创建波浪,我们为每个曲面网格的节点设置位移和颜色(我们跳过第一和最后一条线因为我们不想让它们移动):



for(i=1;i<SEA_SUBDIVISION-1;i++)

{

//theseareconstantsforeachverticesline

a=float(i)/(SEA_SUBDIVISION-1);

col1=colSeaTop*(1-a)+colSeaBtm*a;

dwCol1=col1.GetHWColor();

fTime=2.0f*hge->Timer_GetTime();

a*=20;


for(j=0;j<SEA_SUBDIVISION;j++)

{

sea->SetColor(j,i,dwCol1);

dy=a*sinf(seaP[i]+//precalculatedphaseshift

(float(j)/(SEA_SUBDIVISION-1)-0.5f)*M_PI*16.0f-fTime);

sea->SetDisplacement(j,i,0.0f,dy,HGEDISP_NODE);

}

}



现在我们为先前跳过的第一和最后一条线设置颜色。



dwCol1=colSeaTop.GetHWColor();

dwCol2=colSeaBtm.GetHWColor();


for(j=0;j<SEA_SUBDIVISION;j++)

{

sea->SetColor(j,0,dwCol1);

sea->SetColor(j,SEA_SUBDIVISION-1,dwCol2);

}



大海准备就绪,我们开始渲染:



sea->Render(0,SKY_HEIGHT);



在源代码中从月亮到太阳有一条光线被模拟。为了达到这点我们只需要在太阳月亮下增加一条1bit的白色线。

天空的物体

星星,月亮和太阳是由带颜色的点组成的精灵。



hgeSprite*sun;

hgeSprite*moon;

hgeSprite*star;


sun=newhgeSprite(texObjects,81,0,114,114);

sun->SetHotSpot(57,57);

moon=newhgeSprite(texObjects,0,0,81,81);

moon->SetHotSpot(40,40);

star=newhgeSprite(texObjects,72,81,9,9);

star->SetHotSpot(5,5);



有趣的地方是光晕和海面上的倒影。它们都是精灵:



hgeSprite*glow;

hgeSprite*seaglow;


glow=newhgeSprite(texObjects,128,128,128,128);

glow->SetHotSpot(64,64);

glow->SetBlendMode(BLEND_COLORADD|BLEND_ALPHABLEND);


seaglow=newhgeSprite(texObjects,128,224,128,32);

seaglow->SetHotSpot(64,0);

seaglow->SetBlendMode(BLEND_COLORADD|BLEND_ALPHAADD);



注意光晕精灵使用不同的渲染模式来达到适当的颜色。它们共享相同的纹理区域。

太阳和月亮的位置,比例和颜色在UpdateSimulation中计算,在RenderSimulation中渲染:



glow->SetColor(colSunGlow.GetHWColor());

glow->RenderEx(sunX,sunY,0.0f,sunGlowS);

sun->SetColor(colSun.GetHWColor());

sun->RenderEx(sunX,sunY,0.0f,sunS);


glow->SetColor(colMoonGlow.GetHWColor());

glow->RenderEx(moonX,moonY,0.0f,moonGlowS);

moon->SetColor(colMoon.GetHWColor());

moon->RenderEx(moonX,moonY,0.0f,moonS);



同样的海面倒影:



seaglow->SetColor(colSeaGlow.GetHWColor());

seaglow->RenderEx(seaGlowX,SKY_HEIGHT,

0.0f,seaGlowSX,seaGlowSY);



注意海面倒影精灵不是适当的比例。

执行

这个例子跑在一个相当高的FPS下。这可能是因为Direct3D渲染精灵的瓶颈在于纹理带宽,这个例子只用一块小纹理渲染少量的精灵。大部分屏幕区域都填充单一的颜色。

转载:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: