青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

永遠也不完美的程序

不斷學習,不斷實踐,不斷的重構……

常用鏈接

統計

積分與排名

好友鏈接

最新評論

[轉]HLSL實現Layer Fog

What’s Layer Fog

這個問題通過圖片來解答再合適不過了,下面是本文利用layerFog做的一個結果。

所謂layer fog,顧名思義就是被限制在某一層的霧,本文的目的就是描述如何實現了被限制在一定高度范圍內的霧效。

1         Thanks to Programmable Pipeline

霧效增強場景真實感也不是一天半天了,但無論opengl還是d3d,無論linear(線性衰減)、exp(指數衰減)還是exp2(指數平方衰減),以往實現的霧效都是全局的,要么就都加霧效,要么都不加。在固定渲染流水線的統治時代,想做到“山谷煙霧彌漫,峰頂明月清風是相當復雜而啰嗦的事。

感謝那些大牛公司和它們的圖形精英,他們在享受創造的樂趣之余,想到了我們,給了我們參與創作的機會。可編程流水線的出現,讓我們在做類似layer fog這類事情的時候可以直奔主題。

閑話少說,本文不介紹Programmable Pipeline,也不介紹vspsHLSLeffect,相關知識可以參考Directx9 SDK,下面來開始介紹Layer fog

1         Theory

我們知道霧效最終體現在一個顏色的融合因子上,根據這個融合因子的大小,可以確定霧化程度,如果融合因子為factor,霧的顏色為fogColor,場景點本身的顏色為sceneColor則最終霧化后的顏色finalColor應為:

       finalColor = sceneColor+factor*(fogColor-sceneColor)                (0<=factor<=1)

    該融合因子體現了顏色混合中霧的權重,假設霧的濃度函數為fuction(x,y,z), 以視線進入霧層為起點fStart,實現離開霧層(或到達場景物體表面)為結束點fEnd,factor實際上是function(x,y,z)在從fStartfEnd這段路徑上的積分,如下:

本文的重點是描述layer fog的實現思想,所以采用了最簡單的霧效方程,認為在霧層范圍內,霧的濃度保持常數不變。則公式變為:

distance(fStart,fEnd)是求兩點之間距離的函數,在實際計算中,霧層定義在Y方向,此式往往可用以下公式表示

其中abs函數是取絕對值函數,θ角是射線與XOZ平面的夾角。

下面針對具體情況進行說明。

   

