在VS階段,獲取每一個頂點對應的紋素中的位移向量,(注意,直到3.0版本的vs才支持紋理數據的獲取,以前的版本只有ps才能獲取紋理數據),施加到局部座標系下的頂點上,而後進行世界視點投影變換便可。app
之因此補充這一點,是由於某些版本的顯卡vs支持的紋理格式有限,而這些種類的紋理格式並不支持紋理過濾,所以咱們須要在vs中手動進行紋理過濾。紋理過濾的基本思路以下:性能
假設點P(x,z)對應的紋理座標是(117.76,34.13),可是紋素的座標只能是整數類型的,那麼P點對應的應該是哪個紋素呢?(117,34)?仍是(118,35)?實際上,咱們須要對以下的四個點:(117,34) (117,35) (118,34) (118,35)進行採樣,並對四個樣本值進行加權平均,最終獲得的值即是過濾後的紋理值。具體算法實現以下:網站
來源: http://www.nvidia.cn/object/tessellation_cn.html
隨着最近人們對DirectX 11的議論紛紛,你可能已經據說了有關DirectX 11最大新特性Tessellation(曲面細分)的大量介紹。做爲一個概念,Tessellation(曲面細分)很是直截了當,就是處理一個多邊形分紅諸多小碎片。可是爲何這樣的處理方式可以備受矚目呢?它是如何幫助提高遊戲畫質的呢?本文中,咱們將分析Tessellation(曲面細分)之因此可以爲PC 3D圖形帶來深入變革的緣由,並闡釋一下NVIDIA®(英偉達™)GeForce®(精視™)GTX 400系列GPU如何提供突破性的Tessellation(曲面細分)性能。
從本質上來說,Tessellation(曲面細分)是一種將多邊形分解成更加細小的碎片以提高几何逼真度的方法。例如,若是處理一個正方形並將其沿對角線切開,那麼實際上就是將這一正方形「曲面細分」成爲兩個三角形。就其自己而言,Tessellation(曲面細分)並不能提高半點逼真度。例如,在遊戲中,一個正方形被渲染成爲兩個三角形仍是兩千個三角形都是可有可無的。只有在使用新三角形來描述新信息時,Tessellation(曲面細分)才能提高逼真度。
![Triangle Mapping Triangle Mapping](http://static.javashuo.com/static/loading.gif) |
![Displacement Mapping Displacement Mapping](http://static.javashuo.com/static/loading.gif) |
當一個置換貼圖(左)應用到平面上時,所生成的表面(右)就會表現出置換貼圖中所編碼的高度信息。 |
運用新三角形最簡單、最流行的方式就是有「Displacement Mapping(貼圖置換)」之稱的技術。置換的貼圖就是一個存儲高度信息的紋理。當應用到某一表面上時,該貼圖讓這一表面的頂點可以根據高度信息調高或調低。 例如,使用一塊大理石板,圖形藝術家可以經過「置換」頂點的方法打造雕刻效果。另外一種流行技術是將置換的貼圖應用到地形上,以雕琢出彈坑、峽谷以及山峯。
正如Tessellation(曲面細分)同樣,Displacement Mapping(貼圖置換)已經存在很長一段時間了。可是直到最近,它才真正流行起來。究其緣由,是由於想要讓Displacement Mapping(貼圖置換)有效,表面必須由大量頂點構成才行。以大理石雕刻爲例,若是大理石塊由八個頂點構成,那麼在它們之間便沒有能夠生成龍形浮雕的相對置換量了。只有在基礎網格中具有足夠多的頂點用以描繪新形狀時纔可以生成細緻的浮雕。從本質上來說,Displacement Mapping(貼圖置換)須要Tessellation(曲面細分),反之亦然。
隨着DirectX 11的問世,Tessellation(曲面細分)與Displacement Mapping(貼圖置換)終於實現了珠聯璧合,廣大開發商已經加入到這一陣營當中。像《Alien vs. Predator》以及《地鐵2033》這樣的流行遊戲均採用了Tessellation(曲面細分)來生成外觀平滑的模型,而開發商Valve公司與id Software已經完成了一些前景看好的工做,將這些技術應用到其現有的遊戲人物身上。
![Coarse Model Coarse Model](http://static.javashuo.com/static/loading.gif) |
當一個粗糙的模型(左)通過Tessellation(曲面細分)處理後,就會生成平滑的模型(中間)。當應用了貼圖置換以後(右),遊戲人物便接近電影般的逼真度了。 © Kenneth Scott、id Software版權全部。2008 |
由於DirectX 11 Tessellation(曲面細分)流水線是可編程的,所以能夠用它來解決大量圖形問題。讓咱們來看一看四個實例。
完美凹凸貼圖
從本質上來說,Displacement Mapping(貼圖置換)可被用做現有凹凸貼圖技術的臨時替代技術。例如法線貼圖等當前的技術經過更佳的像素渲染,可以創造出凹凸表面的假象。全部這些技術都只在特定狀況下有效,而且在其起效時並非全都那麼逼真。下面以凹凸貼圖中較爲先進的視差遮蔽貼圖爲例進行說明。雖然它可以生成重疊的幾何假象,可是它只能在平面上以及物體內部起做用(見上圖)。真正的Displacement Mapping(貼圖置換)不存在這些問題,可以從全部視角生成精確的結果。
更加平滑的人物
![Smoothing Character Smoothing Character](http://static.javashuo.com/static/loading.gif) |
無需藝術家手工輸入,PN-Triangles可實現遊戲人物的自動平滑。幾何與光照逼真度均可以獲得提高。 |
細化算法是Tessellation(曲面細分)的另外一個天然搭檔。細化算法可處理粗糙模型,藉助於Tessellation(曲面細分),該算法可建立外觀更加平滑的模型。PN-Triangles(也稱做N-patches)就是一個流行的實例。PN-Triangles算法可以將低分辨率模型轉化爲彎曲表面,該表面而後能夠被從新繪製成由「高精曲面細分」的三角形所組成的網格。在當今遊戲中,咱們認爲理所固然的大量視覺假象均可以藉助此類算法來消除。這些視覺假象包括人物關節處呈現塊狀圖案、汽車輪子呈多邊形外觀以及面部特徵粗糙。例如,《Stalker: Call of Pripyat》中就使用了PN-Triangles來生成外表更平滑、更天然的人物。
無縫的精細度
在具備大型、開放式環境的遊戲當中,用戶可能會注意到,遠處的物體常常會時而出現、時而消失無。這是因爲遊戲引擎正在不一樣精細度(LOD)之間進行切換,以限制幾何工做負荷。由於須要爲同一模型或環境保存多個版本的數據,因此直到那個時候,都尚未一種簡單的方法可以連續改變精細度。動態Tessellation(曲面細分)經過即時改變精細度,解決了這一問題。例如,當遠處的建築物首次映入眼簾時,也許僅使用10個三角形來渲染它。隨着用戶視野的拉近,該建築物的顯著特徵開始浮現,更多三角形則被用來描繪窗子和屋頂等細節。當你最終到達門口時,單單舊式銅質門把手一項就動用了一千個三角形來進行渲染;Displacement Mapping(貼圖置換)細緻地雕刻出了每一道凹槽。因爲消除了動態Tessellation(曲面細分)對象的時隱時現,所以遊戲環境如今能夠擴展至幾乎無限的幾何精細度。
收放自如的藝術品
對開發商來講,Tessellation(曲面細分)大幅提高了其內容創做流水線的效率。在描述其使用Tessellation(曲面細分)的動機時,Valve公司的Jason Mitchell表示:「咱們對可以編輯遊戲內容這一點很感興趣,由於這樣就讓咱們可以實現縮放了。也就是說,咱們想要只製做一次模型,而後便可以將其提高至電影畫質…反之,咱們想要可以天然地下降遊戲內容的畫質,以知足在特定系統上實現實時渲染的須要。」這種僅建立一次模型即可在各類平臺上使用的能力意味着縮短了開發時間。對PC遊戲玩家來講,這意味着在其GPU上可以實現最高的圖像畫質。
GeForce®(精視™)GTX 400 GPU(圖形處理器)如何處理Tessellation(曲面細分)
傳統的GPU(圖形處理器)設計採用單個幾何引擎來執行Tessellation(曲面細分)任務。這種方法是相似早期的GPU設計,此類設計均使用利用單個像素流水線來執行像素着色。在認識到像素流水線是如何從一個單元發展爲多個並行單元以及這一進展是如何在3D逼真度方面大放異彩以後,咱們便從一開始就設計了本身的並行Tessellation(曲面細分)架構。
GeForce®(精視™)GTX 400 GPU(圖形處理器)擁有最多15個Tessellation(曲面細分)單元,每個單元都具有針對頂點拾取、Tessellation(曲面細分)以及座標變換的專用硬件。它們利用4個並行光柵引擎來進行運算,這些引擎可將新近曲面細分的三角形轉換成精細像素流以便用於着色。這樣一來,Tessellation(曲面細分)的性能便實現了巨大突破,持久性能達每秒16億三角形以上。與最快的同類產品相比,GeForce®(精視™)GTX 480的速度最高可達7.8倍。這一數據由獨立網站Bjorn3D所測得。
結語
通過多年的反覆試驗,Tessellation(曲面細分)終於在PC上得到了成功。《地鐵2033》等優秀遊戲已經展示了Tessellation(曲面細分)的潛力。最終,Tessellation(曲面細分)將成爲同像素着色同樣關鍵、同樣必不可少的技術。因爲意識到了Tessellation(曲面細分)的重要性,NVIDIA®(英偉達™)公司從一開始便打造並行Tessellation(曲面細分)架構,推進這一進程。成果就是GeForce®(精視™)GTX 400系列GPU(圖形處理器)—幾何逼真度與Tessellation(曲面細分)性能的真正突破。
![LabThumbDisplacement.png](http://static.javashuo.com/static/loading.gif) 來源於 Rhino Labs Jessesn整理,如需轉載,請註明出處. __________________________________________________________________________________________ Displacement mapping(置換貼圖) 和 (bump mapping)位圖貼圖幾何學上很是接近,容許你根據紋理貼圖的灰度的數據定義Meshs(不管是mesh對象仍是render-meshes)的大小. 置換插件須要RDK插件的支持才能夠正常的使用,若是你安裝了RDK的話,僅僅只須要下載置換插件就能夠,不然是不能正確導入這個插件的.
Displacement mapping(置換貼圖)插件
這個版本的需求RDK BETA6的版本支持(
下載 RDK BETA6)
____________________________________________________________________________________________
如何使用 1 首先運行一個並無過置換設置的對象,全部的置換屬性都是在物體的屬性的Displacement欄對話框中 顯示,以下圖
![Displacement_01.png](http://static.javashuo.com/static/loading.gif) 2 每一個對象都須要獨立的開啓置換功能,意味着你能夠快速的開啓和關閉置換功能而不會丟失你的設置,一 旦你開啓了兌現的置換貼圖而且指定了一個紋理貼圖(下面的演示是一個標準的RDK的程序紋理貼圖),就 能夠在視窗中看到置換的效果,以下圖
![Displacement_02.png](http://static.javashuo.com/static/loading.gif) 3 你能夠輸入一個更高的Amount值來增長置換的效果,這數值代表一個白色象素點點將被偏移單的單位數 量,黑色的象素是不會有偏移的,灰度的象數就介於黑白象素之間按內插值的大小來以爲偏移量.
![Displacement_03.png](http://static.javashuo.com/static/loading.gif) 4 置換是和每一個對象的紋理貼圖屬性息息相關的,只要我給一個polysurface啓動置換功能,那麼這個 polysurface的每一個面都會有各自的紋理貼圖的範圍,置換的結果是全部的面塊的偏移,當我對一個球面 (內定是每個面)忽略紋理貼圖,相鄰的面之間並無UV的跳躍並且這個效果將會變得很順滑,儘管經過 球面的seam(逢合線)時候仍然會有一些UV的跳躍.
|
想要更多的調試效果,須要調用Advanced controls項,Advanced controls項提供一個設置置換運算主設置
的界面,例如 offsets, subdivision 與 iteration.
例如,Advanced controls可讓用戶對黑白象素設置不一樣的便移數值,以下圖
![Displacement_Ad_01.png](http://static.javashuo.com/static/loading.gif)
![Displacement_Ad_02.png](http://static.javashuo.com/static/loading.gif)
Ignore creases 選項可讓物體在置換前就完整的焊接好mesh,意味着polysurface的邊線的UV變更會呈
現的比較小,對於莫認的設置當有須要時能夠在置換前給一個更高的數值,不點這個項就能夠關閉細分值,
意味着置換的mseh講會和原始的mesh數值相同.
![Displacement_Ad_03.png](http://static.javashuo.com/static/loading.gif)
Mesh的每一個三角面是用來看是否超過能夠偏移的極限(較低的值獲得是較少的細分)若是超過的話則會被三
個更小的三角面代替,Max steps用來設置重複處理的次數,注意設置較低的Contrast值或是較高的Max
steps值都會形成長的運算時間.
![Displacement_Ad_05.png](http://static.javashuo.com/static/loading.gif)
![Displacement_Ad_06.png](http://static.javashuo.com/static/loading.gif)
瞭解更詳細的資料請參考原RhinoLabs文件
【Shaper3d 】論壇原創教程,如需轉載,請註明做者於來源