我们在游戏里看到的天空实际上就是一个天空盒子,一般可能是圆球状的,然后贴上各种天空贴图,从而模拟一种天空的效果。
当然,现在已经很少有游戏做那种单一的静态天空盒子,这样天空明显比较死板,而且无论在改场景内待多久,天空盒子都不会改变,没有一种时间流逝的感觉。
这里我尝试这两种效果,都是用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;
}