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;
   }
相關文章
相關標籤/搜索