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

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

游戲引擎基礎(二)(3D環境的光照和紋理)

2部份: 3D環境的光照和紋理


世界的燈光
  在變換過程中, 通常是在稱為觀察空間的坐標空間中, 我們遇到了最重要的運算之一: 光照計算。 它是一種這樣的事情, 當它工作時,你不關注它,但當它不工作時, 你就非常關注它了。有很多不同的光照方法,從簡單的計算多邊形對于燈光的朝向,并根據燈光到多邊形的方向和距離加上燈光顏色的百分比值,一直到產生邊緣平滑的燈光貼圖疊加基本紋理。而且一些 API 實際上提供預先建造的光照方法。舉例來說,OpenGL 提供了每多邊形,每頂點,和每像素的光照計算。

  在頂點光照中,你要決定一個頂點被多少個多邊形共享,并計算出共享該頂點的所有多邊形法向量的均值(稱為法向量),并將該法向量賦頂點。一個給定多邊形的每個頂點會有不同的法向量,所以你需要漸變或插值多邊形頂點的光照顏色以便得到平滑的光照效果。 你沒有必要用這種光照方式查看每個單獨的多邊形。 這種方式的優點是時常可以使用硬件轉換與光照(T & L)來幫助快速完成。 不足之處是它不能產生陰影。 舉例來說,即使燈光是在模型的右側,左手臂應該在被身體投影的陰影中,而實際上模型的雙臂卻以同樣的方式被照明了。

  這些簡單的方法使用著色來達到它們的目標。 當用平面光照繪制一個多邊形時, 你讓渲染(繪制)引擎把整個多邊形都著上一種指定的顏色。這叫做平面著色光照。 (該方法中,多邊形均對應一個光強度,表面上所有點都用相同的強度值顯示,渲染繪制時得到一種平面效果,多邊形的邊緣不能精確的顯示出來)

  對于頂點著色 ( Gouraud 著色) ,你讓渲染引擎給每個頂點賦予特定的顏色。 在繪制多邊形上各點投影所對應的像素時,根據它們與各頂點的距離,對這些頂點的顏色進行插值計算。 (實際上Quake III 模型使用的就是這種方法, 效果好的令人驚奇)

  還有就是 Phong 著色。如同 Gouraud 著色,通過紋理工作,但不對每個頂點顏色進行插值決定像素顏色值, 它對每個頂點的法向量進行插值,會為每個頂點投影的像素做相同的工作。對于 Gouraud 著色,你需要知道哪些光投射在每個頂點上。對于 Phong 著色,你對每個像素也要知道這么多。

  一點也不令人驚訝, Phong 著色可以得到更加平滑的效果,因為每個像素都需要進行光照計算,其繪制非常耗費時間。平面光照處理方法很快速, 但比較粗糙。Phong 著色比 Gouraud 著色計算更昂貴,但效果最好,可以達到鏡面高光效果("高亮") 這些都需要你在游戲開發中折衷權衡。


不同的燈光
  接著是生成照明映射,你用第二個紋理映射(照明映射)與已有的紋理混合來產生照明效果。這樣工作得很好, 但這本質上是在渲染之前預先生成的一種罐裝效果。如果你使用動態照明 (即,燈光移動, 或者沒有程序的干預而打開和關閉),你得必須在每一幀重新生成照明映射,按照動態燈光的運動方式修改這些照明映射。燈光映射能夠快速的渲染,但對存儲這些燈光紋理所需的內存消耗非常昂貴。你可以使用一些壓縮技巧使它們占用較少的的內存空間,或減少其尺寸大小, 甚至使它們是單色的 (這樣做就不會有彩色燈光了),等等。 如果你確實在場景中有多個動態燈光, 重新生成照明映射將以昂貴的CPU周期而告終。

  許多游戲通常使用某種混合照明方式。 Quake III為例,場景使用照明映射, 動畫模型使用頂點照明。 預先處理的燈光不會對動畫模型產生正確的效果 -- 整個多邊形模型得到燈光的全部光照值 -- 而動態照明將被用來產生正確的效果。 使用混合照明方式是多數的人們沒有注意到的一個折衷,它通常讓效果看起來"正確" 這就是游戲的全部做一切必要的工作讓效果看起來"正確",但不必真的是正確的。

  當然,所有這些在新的Doom引擎里面都不復存在了,但要看到所有的效果,至少需要 1GHZ CPU GeForce 2 顯卡。是進步了,但一切都是有代價的。

  一旦場景經過轉換和照明, 我們就進行裁剪運算。 不進入血淋淋的細節而,剪斷運算決定哪些三角形完全在場景 (被稱為觀察平截頭體) 之內或部份地在場景之內。完全在場景之內的三角形被稱為細節接受,它們被處理。對于只是部分在場景之內的三角形, 位于平截頭體外面的部分將被裁剪掉,余下位于平截頭體內部的多邊形部分將需要重新閉合,以便其完全位于可見場景之內。 (更多的細節請參考我們的 3D 流水線指導一文)

  場景經過裁剪以后,流水線中的下一個階段就是三角形生成階段(也叫做掃描 線轉換),場景被映射到2D 屏幕坐標。到這里,就是渲染(繪制)運算了。


