HLSL学习实践记录: RenderMonkey实现(三):天空盒子

咱们在游戏里看到的天空实际上就是一个天空盒子,通常多是圆球状的,而后贴上各类天空贴图,从而模拟一种天空的效果。函数

固然,如今已经不多有游戏作那种单一的静态天空盒子,这样天空明显比较死板,并且不管在改场景内待多久,天空盒子都不会改变,没有一种时间流逝的感受。spa

这里我尝试这两种效果,都是用Pixel Shader实现的。一个是云飘动,另外一个是天空变化。code

不知道真正游戏开发中是如何作这两个效果的,我这里纯粹是本身胡乱猜测,还望有经验的前辈指导下~游戏

以前天空盒子模型和贴图的载入流程就不记录了,按照以前的博文加旗帜那样就能够了。游戏开发

第一个云飘动其实很简单,对于一个蓝天白云的背景的天空盒子,云飘动就是让背景贴图动起来。开发

随着时间的推移增长贴图的x坐标,等于让贴图移动起来。class

sampler2D sky;
float ftime;

struct PS_INPUT
{
   float2 TexCoord : TEXCOORD0;
};

float4 ps_main(PS_INPUT Input) : COLOR0
{   
   
   Input.TexCoord.x +=0.01*ftime;
  
   return tex2D( sky, Input.TexCoord ); 
}

第二个效果是天空渐变,好比从白天变到黑夜,于是这里准备了两张贴图。test

先取两个采样纹理的颜色,再使用lerp函数将两种颜色混合,混合度由第三个参数决定,从0到1, 对应结果就是彻底不添加第二种颜色到彻底表现为第二种颜色。float

于是只要动态改变第三个参数的值,就能让天空的背景处于一种动态混合的形态,从而完成从白天到黑夜的天然转变。im

sampler2D sky;
sampler2D night;
float ftime;

struct PS_INPUT
{
   float2 TexCoord : TEXCOORD0;
};

float4 ps_main(PS_INPUT Input) : COLOR0
{   
    float4 Color = tex2D(sky, Input.TexCoord);
    float4 Color2 = tex2D(night, Input.TexCoord);
    float test = 0.05f*ftime;
    if (test >1.0f){
       test=1.0f;
       }    
    float4 finalColor = lerp(Color,Color2,test);
    
    return finalColor;
   }
相关文章
相关标签/搜索