HGEチュートリアル翻訳(8)


Tutorial 08–天気
 
このチュートリアルでは、特効とライトシミュレーションを示します.
空のグラデーション
テクスチャを使わずに精霊で空をレンダリングします.
 
hgeSprite *sky;
     

   
     
   
sky=new hgeSprite(0, 0, 0, SCREEN_WIDTH, SKY_HEIGHT);
     

 
その上下の頂点に異なる色があり、遷移をスムーズにします.
 
hgeColor colSkyTop;
     
hgeColor colSkyBtm;
     

   
     
   
sky->SetColor(colSkyTop.GetHWColor(), 0);
     
sky->SetColor(colSkyTop.GetHWColor(), 1);
     
sky->SetColor(colSkyBtm.GetHWColor(), 2);
     
sky->SetColor(colSkyBtm.GetHWColor(), 3);
     
sky->Render(0, 0);
     

 
空の色は1日の時間によって決まり、いくつかの色定数の補間で計算されます.
 
hgeColor col1, 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);

海と波
同じ着色技術で海に使えます.しかし今回はhgeSpriteの代わりにhgeDistortionMesh類を用いて波をシミュレートした.
 
hgeDistortionMesh *sea;
     

   
     
   
sea=new hgeDistortionMesh(SEA_SUBDIVISION, SEA_SUBDIVISION);
     
sea->SetTextureRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-SKY_HEIGHT);
     

 
波を作成するには、各サーフェスメッシュのノードに変位と色を設定します(移動させたくないので、最初の線と最後の線をスキップします).
 
for(i=1; i<SEA_SUBDIVISION-1; i++)
     
{
     
  // these are constants for each vertices line
     
  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]+ // precalculated phase shift
     
         (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);
     

 
ソースコードで月から太陽にかけて光線がシミュレートされます.これを達成するためには、太陽と月の下に1 bitの白い線を増やすだけです.
空の物体
星、月、太陽は色の点からなる精霊です.
 
hgeSprite *sun;
     
hgeSprite *moon;
     
hgeSprite *star;
     

   
     
   
sun=new hgeSprite(texObjects,81,0,114,114);
     
sun->SetHotSpot(57,57);
     
moon=new hgeSprite(texObjects,0,0,81,81);
     
moon->SetHotSpot(40,40);
     
star=new hgeSprite(texObjects,72,81,9,9);
     
star->SetHotSpot(5,5);
     

 
面白いところはコロナと海面のバックグラウンドです.精霊です
 
hgeSprite *glow;
     
hgeSprite *seaglow;
     

   
     
   
glow=new hgeSprite(texObjects,128,128,128,128);
     
glow->SetHotSpot(64,64);
     
glow->SetBlendMode(BLEND_COLORADD | BLEND_ALPHABLEND);
     

   
     
   
seaglow=new hgeSprite(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の下を走っている.これは、Direct 3 Dレンダースプライトのボトルネックがテクスチャ帯域幅にあるためかもしれません.この例では、小さなテクスチャだけで少量のスプライトをレンダーします.ほとんどの画面領域には、単一の色が塗りつぶされています.