紋理與MIP映射
  紋理在使3D場景看起來真實方面異常重要,它們是你應用到場景區域或對象的一些分解成多邊形的小圖片。多重紋理耗費大量的內存,有不同的技術來幫助管理它們的尺寸大小。紋理壓縮是在保持圖片信息的情況下,讓紋理數據更小的一種方法。紋理壓縮占用較少的游戲CD空間,更重要的是,占用較少內存和3D 顯卡存儲空間。另外,在你第一次要求顯卡顯示紋理的時候,壓縮的(較小的) 版本經過 AGP 接口從 PC 主存送到3D 顯卡, 會更快一些。紋理壓縮是件好事情。 在下面我們將會更多的討論紋理壓縮。


MIP
映射(多紋理映射)
  游戲引擎用來減少紋理內存和帶寬需求的另外一個技術就是 MIP 映射。 MIP 映射技術通過預先處理紋理,產生它的多個拷貝紋理,每個相繼的拷貝是上一個拷貝的一半大小。為什么要這樣做?要回答這個問題,你需要了解 3D 顯卡是如何顯示紋理的。最壞情況,你選擇一個紋理,貼到一個多邊形上,然后輸出到屏幕。我們說這是一對一的關系,最初紋理映射圖的一個紋素 (紋理元素) 對應到紋理映射對象多邊形的一個像素。如果你顯示的多邊形被縮小一半,紋理的紋素就每間隔一個被顯示。這樣通常沒有什么問題 -- 但在某些情況下會導致一些視覺上的怪異現象。讓我們看看磚塊墻壁。 假設最初的紋理是一面磚墻,有許多磚塊,磚塊之間的泥漿寬度只有一個像素。如果你把多邊形縮小一半, 紋素只是每間隔一個被應用,這時候,所有的泥漿會突然消失,因為它們被縮掉了。你只會看到一些奇怪的圖像。

  使用 MIP 映射,你可以在顯示卡應用紋理之前,自己縮放圖像,因為可以預先處理紋理,你做得更好一些,讓泥漿不被縮掉。當 3D 顯卡用紋理繪制多邊形時,它檢測到縮放因子,說,"你知道,我要使用小一些的紋理,而不是縮小最大的紋理,這樣看起來會更好一些。" 在這里, MIP 映射為了一切,一切也為了 MIP 映射。


多重紋理與凹凸映射
  單一紋理映射給整個3D 真實感圖形帶來很大的不同, 但使用多重紋理甚至可以達到一些更加令人難忘的效果。過去這一直需要多遍渲染(繪制),嚴重影響了像素填充率。 但許多具有多流水線的3D 加速卡,如ATI's Radeon nVidia's GeForce 2及更高級的顯卡,多重紋理可以在一遍渲染(繪制)過程中完成。 產生多重紋理效果時, 你先用一個紋理繪制多邊形,然后再用另外一個紋理透明地繪制在多邊形上面。這讓你可以使紋理看上去在移動,或脈動, 甚至產生陰影效果 (我們在照明一節中描述過)。繪制第一個紋理映射,然后在上面繪制帶透明的全黑紋理,引起一種是所有的織法黑色的但是有一個透明分層堆積過它的頂端 這就是 -- 即時陰影。 該技術被稱為照明映射 ( 有時也稱為 暗映射),直至新的Doom ,一直是Id引擎里關卡照明的傳統方法。

  凹凸貼圖是最近涌現出來的一種古老技術。幾年以前 Matrox 第一個在流行的 3D 游戲中發起使用各種不同形式的凹凸貼圖。就是生成紋理來表現燈光在表面的投射,表現表面的凹凸或表面的裂縫。 凹凸貼圖并不隨著燈光一起移動 -- 它被設計用來表現一個表面上的細小瑕疵,而不是大的凹凸。 比如說,在飛行模擬器中,你可以使用凹凸貼圖來產生像是隨機的地表細節,而不是重復地使用相同的紋理,看上去一點趣味也沒有。

  凹凸貼圖產生相當明顯的表面細節,盡管是很高明的戲法,但嚴格意義上講,凹凸貼圖并不隨著你的觀察角度而變化。比較新的 ATI nVidia 顯卡片能執行每像素運算,這種缺省觀察角度的不足就真的不再是有力而快速的法則了。 無論是哪一種方法, 到目前為止,沒有游戲開發者太多的使用; 更多的游戲能夠且應該使用凹凸貼圖。


