• <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>

            grep命令介紹

            語法: grep [options] 
             PATTERN [FILE...] 
             grep用以在file內文中比對相對應的部分,或是當沒有指定檔案時, 
             由標準輸入中去比對。 在預設的情況下,grep會將符合樣式的那一行列出。

                     此外,還有兩個程式是grep的變化型,egrep及fgrep。          
                     其中egrep就等同於grep -E ,fgrep等同於grep -F 。

             ◎參數
                1. -A NUM,--after-context=NUM 
                           除了列出符合行之外,并且列出後NUM行。
                         
                     ex:   $ grep -A 1 panda file 
                           (從file中搜尋有panda樣式的行,并顯示該行的後1行)
                                             
                2. -a或--text  
                           grep原本是搜尋文字檔,若拿二進位的檔案作為搜尋的目標,
                           則會顯示如下的訊息: Binary file 二進位檔名 matches 然後結束。
                              
                           若加上-a參數則可將二進位檔案視為文字檔案搜尋,
                           相當於--binary-files=text這個參數。
                        
                     ex:   (從二進位檔案mv中去搜尋panda樣式)
                           (錯誤!!!)
                           $ grep panda mv 
                           Binary file mv matches  
                           (這表示此檔案有match之處,詳見--binary-files=TYPE )
                           $
                           (正確!!!)
                           $ grep -a panda mv 
                   
                3. -B NUM,--before-context=NUM
                           與 -A NUM 相對,但這此參數是顯示除符合行之外
                           并顯示在它之前的NUM行。        
                         
                     ex:   (從file中搜尋有panda樣式的行,并顯示該行的前1行)
                           $ grep -B 1 panda file 

                4. -C [NUM], -NUM, --context[=NUM]  
                           列出符合行之外并列出上下各NUM行,預設值是2。
                         
                     ex:   (列出file中除包含panda樣式的行外并列出其上下2行)
                           (若要改變預設值,直接改變NUM即可)
                           $ grep -C[NUM]  panda file 
                         
                5. -b, --byte-offset
                           列出樣式之前的內文總共有多少byte ..
                          
                      ex:  $ grep -b  panda file  
                   顯示結果類似於:
                     0:panda
                    66:pandahuang
                   123:panda03
                       
                6. --binary-files=TYPE
                           此參數TYPE預設為binary(二進位),若以普通方式搜尋,只有2種結果:
                             1.若有符合的地方:顯示Binary file 二進位檔名 matches
                             2.若沒有符合的地方:什麼都沒有顯示。
                               
                           若TYPE為without-match,遇到此參數,
                           grep會認為此二進位檔案沒有包含任何搜尋樣式,與-I 參數相同。
                               
                           若TPYE為text, grep會將此二進位檔視為text檔案,與-a 參數相同。
                    
                 Warning: --binary-files=text 若輸出為終端機,可能會產生一些不必要的輸出。
                          
                7. -c, --count
                   不顯示符合樣式行,只顯示符合的總行數。
                   若再加上-v,--invert-match,參數顯示不符合的總行數。

                8. -d ACTION, --directories=ACTION
                           若輸入的檔案是一個資料夾,使用ACTION去處理這個資料夾。
                   預設ACTION是read(讀取),也就是說此資料夾會被視為一般的檔案;
                   若ACTION是skip(略過),資料夾會被grep略過:
                   若ACTION是recurse(遞),grep會去讀取資料夾下所有的檔案,
                   此相當於-r 參數。

                9.  -E, --extended-regexp
                   采用規則表示式去解釋樣式。
                  
               10.  -e PATTERN, --regexp=PATTERN
                   把樣式做為一個partern,通常用在避免partern用-開始。  

               11.  -f FILE, --file=FILE
                   事先將要搜尋的樣式寫入到一個檔案,一行一個樣式。
                   然後采用檔案搜尋。
                   空的檔案表示沒有要搜尋的樣式,因此也就不會有任何符合。
                   
               ex: (newfile為搜尋樣式檔)
                   $grep -f newfile file    

               12.  -G, --basic-regexp
                   將樣式視為基本的規則表示式解釋。(此為預設)

               13.  -H, --with-filename
                   在每個符合樣式行前加上符合的檔案名稱,若有路徑會顯示路徑。
                   
               ex: (在file與testfile中搜尋panda樣式)   
                   $grep -H panda file ./testfile
                            file:panda
                            ./testfile:panda
                            $
                 
               14.  -h, --no-filename  
                           與-H參數相類似,但在輸出時不顯示路徑。

               15.  --help 
                           產生簡短的help訊息。

               16.  -I
                           grep會強制認為此二進位檔案沒有包含任何搜尋樣式,
                           與--binary-files=without-match參數相同。
                               
                       ex:  $ grep -I  panda mv

               17.  -i, --ignore-case       
                           忽略大小寫,包含要搜尋的樣式及被搜尋的檔案。
                           
                       ex:  $ grep -i panda mv
                            
               18.  -L, --files-without-match 
                           不顯示平常一般的輸出結果,反而顯示出沒有符合的檔案名稱。

               19.  -l, --files-with-matches               
                           不顯示平常一般的輸出結果,只顯示符合的檔案名稱。

               20.  --mmap               
                           如果可能,使用mmap系統呼叫去讀取輸入,而不是預設的read系統呼叫。 
                           在某些狀況,--mmap 能產生較好的效能。 然而,--mmap 
                           如果運作中檔案縮短,或I/O 錯誤發生時,
                           可能造成未定義的行為(包含core dump),。
                           
               21.  -n, --line-number
                           在顯示行前,標上行號。
                           
                        ex:  $ grep -n  panda file  
                            顯示結果相似於下:
                            行號:符合行的內容

               22.  -q, --quiet, --silent 
                           不顯示任何的一般輸出。請參閱-s或--no-messages

               23.  -r, --recursive
                   遞地,讀取每個資料夾下的所有檔案,此相當於 -d recsuse 參數。

               24.  -s, --no-messages
                   不顯示關於不存在或無法讀取的錯誤訊息。
                 
             小: 不像GNU grep,傳統的grep不符合POSIX.2協定,
                   因為缺乏-q參數,且他的-s 參數表現像GNU grep的 -q 參數。
                   Shell Script傾向將傳統的grep移植,避開-q及-s參數,
                   且將輸出限制到/dev/null。
                
            POSIX: 定義UNIX及UNIX-like系統需要提供的功能。              
                
               25.  -V, --version
              顯示出grep的版本號到標準錯誤。
              當您在回報有關grep的bugs時,grep版本號是必須要包含在內的。

               26.  -v, --invert-match
              顯示除搜尋樣式行之外的全部。
                               
               27.  -w, --word-regexp
                      將搜尋樣式視為一個字去搜尋,完全符合該"字"的行才會被列出。

               28.  -x, --line-regexp
              將搜尋樣式視為一行去搜尋,完全符合該"行"的行才會被列出。

            posted @ 2008-06-03 03:16 RedLight 閱讀(342) | 評論 (0)編輯 收藏

            Visual Assist X AutoText修改

                 摘要:   閱讀全文

            posted @ 2008-05-27 02:12 RedLight 閱讀(863) | 評論 (0)編輯 收藏

            網絡游戲的位置同步

                 摘要:   閱讀全文

            posted @ 2008-05-12 02:55 RedLight 閱讀(759) | 評論 (1)編輯 收藏

            網絡游戲中的攻擊行為

                 摘要:   閱讀全文

            posted @ 2008-05-12 02:51 RedLight 閱讀(455) | 評論 (0)編輯 收藏

            網絡游戲中的社會關系

                 摘要:   閱讀全文

            posted @ 2008-05-12 02:48 RedLight 閱讀(537) | 評論 (1)編輯 收藏

            你是哪類游戲設計師?(12類)

                 摘要:   閱讀全文

            posted @ 2008-05-12 02:44 RedLight 閱讀(254) | 評論 (0)編輯 收藏

            MMORPG玩家動機研究

                 摘要:   閱讀全文

            posted @ 2008-05-12 02:42 RedLight 閱讀(430) | 評論 (0)編輯 收藏

            基于四叉樹空間劃分的地形實時渲染方法

            地形是計算機圖形的一個重要組成部分,而它又具有特殊的形態。地形往往覆蓋面積極廣,且精度要求很高,使得我們必須用許多多邊形來描述。這樣的特點使得我們不能像對待其他普通模型那樣對待地形。要想實時地渲染地形,我們需要一些特殊的方法。

                地形渲染一直以來都是計算機圖形學中一個重要的研究領域。并且在這一方面已經誕生了許多優秀的算法。其中包括基于體素的渲染方法,也有基于多邊形的渲染方法。早期的游戲,如三角洲特種部隊就是采用體素渲染法的成功例子。體素法類似光線追蹤渲染,它從屏幕空間出發,找到地形與屏幕像素發出的射線交點,然后確定該像素的顏色。這種方法不依賴具體的圖形硬件,整個渲染過程完全使用CPU處理,因此它不能使用現代硬件來加速,并且對于一個場景來說,往往不只是地形,還有其他使用多邊形描述的物體,體素法渲染的圖像很難與硬件渲染的多邊形進行混合,因此這種方法現在用得極少。而多邊形渲染方法則成為一種主流。選擇多邊形來描述和渲染地形有很多的理由和優點。最重要的是它能夠很好地使用硬件加速,并且能夠和其他多邊形對象一起統一管理。

                已有大量優秀的基于多邊形的地形渲染算法。比較經典的算法有M. Duchaineau等人提出ROAM算法。這個算法采用一棵三角二叉樹來描述整個地形。一個地形在最初的層次上由兩個較大的等腰直角三角形組成,這兩個等腰直角三角形可以被不斷地細分來展現地形的更多細節。每一次細分過程都向直角三角形的斜邊的中點處增加一個由高程數據所描述的頂點,該點將所在的直角三角形一分為二,同時該算法也定義了一些規則來保證地形中不會因相鄰兩個三角形細節層次的不同而出現裂縫。這個算法已被許多游戲所采用。還有一類算法,通過將地形在X-Z投影面上不斷地規則細分來得到不同的細節,這就是本文要介紹的四叉樹空間劃分算法。另外,最新提出的一個地形算法也不得不提,Hugues Hoppe在2004年提出的幾何裁剪圖方法(Geometry Clipmaps),算法使用了最新硬件所支持的頂點紋理來定義地形的外觀,并且對于距離攝影機不同遠近的地方采用不同的紋理層,最大限度地使用硬件加速了地形渲染的過程。這個方法聽起來非常美妙,但它目前只被較少的硬件支持。因為頂點紋理是Shader Model 3.0才支持的功能,也就是說只有DirectX 9.0c級別的顯卡才能支持這種算法。這對于某些有普及性要求的圖形應用程序,尤其是對游戲來講不是一件好的事情。因此大多數人現在還在使用經典的地形渲染方法。

                首先,基于四叉樹的地形渲染方法使用高程數據作為數據源。且算法要求高程數據的大小必須為2n+1的正方形。所謂高程數據,即色彩范圍在0-255的灰度圖片,不同的灰度代表了不同的高度值。如果某高程數據指出這個高程數據最高處的Y坐標值是4000,那么在高程數據中一個值為255的像素點就表示這個點所代表的地形區域的高度是4000,同理如果該像素值是127那么就表示這個點所代表的地形區域的高度是4000×(127/255)=2000。高程數據的每個像素都對應所渲染網格中的一個頂點。另外還有一個參數描述頂點與頂點之間的水平距離,以及一個描述最大高度的參數。因此地形的基本數據結構如下:

                struct Terrain
                {
                    char **DEM; //一個描述高程數據的二維數組
                    float CellSpace;
                    float HeightScale; 
                }

                其中,各變量的具體意義如下圖所示:

                有了這些參數,我們可以很容易地由高程數據的參數值得到它所表述的多邊形網格。得到這個網格之后,可以簡單地把它放入頂點數組,并為之建立一個頂點索引,就可以傳入硬件進行渲染了。然而,事情并不是這么簡單。對于較小尺寸的高程數據(如129×129),這樣做確實可行,但隨著高程數據規模的增大,所需的頂點數和描述網格的三角形數會急劇膨脹。這個數值很快就會大到最新的顯卡也無法接受。比如一個1025×1025的高程數據,我們需要1025×1025=1050625個頂點,以及1050625×2=2101250個三角形。就算你的顯卡每秒能夠渲染1000萬個三角形,你也只能得到不到5fps的渲染速度,況且你的場景可能還不只包括地形。因此我們必須想辦法在不影響視覺效果的情況下縮減所渲染的三角形數量,另外還應該注意一次性將最多的數據預先傳給硬件以節約帶寬。

                這里要講解的算法,目的就是在不影響或在視覺可以接受的范圍內縮減所渲染三角形的數量,以達到實時渲染的要求。根據測試,本算法在漫游大小為1025*1025的地形時速度穩定在150fps以上(在nVidia Geforce 6200 + P4 1.6GHz的硬件上得到)。

                由于地形覆蓋范圍廣,但它的投影在XZ平面上均勻分布(以下采用OpenGL中的右手坐標系,Y軸為豎直向上的坐標軸),因此我們有必要考慮對地形進行空間劃分。正是由于這樣的均勻分布,給我們的劃分過程帶來了便利。我們不需要具體地去分割某個三角形,只要選擇那些過頂點且和X或Z軸垂直的平面作為劃分面即可。例如對于一個高程數據,我們可以以坐標原點作為地形的中心點,然后沿著X軸和Z軸依次展開來分布各個頂點。如下如所示。

                首先,我們可以選擇X=0和Z=0這兩個平面,將地形劃分為等大的四個區域,然后對劃分出來的四個子區域進行遞歸劃分,每次劃分都選擇交于區域中心點并且互相垂直的兩個平面作為劃分面,直到每個子區域都只包含一個地形單元塊(即兩個三角形)而不能再劃分為止。例如對于上圖所示9*9大小的地形塊,經過劃分之后如下圖所示:

                由圖可知,只有高程數據滿足大小2n+1的正方形這個條件,我們才可能對地形進行均勻劃分。我們可以把劃分結果用一棵樹來表述,由于每次劃分之后產生四個子節點,因此這棵樹叫四叉樹。那么,這棵樹中應該存儲那些信息呢?首先對于每個節點,應該指定這個節點所代表的地形的區域范圍。并不是把地形網格中實際的頂點放入樹中,而是要在樹中說明這個節點覆蓋了地形的那些區域。比如一個子節點應該有一個Center(X,Y)變量,指定這個節點的中心點所對應的頂點索引,或編號。為了方便起見,可以把地形中心點編號為(0,0)然后沿著坐標軸遞增。此外還要有個變量指定這個節點到底覆蓋了地形的多少個頂點。如下圖所示。

                我們目前的四叉樹的數據結構如下:

                struct QuadTreeNode
                {
                    QuadTreeNode *Children[4];
                    int CenterX,CenterY;
                    int HalfRange;
                }

                有了四叉樹之后,如何利用它的優勢呢?首先我們考慮簡單的視見體裁剪(View Frustum Culling,以下簡稱VFC)。相信很多接觸過基本圖形優化的人都應該熟悉VFC,VFC的作用既是對那些明顯位于可見平截頭體之外的多邊形在把它們傳給顯卡之前剔除掉。這個過程由CPU來完成。雖然簡單,但它卻非常有效。VFC過程如下:

                1.為每個節點計算包圍球。包圍球可以簡單的以中心頂點為球心,最大坐標值點(節點所覆蓋的所有頂點的最大X、Y、Z值作為此點的坐標值)到球心的距離為半徑。

                2.根據當前的投影和變換矩陣計算此時可視平截頭體的六個平面方程。這一步可以參考Azure的Blog上的一篇文章,這篇文章給出了VFC的具體代碼。單擊這里

                3.從樹的根結點以深度優先的順序遍歷樹。每次訪問節點時,測試該節點包圍球與視見體的相交情況。在下面的情況下,包圍球與視見體相交:

                    1) 球心在六個平面所包圍的凸狀區域內部。
                    2) 球心在六個平面所包圍的凸狀區域外部,但球心到某個平面的距離小于半徑。

                4.如果相交測試顯示包圍球和視見體存在交集,繼續遞歸遍歷此節點的4個子節點,如果此節點已經是葉節點,則這個節點應被繪制。如果不存在交集,放棄這個節點,對于這個節點的所有子節點不再遞歸檢查。因為如果一個節點不可見,那么其子節點一定不可見。

                這樣,我們剔除了那些不在視見體內的地形區域,節約了一些資源。但這還不夠。在某些情況下,VFC可能還會指出整個地形都可見,在這種情況下,將這么多三角形都畫出顯然是不可取的。

                因此還要考慮地形的細節層次(LOD)。我們應該考慮到,地形不可能所有部分都一樣平坦或陡峭。對于平坦的部分,我們用過多的三角形去描述是沒有意義的。而對于起伏程度較大的區域,只有較多的三角形數量才不讓人感到尖銳的棱角。再者,無論地形起伏程度如何,那些距離視點很遠的區域,也沒有必要花費太多的資源去渲染,畢竟它們投影到屏幕上的面積很小,對其進行簡化也是必要的。

                既然我們要對起伏程度不同的區域采用不同的細節級別,我們首先必須找到一種描述地形起伏程度的量。與其說起伏程度,不如說是地形的某個頂點因為被簡化后而產生的誤差。要計算這個誤差,我們先要了解地形是如何被簡化的。

                考慮下圖所示的地形塊,它的渲染結果如下圖右圖所示。

               現在如果要對所需渲染的三角形進行簡化,我們可以考慮這個地形塊每條邊中間的頂點(下圖左側紅色點):

               如果將這些紅色的頂點剔除,我們可以得到上圖右邊所示的簡化后的網格。誤差就在這一步產生。由于紅色的頂點被剔除后,原本由紅色頂點所表示的地形高度現在變成了兩側黑色頂點插值后的高度。這個高度就是誤差。如下圖。

                因此,對于每個節點,我們先計算這個節點所有邊中點被刪除后所造成的誤差,分別記為ΔH1, ΔH2, ΔH3, ΔH4。如果這個節點包含子節點,遞歸計算子節點的誤差,并把四個子節點的誤差記為ΔHs1, ΔHs2, ΔHs3, ΔHs4。這個節點的誤差就是這八個誤差值中的最大值。由于這是一個遞歸的過程,因此應該把這個過程加到四叉樹的生成過程中,并向四叉樹的數據結構中加入一個誤差變量。如下。

                struct QuadTreeNode
                {
                    QuadTreeNode *Children;
                    int CenterX,CenterY;
                    int HalfRange;
                    float DeltaH;  //節點誤差值
                }

                下面來看一下地形的具體渲染過程。

                首先,我們位于四叉樹的根結點。我們此時考慮根結點的誤差,如果這個誤差小于一個閾值,直接使用根結點的中心點以及此節點的四個邊角點作為頂點渲染一個三角扇形,這個三角扇形就是渲染出來的地形。但是更經常的情況下,根結點的誤差值是很大的,因此算法認為要對根結點進行細分,以展現更多細節。于是對于根結點的每個子節點,重復這個步驟,即檢查它的誤差值是否大于閾值,如果大于,直接渲染這個節點,如果小于,遞歸細分節點。目前我們的算法偽代碼如下。

                procedure DrawTerrain(QuadTreeNode *node)
                {
                  if (node->DeltaH > k)
                  {
                       for (i=0;i<4;i++)
                       {
                            DrawTerrain(node->Children[i]);//遞歸劃分
                       }
                  }
                  else
                  {
                       GraphicsAPI->DrawPrimitive(node);//以節點的中心點和四個邊角點繪制三角扇形
                  }   
                }

                這個偽代碼在一個較高的層次上表述了算法的基本思想。然而我們還有許多問題要考慮。其一是目前我們僅僅考慮了地形的細節層次和地形表面起伏程度的關系,但還應該考慮地形塊距離視點遠近跟地形細節層次的關系。解決這個問題很簡單,我們只需在偽代碼的條件中加入距離這一因素即可。即把

                    if (node->DeltaH > k)
                    {
                        ...
                    }
                    else ...

                改為:

                    if (node->DeltaH / d > k)
                    {
                        ...
                    }
                    else ...

                其中d為節點中心點與視點之間的距離。而事實上,當細節程度與距離的平方成反比時,能夠減少更多的三角形,而且視覺效果更好,只要閾值k設置得當,根本感覺不出地形因為視點的移動而發生幾何形變。因此,我們最終的條件式為:

                node->DeltaH / d2 > k

                還有一個很重要的問題,就是這個算法所產生的地形會因為節點之間細節層次的不同而產生裂縫。下圖說明了裂縫的產生原因。

                有兩個方法可以解決這個問題,一個方法是刪除左側節點中產生裂縫的頂點,使兩條邊能夠重合。另一種方法是人為地在右側地形塊中插入一條邊,這條邊連接中心點和造成裂縫的頂點,從而消除裂縫。在渲染地形時,可以采取下面的辦法避免裂縫的產生:

                1.在預處理階段,為所有頂點創建一個標記數組,標記以該頂點為中心點的節點在某一幀是否被細分。如果被細分則標記為1,否則標記0。

                2.從根節點開始,以廣度優先的順序遍歷四叉樹,使用之前提出的條件式判斷節點是否需要分割。如果公式表明需要分割,并且與節點相鄰的四個節點的中心點都被標記為1,那么把這個節點及其四個子節點的標記設為1,并遞歸細分這個節點。否則,將這個節點的標記設為1,把這個節點的四個子節點的標記設為0,然后采用下面的方法繪制這個地形塊:

                    1)將節點的中心頂點和四個邊角點添加到即將繪制的三角扇形列表中。
                    2)依次檢查與四條邊相鄰的節點的標記數組,如果相應的標記為1,那么將該點添加到三角扇形的頂點列表中,否則跳過該點。
                    3)繪制三角扇形。

                我們最終的偽代碼如下。

            bool IsNodeInFrustum(QuadTreeNode *node)

            {

               return (node->BoudingSphere in frustum);

            }

            bool NeighbourIsValid(QuadTreeNode *node)

            {

               return (all four neighbours of node are identified as 1)

            }

            void RenderTerrain()

            {

               list<QuadTreeNode *>next,current,draw;

               int level =0;
               current.push_back(root);
               while (current.size()!=0)

               {

                  for each thisNode in current

                  {
                     if (!IsNodeInFrustum(thisNode))
                        continue;
                     if (level == MaxResolution)
                        draw.push_back(thisNode);
                     else

                     if (thisNode->DeltaH/(distance*distance) > k

                         && NeighbourIsValid(thisNode) )

                     {

                         SetFlag(thisNode,1);

                         for j= 1 to 4

                         {

                            next.push_back(thisNode->Children[j]);

                            SetFlag(thisNode->Children[j],1)

                         }

                     }

                     else

                     {

                        SetFlag(thisNode,1); 

                        for j= 1 to 4

                         {

                            draw.push_back(thisNode->Children[j]);

                            SetFlag(thisNode->Children[j],0);

                         }

                     } 

                  }

                  SwapList(current,next);
                  next.clear();

                  level++;

               }

               GraphicsAPI->DrawPrimitives(draw);  

            }

                另外,一個重要的優化是利用硬件的緩沖區或頂點數組(對于不支持頂點緩沖的硬件而言)。因為地形無論怎樣簡化,頂點數據總是固定不變的。我們在每一幀動態產生的僅僅是頂點索引,因此我們有必要實現將地形的所有頂點數據輸入到頂點緩沖中,然后在渲染時一次性將所有的索引傳給顯卡,以提高速度。實驗表明,使用頂點緩沖比直接使用glBegin/glEnd繪制圖形要快5倍以上。

                以上講述了如何做到實時地渲染大型地形。主要應用了LOD和VFC兩種手段來精簡三角形數量。然而VFC只能剔除不在視見體內的圖形,而對于在視見體內但被其他更近的物體遮擋的情況卻無能為力。如果要實現地形的自遮擋剔除,地平線算法是一個好的選擇。然而當你的場景不僅僅是包含地形時,地平線算法也只能處理地形的自遮擋情況。因為地平線算法只對2.5D的地圖(即在XZ平面上無重合投影的場景)有效。對于完全3D場景,地平線并不能很好的工作。所以當你在引擎中使用地形時,可以考慮將地形分塊后放入場景的管理樹中,如BSP或Octree等。然后根據引擎的性質使用入口(Portal)、PVS或者遮擋測試(Occlusion Culling)等方法進行遮擋剔除。值得強調的是,遮擋測試是一個非常靈活的實時的剔除算法,且無需任何預計算過程。但要想有效的實現它并不是一件容易的事。我曾將地形分塊后使用遮擋剔除來完成地形的自遮擋,但是渲染速度不但沒有提升,反而有輕微的下降。因此如果要使用遮擋剔除的話必須和引擎結合起來統一進行遮擋測試,才有可能提高效率。

                現在你應該了解了基本的地形實時渲染方法。要想讓地形的外觀更加真實,我們還需要更多的工作。我們需要為地形加上紋理貼圖和光照。首先考慮地形的光照。由于地形的多邊形網格是實時產生的,它會隨著視點的移動而變化,因此如果你直接使用OpenGL內置的頂點光照,你會得到極度不穩定的光照效果。你會看到地形表面會因為你的移動而不斷跳動。因此我們必須使用其他的光照方法來避免這個問題。我們想到了光照貼圖。光照貼圖是一個游戲中常用的光照技術。它是一個覆蓋了場景中所有多邊形的貼圖。通過給貼圖賦值,我們可以得到多邊形表面復雜的光照效果。使用好的算法計算出來的光照貼圖可以模擬極度逼真的光影效果。它給我們帶來的視覺享受遠遠地超過了OpenGL的內置光照。有關光照貼圖的計算可以參考我翻譯的一篇文章:輻射度算法(Radiosity)

               

               你可以簡單地為地形覆蓋上單一的紋理,這看起來些許增加了地形的真實性:

                在上圖中,我們創建了一個地形,并運用了一個重復的紋理。這個過程讓地形的無論哪一個區域看起來都是一樣的(例如都是草地)。這顯然不太真實,也過于乏味。或許你會創建了一幅超大的圖片,以拉伸覆蓋的方式映射到地形表面。這樣做的后果是內存開銷過于龐大,這樣做也很會受到硬件的限制。因此我們應該使用一種更好的紋理貼圖方式,紋理索引貼圖。

                紋理索引貼圖對三個可重復的紋理進行索引貼圖。所謂索引貼圖,就是對三個可重復紋理進行索引,以決定地形的哪些區域需要使用哪些紋理的混合來貼圖。因為對于任意的貼圖,都由一組包含3個顏色通道(即R、G、B)的像素組成。用于索引的貼圖的像素并不表示地形的某個區域的具體顏色,而是表示地形的某個區域用何種具體的紋理貼圖。因為具體的紋理細節存儲在這三個可重復的紋理中,因此索引貼圖的貼圖方式也為拉伸到地形表面,但它的分辨率可以大大降低。

                紋理索引貼圖的工作方式如下:對于地形投影到屏幕上的像素,查找該像素所映射到索引貼圖上的像素。然后根據這一像素R、G、B分量的不同,決定R、G、B分量所代表的具體紋理貼圖的混合因子。根據這個混合因子混合三個可重復貼圖后,將混合得到的最終顏色值輸出到屏幕上。

                例如,令索引貼圖的R分量代表沙灘的紋理,G分量代表草地,B分量代表巖石。如果索引貼圖上一個像素的值是(0,255,0),即綠色,則這個像素所對應的地形區域的具體紋理就為草地。如果該像素顏色值是(127,127,0),即黃色,則該像素所對應的地形區域的紋理為草地和沙灘的混合,看起來既有草,又有沙。又如下圖顯示了一個樣本索引貼圖,以及使用該貼圖索引紋理之后的渲染效果。

            索引貼圖(R=沙灘,G=草地,B=巖石)

            渲染效果

                原理很簡單,下面講解一下具體的實現過程。首先,我們準備4個紋理,其中1個紋理索引貼圖,它將被拉伸覆蓋整個地形,然后3張細節貼圖,并將它們綁定到相應的紋理通道上。然后使用Vertex Shader為每個頂點自動計算索引貼圖的紋理坐標,在Fragment Shader里,對索引貼圖進行紋理查找,使用查找得到的顏色值的RGB顏色信息混合3張細節貼圖,得到當前像素的顏色。最后還應該把這個顏色和光照貼圖中的值相乘,得到最終的結果。下面是相關的Shader代碼,使用GLSL編寫。

            Vertex Shader:

            uniform float TexInc;   //紋理縮放值,用于查找索引紋理
            void main()
            {
              gl_TexCoord[6] = gl_Vertex;
              gl_TexCoord[0] = gl_MultiTexCoord0;
              gl_TexCoord[2] = TexInc*vec4(gl_Vertex.xz,0.0,0.0);
              gl_Position = ftransform();
            }

            Fragment Shader:

            uniform sampler2D IndexMap;
            uniform sampler2D LightMap;
            uniform sampler2D texR,texG,texB,texA;
            void main()
            {
              vec4 idx,lm,r,g,b,color;
              idx = texture2D(IndexMap,gl_TexCoord[0].xy); //索引值
              lm = texture2D(LightMap,gl_TexCoord[0].xy);  //光照度
              r = texture2D(texR,gl_TexCoord[2].xy);   //R通道紋理
              g = texture2D(texG,gl_TexCoord[2].xy);   //G通道紋理
              b = texture2D(texB,gl_TexCoord[2].xy);   //B通道紋理
              color = lm*(idx.x*r + idx.y*g+idx.z*b);  //混合顏色
              gl_FragColor = color;
            }

                最后,如果你對本文有不解之處,歡迎和我共同討論。

            posted @ 2008-05-11 13:54 RedLight 閱讀(1344) | 評論 (1)編輯 收藏

            X文件的使用(完整)

                 摘要:   閱讀全文

            posted @ 2008-05-11 13:32 RedLight 閱讀(554) | 評論 (0)編輯 收藏

            黃綠醫生 (爆笑版)

            http://www.tudou.com/programs/view/Q_Voc96LkjQ/

            錄音文字說明:
            DJ:那甘正話亦都聽過左陳主任同大家介紹啦,那甘講到呢一度就熱線方面都比較踴躍啦,下邊我地抓緊時間馬上接聽下收音機旁邊聽眾朋友打來噶咨詢電話先。喂,你好!
            聽眾:嘿,你好,陳主任!
            陳主任:HI,你好!
            聽眾:嘿,你好!
            陳主任:點稱呼啊?
            聽眾:er,我姓羅噶。
            陳主任:er,E家系邊度打電話過來啊?
            聽眾:er,我系系肇慶打電話過來噶,陳主任。
            陳主任:E家有乜野問題幫到你啊?
            ­
            ­
            聽眾:er,無,甘呢,我近排呢就覺得個個臀部呢有D唔舒服,甘er唔知可唔可以去你地江門腹股醫院度治療下?
            ­
            陳主任:到來我地醫院就診噶患者朋友,通通臀部(其實系:全部)獲得免藥費治療,既是治愈徹底為止。
            ­
            聽眾:er,甘好!甘有咩野系可以免費噶呢?
            ­
            陳主任:免婦科沖洗費!
            ­
            聽眾:下?呢個唔巖我個窩,甘有無其他免費噶呢?
            ­
            陳主任:或者你直接來到我地防治中心,你就可以獲得臀面藥費治療,既是治愈徹底為止。
            ­
            ­
            聽眾:哦,聽陳主任你甘講又好似幾好。甘你地醫唔醫個個性病噶?
            ­
            陳主任:
            有好多患者朋友日頭就打電話到我地醫院來,距話陳主任,我已經患左呢個生殖泌尿系統疾病、性傳播疾病!
            已經到醫左三年、五年、十年八年都醫唔好啦!
            已經呢,醫到無曬信心啦,已經醫到你無錢噶啦,醫到傾家蕩產,醫到買屋買樓,甚至醫到老婆走佬!
            ­
            聽眾:下?有無甘夸張啊?陳主任?
            ­
            ­
            陳主任:
            今晚我陳主任系江門噶直播室入邊,同收音機旁噶聽眾朋友,我陳醫生對呢只疾病來講,可以講醫1個就好1個,醫十10個就好10個!
            聽眾:啊,陳主任你冷靜下先啦。Er,甘,其實唔系個個男人都有病噶嗎?
            陳主任:
            ­
            凡系10個男人,患有左前列腺炎噶,無論你帶菌性噶亦得,無菌性噶前列腺炎亦得,10個男人呢就有9個出現腎精虧損、腎功能衰退。為乜野甘樣講?
            凡系未結婚噶男人,都有一個性噶幻想、性噶幻覺。
            未結婚噶男人就出現手淫過度、或者中意睇D黃色錄像啊。
            由于個只大腦性噶幻想,手淫過度,結左婚噶男人就出現性生活頻繁、性生活過度,所話呢距就搞到呢,個條****個海綿體,長期處于充血狀態。就搞到周身攰拉拉,全身無曬精神。有D就出現尿頻、尿急啊、腰攰啊、頭暈眼花、四肢無力、手腳麻痹、腰酸背漲、耳聾、耳鳴、耳響、面黃晦暗、骨瘦如柴、胸悶胸匿、氣觸氣喘。。。。。。
            聽眾:嘿,陳主任,你使唔使透透氣啊?
            陳主任:有得E家隨著社會噶開放、社會噶發達、自己家庭個富裕,有D就無比自己個太太知,又出外面搞搞震噶!
            ­
            有的D就包大奶二奶三奶噶,所話呢就搞得呢周身攰拉拉,有的無單止搞跨自己噶身體,仲傳染上一種性病!有D感染上支原體、衣原體、淋球菌、梅毒、性病噶性淋巴肉芽腫腹股高肉芽腫、有得搞得傳染得尖銳濕疣、生殖器皰疹!
            聽眾:下?甘得人驚噶?甘呢D病有無D明顯噶特征呢?
            陳主任:痕癢得不了!到最后個只病癥,靜系自己噶身上,甚至仲加重添!所以話呢?點解??治療個只生殖泌尿系統疾病,性傳播疾病點解收得甘噶效果?個D患者剛剛來到我地醫院呢度治療,個個都得到甘理想,個個都得到甘滿意。
            聽眾:er,甘就好嘞。甘er陳主任你地一般系有乜好噶方法治療呢?
            陳主任:我地首先要以,如果帶菌性噶前列腺炎,首先要以清濕滅毒、滅濕解毒、消炎殺菌。
            ­
            如果系個只腎精虧損型噶,就要以生精、養精、藏精、補精、顧精、X精噶方法。
            聽眾:下?er?咩野方法話?陳主任?你。。。我聽唔清楚啊。
            陳主任:甘,生精、養精、藏精、補精、固精、X精噶藥物就要落D鹿腎、海狗腎、虎鞭、狗鞭、牛鞭,要落D冬蟲夏草、XXXX、西絨花、杞子,個幾味藥呢距就能夠起到益精壯陽、益精生水、益腎健脾,XXXXX、西絨花能夠活血化淤,杞子能夠清肝明目,甘樣就幫患者醫。
            ­
            你就系10年到20年噶前列腺炎,無得到OK噶,你吃左個幾味藥落去,你好快就得到徹底解決問題。
            如果邊位患者,結左婚,三年、五年、十年八年無有生育能力噶,你吃上巖先我講噶幾味藥落去,
            我要你生一胎就得一胎,要生兩胎就得兩胎。
            聽眾:嘿,E家唔準生兩胎噶。
            陳主任:除非你無想生。如果邊位患者不幸感染上個只支原體、衣原體、淋病、淋球菌感染、梅毒、XXX、性病噶性淋巴或者有尖銳濕疣、生殖器皰疹,你又醫三年、五年、十年八年都醫唔好噶,你同我落D蛇毒素,蛇毒素距就能夠以毒攻毒、清濕滅毒、滅濕解毒,距就把你身上所感染到噶一切病毒,通通殺死排除體外。
            ­
            如果邊位患者對患有個只婦科炎癥,即是念珠菌、陰道炎、滴蟲性陰道炎、即是白帶多,白帶好似豆腐渣甘樣有腥臭味,有痕癢得不了噶,你同我落D蛇毒素、蜘蛛素、蜈蚣素,亦都系同樣以毒攻毒、清濕滅毒、滅濕解毒。
            如果邊位患者對患有個只宮頸炎、或者宮頸一度霉爛、二度霉爛、三度霉爛,甚至到左四度宮頸癌無得醫噶,你同我落D大量噶XX俗話所講有XX無XX,有XX無XX,有哪吒無XX,如果邊位患者對患有個只呢陽痿、早泄、****短小,陽痿癥狀噶,從來都無起得頭噶采老婆面前、采女朋友面前都系低頭噶你同我呢,落D XXX,XXX距能夠起到溫腎助陽,今晚吃落去,無使半夜距就醒過五更雞無甘醒噶窩!
            如果邊位患者對患有個只呢陽痿、早泄、****短小,****短小就要落D震哥,震哥距就能夠起到增粗增大增長,個只早泄噶,或者晚頭有夢精遺精噶,得兩公婆行埋無夠兩分鐘就搞掂呢單野噶,你同我呢,落D金英子、五培子、五味子、XX,個幾味藥距就起到生精、固精、養精。
            好啦,你就把我巖先以上所講到噶一切藥物,通通執返回來,以十劑噶藥物,濃縮成一劑。
            聽眾:下?甘樣er,分分鐘飲到流鼻血噶窩?會唔會即是唔OK噶?
            陳主任:你如果呢,真正得無到OK噶,得無到解決問題噶,今晚你聽到我陳主任噶節目之后,
            ­
            我希望你鼓起勇氣,同收音機旁噶聽眾朋友
            可以理直氣壯甘講一句系完全有得醫噶!
            聽眾:甘都得啊?er甘er如果真系要去你地個度點去法呢?
            陳主任:你到江門汽車總站之后,你就系車站里面往回走200米紅燈右轉彎,系車站里面呢乘坐100蚊公交車,到腹股溝呢個站落車,落車直接撥打電話來123-5678,無論你系貧窮富貴,有錢無錢,到來我地醫院就診噶患者朋友,通通臀部(其實系:全部)獲得一包穿心蓮都系一蚊雞銀錢一包噶,不過只收返距藥物基本制作費、專家會診費、尖銳濕疣免除費、全電腦榮光高新科技噶檢測儀檢測費。自從今日起,到13月38號止,我地節假日都無上班!
            DJ:好嘞,亦都就聽過左幾位聽眾朋友咨詢之后,就睇返我地今期噶節目時間方面亦都系差唔多啦,好嘞,陳主任要到聽晚噶同樣時間再見囖窩,恩,拜拜!
            陳主任:恩,拜拜!

            posted @ 2008-05-01 01:47 RedLight 閱讀(635) | 評論 (0)編輯 收藏

            僅列出標題
            共9頁: 1 2 3 4 5 6 7 8 9 
            <2008年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            導航

            統計

            公告


            Name: Galen
            QQ: 88104725

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            相冊

            My Friend

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久久人妻无码| 亚洲国产精品一区二区三区久久| 久久亚洲日韩精品一区二区三区| 久久国产精品成人片免费| 亚洲欧美日韩精品久久| 亚洲精品无码专区久久同性男| 精产国品久久一二三产区区别 | 三级片免费观看久久| 四虎影视久久久免费观看| 久久精品人成免费| 国产日韩久久免费影院| 亚洲精品无码久久久久sm| 国产成人99久久亚洲综合精品| 伊人久久大香线蕉亚洲| 99久久无码一区人妻| 色综合久久久久久久久五月| 久久99精品久久久久久野外| 97久久精品国产精品青草| 久久经典免费视频| 欧美精品丝袜久久久中文字幕| 国产精品久久久久影视不卡| 一本久道久久综合狠狠爱| 欧美亚洲日本久久精品| 93精91精品国产综合久久香蕉| 久久精品国产亚洲77777| 国产成人精品久久| 婷婷久久综合九色综合九七| 久久精品无码专区免费| 97精品国产97久久久久久免费| 2020久久精品国产免费| 久久久久无码精品国产不卡| 亚洲熟妇无码另类久久久| 伊人情人综合成人久久网小说| 色婷婷久久久SWAG精品| 亚洲精品视频久久久| 亚洲精品WWW久久久久久| 亚洲一级Av无码毛片久久精品| 亚洲精品WWW久久久久久| 怡红院日本一道日本久久 | 2021国内久久精品| 亚洲精品国产第一综合99久久|