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

永遠也不完美的程序

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

常用鏈接

統計

積分與排名

好友鏈接

最新評論

[轉]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>
            亚洲欧美日韩综合国产aⅴ| 久久av二区| 国产欧美日韩另类一区 | 欧美国产激情| 欧美日韩精品不卡| 国产精品免费看片| 国产一区二区三区高清在线观看| 狠狠噜噜久久| 91久久精品视频| 亚洲视频日本| 久久精品一区蜜桃臀影院| 牛夜精品久久久久久久99黑人 | 亚洲欧美精品中文字幕在线| 欧美呦呦网站| 亚洲国产精品一区二区www| 亚洲日本欧美天堂| 亚洲欧美久久久| 葵司免费一区二区三区四区五区| 欧美日韩一区二区三区在线| 国产视频在线观看一区 | 亚洲精品一线二线三线无人区| 亚洲欧美区自拍先锋| 久久综合狠狠综合久久综青草| 日韩亚洲在线观看| 亚洲少妇在线| 国产精品美女一区二区在线观看| 国内精品视频在线播放| 一本色道久久综合一区| 久久久国产精品亚洲一区| 亚洲激情女人| 久久久精品免费视频| 欧美视频中文字幕| 亚洲人成在线观看一区二区| 久久精品国产一区二区三| 日韩一级大片在线| 美女视频一区免费观看| 国产一区视频在线观看免费| 香蕉av777xxx色综合一区| 91久久国产综合久久蜜月精品 | 欧美激情精品久久久久| 国语自产精品视频在线看一大j8| 亚洲午夜伦理| 亚洲精品免费网站| 久久一日本道色综合久久| 国产日韩精品在线播放| 亚洲一区欧美二区| 亚洲日韩成人| 欧美aⅴ99久久黑人专区| 激情婷婷久久| 久久久综合视频| 校园春色综合网| 国产精品一区一区| 欧美亚洲视频| 亚洲欧美另类久久久精品2019| 欧美日韩在线不卡| 亚洲一二三四区| 一区二区三区高清视频在线观看| 欧美日本亚洲视频| 一区二区三区久久| 亚洲九九精品| 国产精品久久久久久久久久免费 | 开心色5月久久精品| 欧美一区二区三区久久精品茉莉花| 国产精品成人免费视频| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 一区二区av| 欧美日韩在线第一页| 中文欧美在线视频| 中文欧美在线视频| 国产精品免费视频观看| 欧美一区二区在线免费观看| 久久爱另类一区二区小说| 亚洲网站在线观看| 一本久道久久综合狠狠爱| 欧美色网在线| 欧美一区观看| 久久在线播放| 日韩亚洲不卡在线| 亚洲午夜羞羞片| 国产一区二区三区直播精品电影| 久久久综合精品| 欧美激情精品久久久久| 一区二区三区精品国产| 亚洲一区国产| 亚洲第一黄色网| 一本色道久久88精品综合| 国产三级欧美三级| 亚洲国产成人av在线| 国产精品乱码妇女bbbb| 麻豆成人91精品二区三区| 欧美黄色免费网站| 欧美在线高清视频| 欧美成人午夜视频| 欧美一区观看| 欧美精品导航| 久久综合久久综合久久综合| 欧美伦理一区二区| 久久久久久亚洲综合影院红桃| 欧美激情国产日韩| 久久免费精品视频| 欧美伦理91| 美女日韩欧美| 国产精品成人一区二区三区夜夜夜| 老司机aⅴ在线精品导航| 国产精品乱人伦一区二区 | 国产精品亚洲片夜色在线| 欧美aⅴ一区二区三区视频| 欧美日韩一区二区三| 欧美大片在线看| 国产欧美 在线欧美| 91久久精品日日躁夜夜躁欧美 | 国语精品一区| 宅男噜噜噜66一区二区66| 亚洲激情网站| 久久久蜜臀国产一区二区| 午夜日韩福利| 欧美日本成人| 亚洲电影免费观看高清| 精品不卡一区| 性做久久久久久久免费看| 一区二区三区高清在线| 欧美成人a∨高清免费观看| 久热精品在线| 黑丝一区二区| 欧美一区不卡| 久久aⅴ国产紧身牛仔裤| 国产精品试看| 亚洲专区免费| 欧美一级大片在线观看| 国产精品久久一卡二卡| 亚洲网站在线| 欧美一区二区三区啪啪| 国产精品露脸自拍| 欧美三级第一页| 久久全国免费视频| 欧美韩日亚洲| 裸体素人女欧美日韩| 欧美成人tv| 欧美黑人多人双交| 中文日韩电影网站| 久久婷婷人人澡人人喊人人爽| 你懂的视频一区二区| 国产精品自在线| 亚洲日本免费| 久久精品视频在线| 一区二区三区精品| 欧美日韩精品一区视频| 亚洲国产欧美在线| 久久天天狠狠| 亚洲一区在线免费观看| 欧美福利小视频| 欧美日韩在线一区二区| 亚洲在线电影| 一本色道久久99精品综合| 久久青青草综合| 国产欧美一区二区色老头| 亚洲精品日韩在线| 欧美成人午夜激情在线| 久久激情网站| 黄色综合网站| 久久蜜臀精品av| 老司机精品久久| 1024亚洲| 欧美国产日产韩国视频| 亚洲性线免费观看视频成熟| 国产精品区一区二区三| 一区二区三区日韩精品视频| 一区二区精品在线观看| 国产精品99一区| 亚洲一区二区毛片| 日韩一级成人av| 国产女优一区| 亚洲国产高清自拍| 欧美日韩一区二区三区四区在线观看| 亚洲午夜黄色| 国产精品区二区三区日本| 一区二区三区日韩精品视频| 欧美一二三区在线观看| 在线一区视频| 国产精品久久久久7777婷婷| 亚洲一区精彩视频| 亚洲免费在线播放| 欧美日韩在线播放三区| 久久av红桃一区二区小说| 欧美电影在线观看完整版| 亚洲免费一在线| 久久综合网络一区二区| 亚洲欧美春色| 另类天堂视频在线观看| 午夜精品久久久久久久99热浪潮| 免费一级欧美在线大片| 欧美在线高清| 影音先锋在线一区| 午夜欧美大片免费观看| 亚洲一区激情| 久久免费的精品国产v∧| 欧美一激情一区二区三区| 欧美日韩国产二区| 一本色道久久88亚洲综合88| 一本高清dvd不卡在线观看|