高速緩存抖動 = 糟糕的事物
  紋理高速緩存的管理游戲引擎的速度至關重要。 和任何高速緩存一樣,緩存命中很好,而不命中將很糟糕。如果遇到紋理在圖形顯示卡內存被頻繁地換入換出的情況,這就是紋理高速緩存抖動。發生這種情況時,通常API將會廢棄每個紋理,結果是所有的紋理在下一幀將被重新加載,這非常耗時和浪費。對游戲玩家來說,當API重新加載紋理高速緩存時,會導致幀速率遲鈍。

  在紋理高速緩存管理中,有各種不同的技術將紋理高速緩存抖動減到最少這是確保任何 3D 游戲引擎速度的一個決定性因素。 紋理管理是件好事情這意味著只要求顯卡使用紋理一次,而不是重復使用。這聽起來有點自相矛盾,但效果是它意謂著對顯卡說,"看, 所有這些多邊形全部使用這一個紋理,我們能夠僅僅加載這個紋理一次而不是許多次嗎?" 這阻止API ( 或圖形驅動軟件) 上傳多次向顯卡加載紋理。象OpenGL這樣的API實際上通常處理紋理高速緩存管理,意謂著,根據一些規則,比如紋理存取的頻率,API決定哪些紋理儲存在顯卡上,哪些紋理存儲在主存。 真正的問題來了:a) 你時常無法知道API正在使用的準確規則。 b)你時常要求在一幀中繪制更多的紋理,以致超出了顯卡內存空間所能容納的紋理。

  另外一種紋理高速緩存管理技術是我們早先討論的紋理壓縮。很象聲音波形文件被壓縮成 MP3 文件,盡管無法達到那樣的壓縮比率,但紋理可以被壓縮。 從聲音波形文件到MP3的壓縮可以達到 11:1的壓縮比率,而絕大多數硬件支持的紋理壓縮運算法則只有 4:1 的壓縮比率,盡管如此,這樣能產生很大的差別。 除此之外,在渲染(繪制)過程中,只有在需要時,硬件才動態地對紋理進行解壓縮。這一點非常棒,我們僅僅擦除即將可能用到的表面。

  如上所述,另外一種技術確保渲染器要求顯卡對每個紋理只繪制一次。確定你想要渲染(繪制)的使用相同紋理的所有多邊形同時送到顯卡,而不是一個模型在這里,另一個模型在那里,然后又回到最初的紋理論。僅僅繪制一次,你也就通過AGP接口傳送一次。Quake III 在其陰影系統就是這么做的。處理多邊形時,把它們加入到一個內部的陰影列表,一旦所有的多邊形處理完畢,渲染器遍歷紋理列表,就將紋理及所有使用這些紋理的多邊形同時傳送出去。

  上述過程在使用顯卡的硬件 T & L(如果支持的話)時,并不怎么有效。你面臨的結局是,滿屏幕都是使用相同紋理的大量的多邊形小群組,所有多邊形都使用不同的變換矩陣。這意謂著更多的時間花在建立顯卡的硬件 T & L 引擎 ,更多的時間被浪費了。 無論如何,因為他們有助于對整個模型使用統一的紋理,所以它對實際屏幕上的模型可以有效地工作。但是因為許多多邊形傾向使用相同的墻壁紋理,所以對于世界場景的渲染,它常常就是地獄。通常它沒有這么嚴重,因為大體而言,世界的紋理不會有那么大,這樣一來API的紋理緩存系統將會替你處理這些,并把紋理保留在顯卡以備再次使用。

  在游戲機上,通常沒有紋理高速緩存系統(除非你寫一個)。在 PS2 上面,你最好是遠離"一次紋理" 的方法。在 Xbox 上面, 這是不重要的,因為它本身沒有圖形內存(它是 UMA 體系結構),且所有的紋理無論如何始終保留在主存之中。

  事實上,在今天的現代PC FPS 游戲中,試圖通過AGP接口傳送大量紋理是第二個最通常的瓶頸。最大的瓶頸是實際幾何處理,它要使東西出現在它應該出現的地方。在如今的3D FPS 游戲中,最耗費時間的工作,顯然是那些計算模型中每個頂點正確的世界位置的數學運算。如果你不把場景的紋理保持在預算之內,僅居其次的就是通過AGP接口傳送大量的紋理了。然而,你確實有能力影響這些。 通過降低頂層的 MIP 級別(還記得系統在哪里不斷地為你細分紋理嗎?) 你就能夠把系統正在嘗試送到顯卡的紋理大小減少一半。你的視覺質量會有所下降-- 尤其是在引人注目的電影片斷中--但是你的幀速率上升了。這種方式對網絡游戲尤其有幫助。實際上,Soldier of Fortune IIJedi Knight II: Outcast這兩款游戲在設計時針對的顯卡還不是市場上的大眾主流顯卡。為了以最大大小觀看他們的紋理,你的3D 顯卡至少需要有128MB的內存。這兩種產品在思想上都是給未來設計的。

  上面就是第 2 部份。在下面章節中,我們將介紹許多主題,包括內存管理,霧效果,深度測試, 抗鋸齒,頂點著色,API等。

