咱們在遊戲裏看到的天空實際上就是一個天空盒子,通常多是圓球狀的,而後貼上各類天空貼圖,從而模擬一種天空的效果。函數
固然,如今已經不多有遊戲作那種單一的靜態天空盒子,這樣天空明顯比較死板,並且不管在改場景內待多久,天空盒子都不會改變,沒有一種時間流逝的感受。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; }