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*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渲染精灵的瓶颈在于纹理带宽,这个例子只用一块小纹理渲染少量的精灵。大部分屏幕区域都填充单一的颜色。
转载:
相关文章推荐
- HGE扩展库Qaf教程粗略翻译
- HGE教程翻译(1)
- HGE教程翻译(2)
- HGE教程翻译(3)
- HGE教程翻译(4)
- HGE教程翻译(5)
- HGE教程翻译(1)
- HGE教程翻译(6)
- HGE教程翻译(2)
- HGE教程翻译(7)
- HGE教程翻译(3)
- HGE教程翻译(8)
- HGE教程翻译(4)
- HGE教程翻译(5)
- HGE教程翻译(6)
- 【HGE相关教程/翻译汇总贴】 以及源代码下载
- Unity3D Shader官方教程翻译(三)----Shader语法:属性
- Unity3D Shader官方教程翻译(九)----Shader语法:Pass的雾化处理
- [翻译]XNA系列教程 2D 碰撞教程 1: 矩形检测
- Gensim官方教程翻译(六)——分布式计算(Distributed Computing)