posted on 2007-12-04 13:16 夢在天涯 閱讀(3137) 評論(0)  編輯 收藏 引用 所屬分類: Game/OpenGL

公告

EMail:itech001#126.com

導航

統計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1812155
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲黄一区二区三区| 亚洲私人影吧| 小黄鸭精品密入口导航| 亚洲视频在线免费观看| 亚洲一区二区在线播放| 久久狠狠久久综合桃花| 久久精品电影| 1769国产精品| 亚洲制服丝袜在线| 久久精品亚洲精品国产欧美kt∨| 久久嫩草精品久久久精品| 亚洲激情影院| 国产精品播放| 欧美视频一区二区三区在线观看| 国产精品户外野外| 欧美一区1区三区3区公司| 欧美另类一区| 好吊色欧美一区二区三区四区| 99热在线精品观看| 亚洲黄色尤物视频| 久久国产精品72免费观看| 日韩视频在线一区二区| 久久婷婷国产综合精品青草| 国产精品不卡在线| 亚洲精品视频免费| 亚洲男女自偷自拍| 欧美日韩一区二区在线观看| 亚洲激情偷拍| 亚洲在线视频网站| 91久久线看在观草草青青| 久久精品国产99国产精品| 农村妇女精品| 在线观看欧美精品| 久久精视频免费在线久久完整在线看| 亚洲国产成人av在线 | 国产综合一区二区| 亚洲男女自偷自拍| 一区二区三区欧美日韩| 欧美精品在线观看| 蜜桃久久av一区| 亚洲欧美综合网| 亚洲国产精品成人| 免费一区二区三区| 久久精品在线播放| 一本久久a久久精品亚洲| 好吊成人免视频| 亚洲欧美日韩国产中文| 国产农村妇女精品一区二区| 久久免费偷拍视频| 久久国产精品99精品国产| 亚洲欧美国产77777| 欧美精品久久99| 一区二区欧美精品| 一二三区精品| 欧美成人综合| 久久婷婷一区| 久久阴道视频| 免费日韩精品中文字幕视频在线| 欧美在线一级va免费观看| 欧美色另类天堂2015| 亚洲精品黄网在线观看| 欧美福利在线观看| 亚洲欧美日韩在线高清直播| 欧美日本一区二区三区| 亚洲三级电影全部在线观看高清| 亚洲精品精选| 亚洲日本欧美天堂| 日韩天堂在线视频| 欧美精品少妇一区二区三区| 亚洲精品1234| 亚洲色图在线视频| 欧美午夜精品电影| 亚洲一区国产一区| 久久久7777| 尤物九九久久国产精品的特点| 久久亚洲精选| 亚洲精品黄网在线观看| 亚洲网站在线| 久久久综合香蕉尹人综合网| 国产日韩欧美三区| 亚洲精品久久嫩草网站秘色| 一区二区三区四区在线| 国产精品地址| 久久av老司机精品网站导航| 一区二区三区日韩精品| 国产精品xnxxcom| 新狼窝色av性久久久久久| 久久免费精品视频| 亚洲人www| 亚洲第一毛片| 欧美日韩一区综合| 亚洲欧美精品在线观看| 一本色道久久88综合亚洲精品ⅰ| 亚洲精品国精品久久99热一| 欧美日韩视频在线观看一区二区三区 | 另类亚洲自拍| 亚洲精品国精品久久99热| 欧美日韩国产三级| 免费成人在线观看视频| 一区二区三区你懂的| 国产亚洲欧美激情| 亚洲综合三区| 欧美国产综合视频| 国产欧美一区二区三区在线看蜜臀 | 国产精品久久午夜| 亚洲第一中文字幕| 亚洲综合导航| 亚洲欧洲日本mm| 国产日本欧美一区二区三区在线| 老鸭窝91久久精品色噜噜导演| 一本色道久久综合亚洲精品按摩 | 欧美一区在线看| 亚洲另类自拍| 老**午夜毛片一区二区三区| 国产女主播一区二区三区| 久热国产精品视频| 先锋亚洲精品| 亚洲天天影视| 亚洲人人精品| 欧美va日韩va| 亚洲国产成人不卡| 午夜精品一区二区三区在线视| 亚洲国产精品成人| 美女国产一区| 久久婷婷激情| 亚洲在线观看视频| 亚洲欧美成人网| 国产精品99久久久久久久vr | 国产精品亚洲不卡a| 亚洲精品国久久99热| 伊人狠狠色j香婷婷综合| 国产色综合网| 国产亚洲观看| 国产视频久久| 国产无遮挡一区二区三区毛片日本| 欧美日韩国产另类不卡| 欧美电影专区| 亚洲一区二区在线免费观看视频 | 午夜免费电影一区在线观看| 艳妇臀荡乳欲伦亚洲一区| 亚洲一区二区三区视频播放| 91久久精品国产| 亚洲国产精品尤物yw在线观看| 精品电影在线观看| 欧美成人一品| 欧美国产丝袜视频| 欧美连裤袜在线视频| 欧美日韩亚洲视频| 欧美性天天影院| 国产精品一级| 久久久亚洲欧洲日产国码αv| 亚洲国语精品自产拍在线观看| 欧美国产日韩一区二区三区| 亚洲成色最大综合在线| 日韩系列在线| 在线综合亚洲| 欧美一区二区三区免费视| 亚洲黄色av| 99视频超级精品| 欧美亚洲自偷自偷| 亚洲日本va午夜在线影院| 美女主播视频一区| 亚洲综合不卡| 老巨人导航500精品| 麻豆精品视频在线| 欧美日韩国语| 国产日韩精品一区二区三区| 欧美成人精品高清在线播放| 欧美成人网在线| 国产精品久久久久高潮| 国产九区一区在线| 亚洲国产你懂的| 久久一区二区精品| 亚洲日本欧美日韩高观看| 亚洲免费视频一区二区| 久久综合伊人| 国产精品社区| 亚洲精品一二区| 久久精品国产免费观看| 欧美激情影院| 亚洲欧美日韩一区二区| 欧美激情第三页| 韩日成人在线| 在线视频免费在线观看一区二区| 久久精品国产一区二区三区| 亚洲国内自拍| 久久久水蜜桃| 国产伦精品一区二区三区高清| 亚洲精品国精品久久99热| 久久久久国产精品麻豆ai换脸| 亚洲激情av| 美女脱光内衣内裤视频久久影院| 国产精品久线观看视频| 亚洲精品国产精品国自产在线| 久久久国产成人精品| 一区二区精品国产| 欧美精品www在线观看| 久久久亚洲精品一区二区三区 | 亚洲日本视频| 欧美aa在线视频|