咱们在游戏里看到的天空实际上就是一个天空盒子,通常多是圆球状的,而后贴上各类天空贴图,从而模拟一种天空的效果。函数
固然,如今已经不多有游戏作那种单一的静态天空盒子,这样天空明显比较死板,并且不管在改场景内待多久,天空盒子都不会改变,没有一种时间流逝的感受。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; }