3D圖形學基礎
3D圖形學基礎
Lingtonke(柯靈傑)
1 前言
現在AR、VR技術正值風口,催生了一大批相關的APP,使得3D圖像學不再是遊戲開發人員的專屬知識,而是更多的普及開來。
本文主要針對一些對3D有興趣的同學,普及圖形學知識,不涉及深入的技術探討和樣例介紹。對於不是從事相關開發的同學也能了解相關的知識
部分材料來源於網路和書籍。
2 什麼是圖形學
圖形學也稱計算機圖形學(ComputerGraphics),簡稱CG。它是研究圖形的輸入、模型(圖形對象)的構造和表示、圖形資料庫管理、圖形數據通信、圖形的操作、圖形數據的分析,以及如何以圖形信息為媒介實現人機交互作用的方法、技術和應用的一門學科。它包括圖形系統硬體(圖形輸入-輸出設備、圖形工作站)圖形軟體、演算法和應用等幾個方面。
圖形學的研究內容非常廣泛,如圖形硬體、圖形標準、圖形交互技術、光柵圖形生成演算法、曲線曲面造型、實體造型、真實感圖形計算與顯示演算法,以及科學計算可視化、計算機動畫、自然景物模擬、虛擬現實等。
平時我們開發遊戲或者VR應用用到的,屬於其中的一個分支:實時渲染(RealtimeRendering)
渲染(render,或稱「繪製」)在電腦繪圖中,是指:用軟體從模型生成圖像的過程。模型是用語言或者數據結構進行嚴格定義的三維物體或虛擬場景的描述,它包括幾何、視點、紋理、照明和陰影等信息。圖像是數字圖像或者點陣圖圖像。渲染用於描述:計算視頻編輯軟體中的效果,以生成最終視頻的輸出過程。
渲染是三維計算機圖形學中的最重要的研究課題之一,並且在實踐領域它與其它技術密切相關。在圖形流水線中,渲染是最後一項重要步驟,通過它得到模型與動畫最終顯示效果。自從二十世紀七十年代以來,隨著計算機圖形的不斷複雜化,渲染也越來越成為一項重要的技術。
渲染的應用領域有:計算機與視頻遊戲、模擬、電影或者電視特效以及可視化設計,每一種應用都是特性與技術的綜合考慮。作為產品來看,現在已經有各種不同的渲染工具產品,有些集成到更大的建模或者動畫包中,有些是獨立產品,有些是開放源代碼的產品。從內部來看,渲染工具都是根據各種學科理論,經過仔細設計的程序,其中有:光學、視覺感知、數學以及軟體開發。
實時渲染經常用於三維視頻遊戲,通常依靠圖形處理器(GPU)完成這個過程。
3 效果展示
4 渲染管線
4.1 什麼是渲染管線
渲染管線也稱為渲染流水線或像素流水線或像素管線,是顯示晶元內部處理圖形信號相互獨立的的並行處理單元。在某種程度上可以把渲染管線比喻為工廠裡面常見的各種生產流水線,工廠里的生產流水線是為了提高產品的生產能力和效率,而渲染管線則是提高顯卡的工作能力和效率。
渲染管線就是顯示核心中負責給圖形配上顏色的一組專門通道。它是顯示核心中單獨設計的一組電路,擁有單獨的晶體管。渲染管線越多,那麼所繪出的圖形它的填充效率就越高,自然我們看到的畫面也就越流暢越精美。這就是為什麼渲染管線越多越好的原因。如果少了,那麼自然就會使顯卡的性能下降。當然渲染管線越多,顯示核心就會越大,因為它所使用的晶體管數目增加了。
4.2 渲染管線的流程
4.2.1 總流程圖
4.2.2 頂點著色器
為了實現逼真的場景,僅渲染對象的形狀和位置是不足夠的,它們的外觀亦需要模擬。這些描述包括第每對象材質,以及光源照射對象產生的特效。模擬材質和光源的方法有很多種,包括從最簡單的顏色到精細的物理特性描述。
決定光和材質特效的操作稱為著色。它包括了計算不同點的著色方程。典型的某些這類的計算運行在幾何階段的模型頂點數組上,另外一些則運行在逐象素的光珊化階段。各類的材質數據,例如點所在位置,法向量,顏色或其它著色方程需用到的數值信息,可儲存在每個頂點中。頂點著色的結果(這可能是顏色,向量,紋理坐標或其它種類的著色數據)會被送進光珊化階段去插值。
著色階段通常被認為是發生在世界空間。在實踐中,有時則將相應的實體(例如攝像機和光源)變換到其它空間(例如模型或視覺空間)並在那運行計算更為方便。因為如果所有包含在著色計算中的對象均被變換到同一空間,則光源、攝像機和模型的相對關係是保留的。
4.2.3 圖元裝配
經過變換的頂點流按照順序被送到下一個被稱為圖元裝配的階段。首先,在圖元裝配階段根據伴隨頂點序列的幾何圖元分類信息把頂點裝配成幾何圖元。這將產生一序列的三角形、線段和點。這些圖元需要經過裁剪到可視平截體(三維空間中一個可見的區域)和任何有效地應用程序指定的裁剪平面。
4.2.4 背面剔除
我們知道,渲染的基本單位是一個個的三角形面片。無論多麼複雜的3D 模型都是由一個個基本的三角型的面片組成的。既然是一個面片,那必然就有兩個面,如果其中有一個面被稱為正面,那相應的另一面就被稱為背面。
同一時刻我們在看見某一面的同時,另外一面則必然是看不的。在這裡我們可以想像一個封閉的不透明的幾何體,我們肉眼只能看到它的外面,而它的內部我們是看不見的。如果沒有開啟表面剔除,則可能有很多從一般常識上看來是看不見的那一面(比如幾何體內部),它也會去渲染。這顯然會大大降低渲染效率和增加不必要的系統開銷。
渲染中通過頂點的排列順序來決定正反面
4.2.5 光柵化
得到已變換及投影后的頂點及與之相關聯的著色數據,光珊階段的目標是計算並設置像素的顏色。這個過程叫光珊化或掃描變換,即從二維頂點所處的屏幕空間(所有頂點都包含Z值即深度值,及各種與相關的著色信息)到屏幕上的像素的轉換。
4.2.6 測試和混合
4.2.6.1 裁剪測試
將超出屏幕的部分裁剪掉,無需後續運算
4.2.6.2 採樣
採樣(sampling)又稱取樣,指把時間域或空間域的連續量轉化成離散量的過程。
抗鋸齒(英語:anti-aliasing,簡稱AA),也譯為邊緣柔化、消除混疊、抗圖像摺疊有損等。它是一種消除顯示器輸出的畫面中圖物邊緣出現凹凸鋸齒的技術,那些凹凸的鋸齒通常因為高解析度的信號以低解析度表示或無法準確運算出3D圖形坐標定位時所導致的圖形混疊(aliasing)而產生的,反鋸齒技術能有效地解決這些問題。它通常被用在在數字信號處理、數字攝影、電腦繪圖與數碼音效及電子遊戲等方面,柔化被混疊的數字信號。
4.2.6.2.1 超級採樣抗鋸齒(SSAA)
超級採樣抗鋸齒(Super-Sampling Anti-aliasing,簡稱SSAA)此是早期抗鋸齒方法,比較消耗資源,但簡單直接,先把圖像映射到緩存並把它放大,再用超級採樣把放大後的圖像像素進行採樣,一般選取2個或4個鄰近像素,把這些採樣混合起來後,生成的最終像素,令每個像素擁有鄰近像素的特徵,像素與像素之間的過渡色彩,就變得近似,令圖形的邊緣色彩過渡趨於平滑。再把最終像素還原回原來大小的圖像,並保存到幀緩存也就是顯存中,替代原圖像存儲起來,最後輸出到顯示器,顯示出一幀畫面。這樣就等於把一幅模糊的大圖,通過細膩化後再縮小成清晰的小圖。如果每幀都進行抗鋸齒處理,遊戲或視頻中的所有畫面都帶有抗鋸齒效果。而將圖像映射到緩存並把它放大時,放大的倍數被用於分別抗鋸齒的效果,如:圖1,AA後面的x2、x4、x8就是原圖放大的倍數。 超級採樣抗鋸齒中使用的採樣法一般有兩種:
1.順序柵格超級採樣(Ordered Grid Super-Sampling,簡稱OGSS),採樣時選取2個鄰近像素。
2.旋轉柵格超級採樣(Rotated Grid Super-Sampling,簡稱RGSS),採樣時選取4個鄰近像素。
4.2.6.2.2 多重採樣抗鋸齒(MSAA)
多重採樣抗鋸齒(MultiSampling Anti-Aliasing,簡稱MSAA)是一種特殊的超級採樣抗鋸齒(SSAA)。MSAA首先來自於OpenGL。具體是MSAA只對Z緩存(Z-Buffer)和模板緩存(Stencil Buffer)中的數據進行超級採樣抗鋸齒的處理。可以簡單理解為只對多邊形的邊緣進行抗鋸齒處理。這樣的話,相比SSAA對畫面中所有數據進行處理,MSAA對資源的消耗需求大大減弱,不過在畫質上可能稍有不如SSAA。
4.2.6.2.3 覆蓋採樣抗鋸齒(CSAA)
覆蓋採樣抗鋸齒(CoverageSampling Anti-Aliasing,簡稱CSAA)是nVidia在G80及其衍生產品首次推向實用化的AA技術,也是目前nVidia GeForce 8/9/G200系列獨享的AA技術。CSAA就是在MSAA基礎上更進一步的節省顯存使用量及帶寬,簡單說CSAA就是將邊緣多邊形里需要取樣的子像素坐標覆蓋掉,把原像素坐標強制安置在硬體和驅動程序預先算好的坐標中。這就好比取樣標準統一的MSAA,能夠最高效率的執行邊緣取樣,效能提升非常的顯著。比方說16xCSAA取樣性能下降幅度僅比4xMSAA略高一點,處理效果卻幾乎和8xMSAA一樣。8xCSAA有著4xMSAA的處理效果,性能消耗卻和2xMSAA相同。[1]
4.2.6.2.4 可編程過濾抗鋸齒(CFAA)
可編程過濾抗鋸齒(Custom Filter Anti-Aliasing)技術起源於AMD-ATI的R600家庭。簡單地說CFAA就是擴大取樣面積的MSAA,比方說之前的MSAA是嚴格選取物體邊緣像素進行縮放的,而CFAA則可以通過驅動和諧靈活地選擇對影響鋸齒效果較大的像素進行縮放,以較少的性能犧牲換取平滑效果。顯卡資源佔用也比較小。
4.2.6.2.5 快速近似抗鋸齒(FXAA)
快速近似抗鋸齒(Fast Approximate Anti-Aliasing) 它是傳統MSAA(多重採樣抗鋸齒)效果的一種高性能近似值。它是一種單程像素著色器,和MLAA一樣運行於目標遊戲渲染管線的後期處理階段 。
4.2.6.2.6 時間性抗鋸齒(TXAA)
讓電影畫質的遊戲體驗達到逼真水平。
TXAA 抗鋸齒: 比 MSAA和FXAA 以及 CSAA 的畫質更高,製作CG電影的電影製片廠會在抗鋸齒方面花費大量的計算資源,從而可確保觀眾不會因不逼真的鋸齒狀線條而分心。如果想要讓遊戲接近這種級別的保真度,那麼開發商需要全新的抗鋸齒技術,不但要減少鋸齒狀的線條,而且要減少鋸齒狀閃爍情形,同時還不降低性能。為了便於開發商實現這種保真度的提升,英偉達設計了畫質更高的抗鋸齒模式,名為TXAA.該模式專為直接集成到遊戲引擎中而設計。與CG電影中所採用的技術類似,TXAA集MSAA的強大功能與複雜的解析濾鏡於一身,可呈現出更加平滑的圖像效果,遠遠超越了所有同類技術。此外,TXAA還能夠對幀之間的整個場景進行抖動採樣,以減少閃爍情形,閃爍情形在技術上又稱作時間性鋸齒。目前,TXAA有兩種模式:TXAA 2X和TXAA 4X。TXAA 2X可提供堪比8X MSAA的視覺保真度,然而所需性能卻與2X MSAA相類似;TXAA 4X的圖像保真度勝過8XMSAA,所需性能僅僅與4X MSAA相當。[2]
4.2.6.2.7 多幀採樣抗鋸齒(MFAA)
NVIDIA(英偉達)根據MSAA改進出的一種抗鋸齒技術。目前只有使用 Maxwell 架構GPU的顯卡才可以使用。在 Maxwell 上,英偉達推出了用於光柵化的可編程採樣位置,它們被存儲在隨機存取存儲器 (RAM) 中。如此一來便為更靈活、更創新的全新抗鋸齒技術創造了機會,這類抗鋸齒技術能夠獨特地解決現代遊戲引擎所帶來的難題,例如高畫質抗鋸齒對性能的更高要求。只要在NVIDIA控制面板里為程序開啟MFAA並在遊戲中選擇MSAA就可以開啟。畫面表現明顯強於同級別的MSAA,這種全新抗鋸齒技術在提升邊緣畫質的同時能夠將性能代價降至最低。通過在時間和空間兩方面交替使用抗鋸齒採樣格式,4xMFAA 的性能代價僅相當於 2xMSAA,但是抗鋸齒效果卻與 4xMSAA相當。
4.2.6.3 模板測試
模板測試是所有測試中比較複雜的一種
在模板緩衝區中為每個像素保存了一個「模板值」,當像素需要進行模板測試時,將設定的模板參考值與該像素的「模板值」進行比較,符合條件的通過測試,不符合條件的則被丟棄,不進行繪製。
條件的設置與Alpha測試中的條件設置相似。但注意Alpha測試中是用浮點數來進行比較,而模板測試則是用整數來進行比較。比較也有八種情況:始終通過、始終不通過、大於則通過、小於則通過、大於等於則通過、小於等於則通過、等於則通過、不等於則通過。
4.2.6.4 深度測試
4.2.6.5 什麼是深度?
深度其實就是該象素點在3d世界中距離攝象機的距離(繪製坐標),深度緩存中存儲著每個象素點(繪製在屏幕上的)的深度值!
深度值(Z值)越大,則離攝像機越遠。
深度值是存貯在深度緩存裡面的,我們用深度緩存的位數來衡量深度緩存的精度。深度緩存位數越高,則精確度越高,目前的顯卡一般都可支持16位的Z Buffer,一些高級的顯卡已經可以支持32位的Z Buffer,但一般用24位Z Buffer就已經足夠了。
4.2.6.6 為什麼需要深度?
在不使用深度測試的時候,如果我們先繪製一個距離較近的物體,再繪製距離較遠的物體,則距離遠的物體因為後繪製,會把距離近的物體覆蓋掉,這樣的效果並不是我們所希望的。而有了深度緩衝以後,繪製物體的順序就不那麼重要了,都能按照遠近(Z值)正常顯示,這很關鍵。
實際上,只要存在深度緩衝區,無論是否啟用深度測試,在像素被繪製時都會嘗試將深度數據寫入到緩衝區內。這些深度數據除了用於常規的測試外,還可以有一些有趣的用途,比如繪製陰影等等。
4.2.7 混合
「混合」是指兩種顏色的疊加方式。在新圖片將要渲染畫到屏幕上的時候,將用在新圖片中的紅、綠、藍和透明度信息,與屏幕上已經存在的圖片顏色信息相融合。
說的具體一點,就是把某一像素位置上原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現特殊的效果。
把源顏色和目標顏色各自取出,並乘以一個係數(源顏色乘以的係數稱為「源因子」,目標顏色乘以的係數稱為「目標因子」),然後相加,這樣就得到了新的顏色。
4.2.8 抖動
4.2.8.1 什麼是抖動
對於可用顏色較少的系統,可以以犧牲解析度為代價,通過顏色值的抖動來增加可用顏色數量。抖動操作是和硬體相關的,允許程序員所做的操作就只有打開或關閉抖動操作。實際上,若機器的解析度已經相當高,激活抖動操作根本就沒有任何意義。默認情況下,抖動是激活的。
4.2.8.2 如何抖動
圖案化使用圖案來表示象素的灰度,那麼我們來做一道計算題。假設有一幅240×180×8bit的灰度圖,當用解析度為300dpi×300dpi的激光印表機將其列印到12.8×9.6英寸的紙上時,每個象素的圖案有多大?
這道題很簡單,這張紙最多可以打(300×12.8) ×(300×9.6)=3840×2880個點,所以每個象素可以用(3840/240)×(2880/180)=16×16個點大小的圖案來表示,即一個象素256個點。如果這16×16的方塊中一個黑點也沒有,就可以表示灰度256;有一個黑點,就表示灰度255;依次類推,當都是黑點時,表示灰度0。這樣,16×16的方塊可以表示257級灰度,比要求的8bit共256級灰度還多了一個。所以上面的那幅圖的灰度級別完全能夠列印出來。
這裡有一個圖案構成的問題,即黑點打在哪裡?比如說,只有一個黑點時,我們可以打在正中央,也可以打16×16的左上角。圖案可以是規則的,也可以是不規則的。一般情況下,有規則的圖案比隨即圖案能夠避免點的叢集,但有時會導致圖象中有明顯的線條。
如下圖所示,2×2的圖案可以表示5級灰度,
當圖象中有一片灰度為的1的區域時,如下所示,有明顯的水平和垂直線條。
如果想存儲256級灰度的圖案,就需要256×16×16的二值點陣,佔用的空間還是相當可觀的。有一個更好的辦法是:只存儲一個整數矩陣,稱為標準圖案,其中的每個值從0到255。圖象的實際灰度和陣列中的每個值比較,當該值大於等於灰度時,對應點打一黑點。下面舉一個25級灰度的例子加以說明。
上圖,左邊為標準圖案,右邊為灰度為15的圖案,共有10個黑點,15個白點。其實道理很簡單,灰度為0時全是黑點,灰度每增加1,減少一個黑點。要注意的是,5×5的圖案可以表示26種灰度,當灰度是25才是全白點,而不是灰度為24時。
下面介紹一種設計標準圖案的演算法,是由Limb在1969年提出的。
先以一個2×2的矩陣開始:設
通過遞歸關係有:
其中Mn和Un均為2n×2n的方陣,Un的所有元素都是1。根據這個演算法,可以得到
為16級灰度的標準圖案。
M3(8×8陣)比較特殊,稱為Bayer抖動表。M4是一個16×16的矩陣。
根據上面的演算法,如果利用M3一個象素要用8×8的圖案表示,則一幅N×N的圖將變成8N×8N大小。如果利用M4,就更不得了,變成16N×16N了。能不能在保持原圖大小的情況下利用圖案化技術呢?一種很自然的想法是:如果用M2陣,則將原圖中每8×8個點中取一點,即重新採樣,然後再應用圖案化技術,就能夠保持原圖大
小。實際上,這種方法並不可行。首先,你不知道這8×8個點中找哪一點比較合適,另外,8×8的間隔實在太大了,生成的圖象和原圖肯定相差很大,就象下圖最右邊的那幅圖一樣。
我們可以採用這樣的做法:假設原圖是256級灰度,利用Bayer抖動表,做如下處理
if (g[y][x]>>2) > bayer[y&7][x&7] then 打一白點 else 打一黑點
其中,x,y代表原圖的象素坐標,g[y][x]代表該點灰度。首先將灰度右移兩位,變成64級,然後將x,y做模8運算,找到Bayer表中的對應點,兩者做比較,根據上面給出的判據做處理。
我們可以看到,模8運算使得原圖分成了一個個8×8的小塊,每個小塊和8×8的Bayer表相對應。小塊中的每個點都參與了比較,這樣就避免了上面提到的選點和塊劃分過大的問題。
5 坐標變換
5.1 自身坐標系
自身坐標系又叫做建模空間,這是我們定義物體的三角形列的坐標系。自身坐標系簡化了建模的過程。在物體自己的坐標系中建模比在世界坐標系中直接建模更容易。例如,在自身坐標系中建模不像在世界坐標系中要考慮本物體相對於其他物體的位置、大小、方向關係。
5.2 世界坐標系
一旦我們構造了各種模型,它們都在自己的自身坐標系中,但是我們需要把它們都放到同一個世界坐標系中。物體從自身坐標繫到世界坐標系中的換叫做世界變換。世界變換通常是用平移、旋轉、縮放操作來設置模型在世界坐標系中的位置、大小、方向。世界變換就是通過各物體在世界坐標系中的位置、大小和方向等相互之間的關係來建立所有物體。
5.3 視圖坐標系
世界坐標系中的幾何圖與照相機是相對於世界坐標系而定義的,如圖2.10所示。然而在世界坐標系中當照相機是任意放置和定向時,投影和其它一些操作會變得困難或低效。為了使事情變得更簡單,我們將照相機平移變換到世界坐標系的源點並把它的方向旋轉至朝向Z軸的正方向,當然,世界坐標系中的所有物體都將隨著照相機的變換而做相同的變換。這個變換就叫做視圖坐標系變換(view space transformation)。
5.4 投影
視圖坐標系的主要任務就是將3D場景轉化為2D圖像表示。這種從n維轉換成n-1維的過程就叫做投影。投影的方法有很多種,但是我們只對一種特殊的投影感興趣,那就是透視投影。因為透視投影可以使離照相機越遠的物體投影到屏幕上後就越小,這可以使我們把3D場景更真實的轉化為2D圖像。
投影變換的實質就是定義可視體,並將可視體內的幾何圖形投影到投影窗口上去。
6 色彩和紋理
一個紋理實際上就是一個點陣圖。從這個意義上來講,當紋理一詞被用於計算機圖形學時,它就有了一個明確的定義。從語義學角度來講,紋理一詞既是指一個物體上顏色的模式,又是指物體表面是粗糙的還是光滑的。
6.1 紋理坐標
紋理實際上是一個二維數組,它的元素是一些顏色值。單個的顏色值被稱為紋理元素(texture elements)或紋理像素(texel)。每一個紋理像素在紋理中都有一個唯一的地址。這個地址可以被認為是一個列(column)和行(row)的值,它們分別由U和V來表示。
紋理坐標位於紋理空間中。也就是說,它們和紋理中的(0,0)位置相對應。當我們將一個紋理應用於一個圖元時,它的紋理像素地址必須要映射到對象坐標系中。然後再被平移到屏幕坐標系或像素位置上。
6.2 紋理過濾
渲染一個圖元時,會將三維圖元映射到二維屏幕上。如果圖元有紋理,就必須用紋理來產生圖元的二維渲染圖象上每個像素的顏色。對於圖元在二維屏幕上圖象的每個像素來說,都必須從紋理中獲得一個顏色值。我們把這一過程稱為紋理過濾(texture filtering)
進行紋理過濾時,正在使用的紋理通常也正在被進行放大或縮小。換句話說,這個紋理將被映射到一個比它大或小的圖元的圖象上。紋理的放大會導致許多像素被映射到同一個紋理像素上。那麼結果看起來就會使矮矮胖胖的。紋理的縮小會導致一個像素被映射到許多紋理像素上。其結果將會變得模糊或發生變化。要解決這些問題,我們可以將一些紋理像素顏色融合到一個像素顏色上。
每種類型的紋理過濾都有各自的優缺點。例如,線性過濾會產生鋸齒狀的邊緣和矮胖的效果。但是,它對系統的消耗卻是最小的。另一方面,mipmap過濾的效果通常是最好的,特別是和各項異性過濾混合使用時。但是它卻需要很大的內存消耗。
6.2.1 雙線性過濾
線性過濾方法是雙線性過濾(bilinear filtering)。和最近點採樣一樣,雙線性過濾首先要計算一個紋理像素的地址,這個地址通常不是整數地址。然後,找到一個地址最接近的整數地址紋理像素。另外,渲染模塊還要計算與最近採樣的點相鄰的四個紋理像素的加權平均(weighted average)。
6.2.2 各項異性過濾
各向異性是對一個三維物體紋理像素的可見的變形,這個物體的表面朝向屏幕平面,並與之有一定的角度。各向異性圖元的像素在映射到紋理像素時,它的形狀會發生變形。
各向異性紋理過濾可以和線性過濾或mipmap過濾聯合使用。
6.2.3 Mipmap
一個mipmap就是一系列的紋理,每一幅紋理都與前一幅是相同的圖樣,但是解析度都要比前一幅有所降低。mipmap中的每一幅或者每一級圖象的高和寬都比前一級小二分之一。Mipmap並不一定必須是正方形。
高解析度的mipmap圖象用於接近觀察者的物體。當物體逐漸遠離觀察者時,使用低解析度的圖象。Mipmap可以提高場景渲染的質量,但是它的內存消耗卻很大。
6.3 紋理環繞
一般來說,分配的U、V紋理坐標值都在0.0到1.0範圍內(包括它們)。但是,如果我們分配了超出這個範圍的紋理坐標,可能會得到一些特別的紋理效果。
通過設置紋理定址模式,我們就可以在紋理坐標超出範圍時進行控制。
6.3.1 重複
圖象在表面上重複出現。忽略紋理坐標的整數部分,並將紋理圖的拷貝粘貼在物體表面上,這樣才能做到無縫連接。
6.3.2 截取
將大於1.0的數值設置為1.0,將小於0.0的數值設置為0.0,即將超出[0.0,1.0]範圍的數值截取到[0.0,1.0]範圍內,
這樣會導致紋理邊緣的重複。
6.3.3 鏡像重複
圖象在物體表面上不斷重複,但是每次重複的時候對圖象進行鏡像或者反轉。這樣在紋理邊緣處比較連貫。
6.3.4 邊界截取
在[0.0,1.0]範圍外的參數值用單獨定義的邊界顏色或紋理邊緣進行繪製。適合於繪製物體表面的貼花紙。
6.3.5 邊緣截取
總是忽略邊界。處於紋理邊緣或者靠近紋理邊緣的紋理單元都用作紋理計算,但是不包括邊界上的紋理單元。
6.4 立方體紋理
立方體紋理是一種特殊的紋理技術,它用6幅二維紋理圖像構成一個以原點為中心的紋理立方體。對於每個片段,紋理坐標(s, t, r)被當作方向向量看待,每個紋素(texel)都表示從原點所看到的紋理立方體上的圖像。
基本上說cubemap它包含6個2D紋理,這每個2D紋理是一個立方體(cube)的一個面,也就是說它是一個有貼圖的立方體。你可能會奇怪這樣的立方體有什麼用?為什麼費事地把6個獨立紋理結合為一個單獨的紋理,只使用6個各自獨立的不行嗎?這是因為cubemap有自己特有的屬性,可以使用方向向量對它們索引和採樣。想像一下,我們有一個1×1×1的單位立方體,有個以原點為起點的方向向量在它的中心。
6.5 點精靈
6.5.1 什麼是點精靈
openGL的圖形由頂點構成,以後利用頂點進行紋理的映射。點精靈就是,一個頂點被當作一個精靈來處理。特別之處就是,一個頂點也可進行紋理貼出。例如,原來是個頂點構成的一個矩形,現在一個頂點就可以完成了。瞬間我們就可以想想,粒子效果,那些雲霧水流火花什麼的用了點精靈,就可以瞬間減少3個頂點的計算,glDrawArrays使用GL_POINT就可以了,完全也不需要什麼頂點索引了。這是非常誘人的效率。
6.5.2 點精靈的局限
一個頂點縮放都必須是矩形。並且大小的最大最小值是有範圍的。既然是一個紋理映射到一個頂點上,那麼紋理映射就和原來完全不同,有些複雜。可能會抵消掉一些性能的優勢。
6.6 紋理壓縮
貼圖是在 3D 場景中,增加真實性的一個重要的工具。就像一般的影像一樣,貼圖的大小愈大,它的圖像就愈精細。事實上,貼圖往往需要比一般的影像更大。因為,在 3D 場景中,觀察者可能會很靠近貼圖,使得貼圖需要放大很多倍,而造成模糊的現象。所以,一般來說,如果可能的話,貼圖愈大就愈好。
不過,貼圖是非常佔用內存空間的。
常用的圖像文件格式有BMP,TGA,JPG,GIF,PNG等;
不過象JPG這種常見圖像壓縮格式對於多數應用的內存佔用和顯示匯流排帶寬佔用並沒有直接的好處,因為還得解壓縮成原始像素再傳給顯卡,而且還有載入時的解碼計算負擔。這是因為顯卡的紋理解碼硬體不理解JPG格式。所以,在沒有顯卡硬體支持的情況下,用壓縮格式保存紋理沒什麼意義,特別是對於手持移動設備來說,解碼象JPG這種複雜格式是很浪費電的。
考慮到現代遊戲對紋理圖片的嚴重依賴,及相應的對視頻匯流排的巨大壓力,硬體實時解壓縮獲得了廣泛的支持,不過這個還沒有一種格式獲得多個廠家的支持。紋理數據的格式則沒有標準,要參考廠商的SDK或文檔獲得format值。這也就意味著,使用了壓縮紋理之後就不能跨平台了。
紋理格式是能被GPU所識別的像素格式,能被快速定址並採樣。
在Beers,Agrawala和Chaddha於1996發表的一篇影響深遠的論文基於已壓縮紋理的渲染[1]中,他們列舉四項紋理壓縮的特點,使其不同於其他圖像壓縮技術。
解壓速度:由於最好能直接從已壓縮的紋理直接渲染,為了儘可能地不影響性能,解壓縮要儘可能快。
隨機訪問:由於幾乎不可能預測紋素被訪問的順序,任何紋理壓縮演算法必須允許對其中紋素的隨機訪問。所以幾乎所有的紋理壓縮演算法都以塊為單位壓縮和存儲紋素,當某一紋素被訪問時,只有同一塊中若干紋素被讀取和解壓縮。這項需求也排除了很多壓縮率較高的圖像壓縮方式,例如JPEG和行程長度編碼。
壓縮率和圖像質量:由於人眼的不精確性,相比於其他應用領域,圖像渲染更適宜使用有損數據壓縮。
編碼速度:紋理壓縮對壓縮速度要求不高,因為絕大多數情況下,紋理只需要進行一次壓縮。
由於其數據訪問模式是事先知道的,紋理壓縮常作為整個繪圖管線的一部分,在繪製時對動態地已壓縮數據進行解壓縮。而反過來繪製管線也可以通過紋理壓縮技術來降低對於帶寬和存儲的需求。在紋理貼圖中,已壓縮紋理和沒有經過壓縮的紋理使用起來基本沒有區別,都可以被用來存儲顏色數據或其他數據,例如凹凸貼圖或法線貼圖,也都可以和Mipmapping或各向異性過濾等共同使用。
6.6.1 主要GPU廠商及支持的紋理壓縮演算法
7 粒子系統
7.1 效果預覽
粒子系統表示三維計算機圖形學中模擬一些特定的模糊現象的技術,而這些現象用其它傳統的渲染技術難以實現的真實感的效果。經常使用粒子系統模擬的現象有火、爆炸、煙、水流、火花、落葉、雲、霧、雪、塵、流星尾跡或者象發光軌跡這樣的抽象視覺效果等等。
7.2 主要參數
什麼是粒子系統?粒子系統是由總體具有相同的表現規律,個體卻隨機表現出不同的特徵的大量顯示元素構成的集合。
這個定義有幾個要素:
1、 群體性:粒子系統是由「大量顯示元素」構成的。因此,用粒子系統來描述一群蜜蜂是正確的,但描述一隻蜜蜂沒有意義。
2、 統一性:粒子系統的每個元素具有相同的表現規律。比如組成火堆的每一個火苗,都是紅色,發亮,向上跳動,並且會在上升途中逐漸變小以至消失。
3、 隨機性:粒子系統的每個元素又隨機表現出不同特徵。比如蜂群中的每一隻蜜蜂,它的飛行路線可能會彎彎曲曲,就象布郎運動一般無規則可尋,但整個蜂群,卻是看起來直線向一個方向運動(這就是上一點所說的統一性)。
8 數學基礎
這一部分是很簡單的,對於不同數學知識背景的讀者來說都容易閱讀。對於想了解更多更全的這方面信息的讀者,請查看有關線性代數和高等數學的書籍。
8.1 向量
幾何學中,我們用有向線段表示向量。向量的兩個屬性是他的長度和他的頂點所指的方向。因此,可以用向量來模擬既有大小又有方向的物理模型。例如,以後我們要實現的粒子系統。我們用向量來模擬粒子的速度和加速度。在3D計算機圖形學中我們用向量不僅僅模擬方向。例如我們常常想知道光線的照射方向,以及在3D世界中的攝象機。向量為在3維空間中表示方向的提供了方便。
8.2 變換
3D空間中最常用的變換主要是,平移,旋轉,縮放
8.2.1 變換的順序
變換作用的順序會影響變換最終的結果。
通過使用矩陣相乘把3個變換矩陣合成一個矩陣。注意我們必須按實際應用的順序來進行矩陣相乘。
8.2.2 模型視圖的二元性
視圖和模型變換對場景外部的最終效果來看是一樣的,將兩者區分開純粹是為了程序員方便。將對象向後移動和將參考坐標系向前移動在視覺上沒有區別。
8.2.3 透視投影
透視投影屬於中心投影。透視投影圖簡稱為透視圖或透視,它是從某個投射中心將物體投射到單一投影面上所得到的圖形。透視圖與人們觀看物體時所產生的視覺效果非常接近,所以它能更加生動形象地表現建築外貌及內部裝飾。在已有實景實物的情況下,通過拍照或攝像即能得到透視圖;對於尚在設計、規劃中的建築物則作圖(手工或計算機)的方法才能畫出透視圖。透視圖以渲染、配景,使之成為形象逼真的效果圖。
透視投影符合人們心理習慣,即離視點近的物體大,離視點遠的物體小,遠到極點即為消失,成為滅點。它的視景體類似於一個頂部和底部都被切除掉的棱椎,也就是稜台。這個投影通常用於動畫、視覺模擬以及其它許多具有真實性反映的方面。
8.2.4 正交投影
投影線垂直於投影面的投影屬於正交投影 ,屬於平行投影的一種。
推薦閱讀:
※##譯## The Comprehensive PBR Guide by Allegorithmic — Vol.2
※【UnrealEngine4】從虛幻四的著色模型到NPR
※從黑暗走向光明,他讓建築完美地融入到自然環境中——安藤忠雄