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

我们在游戏里看到的天空实际上就是一个天空盒子,一般可能是圆球状的,然后贴上各种天空贴图,从而模拟一种天空的效果。

当然,现在已经很少有游戏做那种单一的静态天空盒子,这样天空明显比较死板,而且无论在改场景内待多久,天空盒子都不会改变,没有一种时间流逝的感觉。

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

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

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

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

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

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

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

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

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

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


你可能感兴趣的:(HLSL学习实践记录: RenderMonkey实现(三):天空盒子)