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);
    

 

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

 

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);

大海和波浪

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

 

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下。这可能是因为Direct3D渲染精灵的瓶颈在于纹理带宽,这个例子只用一块小纹理渲染少量的精灵。大部分屏幕区域都填充单一的颜色。

 
CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以与更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了与现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值