如圖所示,layerFog有霧頂(y坐標為fFogTop),霧底(fFogEnd,霧在fFogEndfFogTop之間存在,需要保證fFogTop>fFogEnd

由于layerfog的照相機位置存在三種情況

l         Camera.y>fFogTop

l         fFogEnd<Camera.y<fFogTop

l         fFogEnd<Camera.y

場景點ScenePoint位置也存在三種情況

l         ScenePoint.y>fFogTop

l         fFogEnd< ScenePoint.y<fFogTop

l         fFogEnd< ScenePoint.y

所以,實際上共有9種組合情況,每種的處理方法有所不同,實際上說白了就一句話“合法范圍內積分,超出霧層范圍之外不進行積分“,本著這個原則針對每種情況的不同確定積分上下限。

1 Code

本文采用Effect實現該算法,其主要代碼如下:

 

texture g_MeshTexture;              // 紋理

 

float4x4 g_matWorld;                  // 物體的世界變換矩陣,由應用程序輸入

float4x4 g_matWorldViewProj;    // World * View * Projection matrix,由應用程序輸入

float4   g_FogParameter;//.x=fogHeight   .y = fogEnd  .z = fogRange,由應用程序輸入

float4   g_vCamera;      //攝像機位置,由應用程序輸入

float4   g_FogColor;     //霧顏色,由應用程序輸入

 

//--------------------------------------------------------------------------------------

// 紋理采樣器

//--------------------------------------------------------------------------------------

sampler MeshTextureSampler =

sampler_state

{

    Texture = <g_MeshTexture>;

    MipFilter = LINEAR;

    MinFilter = LINEAR;

    MagFilter = LINEAR;

};

 

 

//--------------------------------------------------------------------------------------

// 頂點著色器輸入結構體

//--------------------------------------------------------------------------------------

 

struct VS_INPUT

{

    float4 Position   : POSITION;   // 頂點位置

    float4 Diffuse    : COLOR0;     // 頂點顏色

    float2 TextureUV  : TEXCOORD0;  // 紋理坐標

};

//--------------------------------------------------------------------------------------

// 頂點著色器輸出結構體

//--------------------------------------------------------------------------------------

 

struct VS_OUTPUT

{

    float4 Position   : POSITION;   // 頂點位置

    float2 TextureUV  : TEXCOORD0;  // 紋理坐標

     float4 FogVal     : COLOR0;      //霧化因子,僅使用x分量

};

 

//--------------------------------------------------------------------------------------

// 頂點著色器處理程序

//--------------------------------------------------------------------------------------

VS_OUTPUT RenderSceneVS( const VS_INPUT Input)

{

         float4 clpPos, camPos, worldPos;

         float fDistance;

        

         // 初始化輸出

         VS_OUTPUT ut = (VS_OUTPUT) 0;

        

         // 計算頂點剪切空間的坐標

         clpPos = mul(Input.Position, g_matWorldViewProj);

         Out.Position = clpPos;

        

         // 輸出紋理坐標

         Out.TextureUV.xy = Input.TextureUV.xy;

        

         // 獲得霧化參數

         float fFogTop   = g_FogParameter.x;

         float fFogEnd   = g_FogParameter.y;

         float fFogRange = g_FogParameter.z;

        

        

         // 計算頂點在世界坐標系中的位置

         worldPos = mul(Input.Position, g_matWorld);

        

         // 計算頂點和觀測者之間的位置

         fDistance = distance(worldPos, g_vCamera);

        

         // factor = 1/sinθ * fDensityFog ,其中fDensityFog = 1/fFogRange;

         // 該值就是最后與deltaY相乘的系數,在一起計算,可以節省一次除法運算。

        

         float factor =fDistance/(fFogRange*(worldPos.y - g_vCamera.y));

      

         //fDeltaY 是經過霧層的線段在Y方向的距離,下面是分情況卻定fDeltaY的代碼 

         float fDeltaY ;

         if(g_vCamera.y > fFogTop)

              {

                            if (worldPos.y > fFogTop) //

                            {

                                 fDeltaY = 0.0f;

                            }

                            else

                            {

                                 if( worldPos.y > fFogEnd)//fFogEnd< worldPos.y <fFogTop

                                 {

                                     fDeltaY = fFogTop - worldPos.y;

                                 }

                                 else                      //worldPos.y< fFogEnd

                                 {

                                     fDeltaY = fFogTop - fFogEnd;

                                 }

                            }

              }

              else

              {

                       if( g_vCamera.y > fFogEnd)

                       {

                                     if (worldPos.y > fFogTop)

                                     {

                                         

                                          fDeltaY =fFogTop - g_vCamera.y;

                                     }

                                     else

                                     {

                                          if( worldPos.y > fFogEnd)//fFogEnd< worldPos.y <fFogTop

                                          {

                                               fDeltaY = worldPos.y - g_vCamera.y;

                                          }

                                          else                        //worldPos.y< fFogEnd

                                          {

                                               fDeltaY = fFogEnd -g_vCamera.y;

                                          }

                                     }

                       }

                       else//g_vCamera.y < fFogEnd

                       {

                                 if (worldPos.y > fFogTop)

                                     {

                                          fDeltaY = fFogTop - fFogEnd;

                                     }

                                     else

                                     {

                                          if( worldPos.y > fFogEnd) //fFogEnd< worldPos.y <fFogTop

                                          {

                                               fDeltaY =  worldPos.y - fFogEnd;

 

                                          }

                                          else                     //worldPos.y< fFogEnd

                                          {

                                               fDeltaY = 0.0f;

                                          }

                                     }

                       }

              }

         Out.FogVal.x = abs(factor*fDeltaY);

         return Out;

}

 

 

//--------------------------------------------------------------------------------------

// 象素著色器輸出結構體

//--------------------------------------------------------------------------------------

struct PS_OUTPUT

{

    float4 RGBColor : COLOR0;  // 象素顏色 

};

struct PS_IUTPUT

{

    float2 TextureUV  : TEXCOORD0;  // 頂點紋理坐標

    float4  FogVal    : COLOR0;      //霧化系數

};

//--------------------------------------------------------------------------------------

// This shader outputs the pixel's color by modulating the texture's

//       color with diffuse material color

//--------------------------------------------------------------------------------------

PS_OUTPUT RenderScenePS( const PS_IUTPUT In)

{

  PS_OUTPUT Output;

 

  //獲得紋理顏色

  Output.RGBColor = tex2D(MeshTextureSampler, In.TextureUV);

 

  //顏色混合

  float f = In.FogVal.x;

  Output.RGBColor = lerp(Output.RGBColor,g_FogColor,f);

  return Output;

}

posted on 2008-08-27 17:18 狂爛球 閱讀(848) 評論(0)  編輯 收藏 引用 所屬分類: 圖形編程

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产伦精品一区二区三区照片91 | 国产精品老女人精品视频| 欧美一区二区三区免费视| 亚洲一区二区三区成人在线视频精品 | 亚洲黄色毛片| 免费精品视频| 欧美大片免费观看| 欧美国产视频日韩| 亚洲精品久久嫩草网站秘色| 欧美激情第二页| 亚洲欧洲日本mm| 亚洲欧美另类久久久精品2019| 欧美一级久久| 欧美精品日韩三级| 国产美女精品人人做人人爽| 伊人成综合网伊人222| 亚洲精品色图| 欧美一级播放| 欧美福利小视频| 亚洲淫性视频| 欧美jjzz| 国产亚洲午夜高清国产拍精品| 极品裸体白嫩激情啪啪国产精品| 亚洲国产欧美在线| 欧美亚洲色图校园春色| 久久伊人免费视频| 中文在线资源观看网站视频免费不卡 | 亚洲专区一区| 久久久亚洲一区| 99pao成人国产永久免费视频| 午夜精品理论片| 欧美激情综合在线| 黄色成人免费观看| 先锋资源久久| 亚洲欧洲在线免费| 欧美一区二区精品| 国产精品地址| 日韩一级在线| 欧美激情精品久久久久久黑人| 亚洲电影专区| 欧美精品99| 国产综合色一区二区三区| 9色porny自拍视频一区二区| 久久综合久久美利坚合众国| 亚洲激情网站免费观看| 久久精品一区二区三区中文字幕| 国产精品成人av性教育| 日韩一区二区久久| 亚洲第一中文字幕| 久久久久久九九九九| 国产欧美日韩亚洲| 亚洲欧美久久久久一区二区三区| 亚洲丰满少妇videoshd| 久久精品国产免费看久久精品| 国产精品免费看| 亚洲欧美日韩天堂一区二区| 99国产精品久久久久老师| 欧美激情一区二区三级高清视频| 黄网站免费久久| 久久久久久伊人| 午夜在线视频观看日韩17c| 国产精品激情| 亚洲男人av电影| 一区二区激情视频| 欧美午夜免费电影| 亚洲曰本av电影| a4yy欧美一区二区三区| 欧美日韩午夜精品| 亚洲欧美日韩成人| 亚洲永久免费观看| 国产欧美一区二区精品婷婷| 欧美一级淫片aaaaaaa视频| 亚洲欧美国产一区二区三区| 国产免费一区二区三区香蕉精| 欧美综合国产| 久久国产精品99国产精| 黄色免费成人| 亚洲国产成人91精品| 欧美日韩精品欧美日韩精品一 | 欧美精品一区二区三区在线播放| 亚洲精品午夜精品| 99在线热播精品免费| 国产精品久久久久aaaa樱花| 欧美综合国产| 蜜臀va亚洲va欧美va天堂| 日韩亚洲欧美中文三级| 亚洲一区二区三区在线看| 国产一区欧美| 亚洲福利视频二区| 国产精品看片你懂得| 久久人人爽人人爽爽久久| 欧美成人性生活| 欧美一区二区三区喷汁尤物| 久久综合给合久久狠狠狠97色69| 一本色道久久加勒比88综合| 欧美亚洲自偷自偷| 日韩一级裸体免费视频| 欧美一乱一性一交一视频| 亚洲欧洲一区二区天堂久久| 中文高清一区| 日韩视频免费| 国产一级久久| 夜夜嗨av色综合久久久综合网| 国产日韩欧美亚洲| 亚洲精品国产精品国产自| 国产丝袜美腿一区二区三区| 亚洲国产欧美久久| 国产一区二区高清视频| 亚洲乱码国产乱码精品精| 狠狠爱综合网| 一本久道久久综合狠狠爱| 亚洲国产精品一区| 欧美一区二区三区免费视频| 一区二区三区.www| 老司机67194精品线观看| 亚洲欧美日韩中文在线制服| 免费日韩av| 老司机午夜精品视频| 国产精品视频自拍| 一本久道久久综合中文字幕| 亚洲精品一二三| 久久综合一区| 久久综合伊人77777蜜臀| 国产精品日日做人人爱| av成人激情| 99国产精品99久久久久久| 久久久久成人精品免费播放动漫| 香蕉久久夜色| 国产精品乱码人人做人人爱| 亚洲激情欧美| 99精品视频免费观看视频| 免费观看亚洲视频大全| 久久综合色影院| 国产三区二区一区久久| 亚洲综合不卡| 久久国产福利国产秒拍| 国产精品免费一区二区三区在线观看 | 一区二区三区成人| 亚洲第一在线综合在线| 欧美在线视频播放| 久久久蜜桃一区二区人| 国产一区二区激情| 久久高清国产| 免费观看日韩av| 在线国产精品播放| 女女同性精品视频| 亚洲黄色一区二区三区| 亚洲精品一区二区三区不| 欧美激情黄色片| 99精品久久免费看蜜臀剧情介绍| 一区二区三区久久精品| 欧美视频在线观看 亚洲欧| 9i看片成人免费高清| 小嫩嫩精品导航| 国产精品亚洲美女av网站| 欧美在线观看一区二区| 老妇喷水一区二区三区| 亚洲国产精品国自产拍av秋霞| 免费在线国产精品| 国产精品乱码| 久久久久看片| 亚洲三级网站| 久久www成人_看片免费不卡 | 亚洲精品视频免费| 欧美绝品在线观看成人午夜影视| 亚洲乱码国产乱码精品精可以看 | 欧美激情视频一区二区三区在线播放| 亚洲高清资源| 国产精品99久久久久久人 | 国产亚洲二区| 久久久久www| 亚洲美女毛片| 美女久久网站| 中文国产成人精品| 国产一区二区三区久久久久久久久| 久久综合网hezyo| 亚洲欧美欧美一区二区三区| 欧美成人精品在线播放| 中文精品视频一区二区在线观看| 国产麻豆精品theporn| 老色批av在线精品| 香蕉久久一区二区不卡无毒影院| 美女露胸一区二区三区| 亚洲综合大片69999| 精品动漫3d一区二区三区| 国产精品jizz在线观看美国 | 久久久久一区二区三区四区| 亚洲三级影院| 国产欧美亚洲精品| 欧美精品一区二区三区四区| 久久精品二区| 午夜精品久久久久久99热| 亚洲人成人77777线观看| 久久在线免费观看| 欧美在线免费观看视频| 国产精品99久久久久久久女警| 亚洲国产精品第一区二区| 国产视频一区二区在线观看| 国产精品久久| 国产精品久久久久久福利一牛影视|