您好,登錄后才能下訂單哦!
在圖形學中,Texturing是一個將物體表面繪制上圖像或者其他數據的過程。紋理貼圖通過修改物體表面的渲染效果,達到一種更加真實渲染的目的。
物體表面的渲染顏色由光照,材質,視口位置和透明度決定。紋理可以改變物體表面的顏色值,而凹凸(bump texture) 改變的是法線。
整個貼圖的過程可以描述為一個貼圖管線:
之所以把貼圖的過程細分為幾個階段,是因為每個階段都為程序員提供了可控制性。
以一個墻面的貼圖為例,來描述整個階段.
1.找到需要貼圖的位置的空間坐標 (x,y,z) ;
2.將該位置進行投影,3D->2D, (x,y,x) -> (u,v) ,這個變換等同于將坐標乘以一個正交矩陣。
3. u,v 的坐標范圍為 (0,1),這樣做的目的是為了適應不同分辨率的紋理。u,v的值就用于確定該點的顏色值,通過查找內存中的紋理,將 u,v 由轉換到紋理的二維坐標上(相乘就行),就可以確定顏色值了,這個值就是物體的 diffuse color。
紋理管線的第一個過程就是獲取物體表面的空間坐標,然后投影到(u,v)空間上,uv空間是紋理的二維空間,(u,v)坐標通常是由3D設計師通過3D建模工具來標定的,這個過程通常稱為uv展開,目的就是生成紋理坐標。投影的方法包括球投影,圓柱投影,平面投影。
在非交互行的渲染中,貼圖過程就在渲染過程中,整個場景可能就只使用一種貼圖方式,但通常設計師會把模型進行分割并對各個模型使用不停的貼圖方法。在實時渲染的時候,投影過程通常在建模階段完成,而投影的結果會存儲在頂點中,或者在shader中完成,這樣就可以實現動態的貼圖,比如環境貼圖 (environment mapping).
雖然有很多種方法來實現貼圖,但是思路都是一樣的:通過插值來確定便面的參數,然后去查找對應的紋理值。
插值節點能夠將參數空間的組表(u,v)轉化到紋理空間坐標,這將為賦材質提供很大的靈活性,很常用的一個功能就是3d游戲中的換妝。
常用的一種依附方式就是矩陣運算,可以在shader中進行,另一種情況是控制紋理在問題貼不到的地方的處理方式,在OpenGL中該控制由 glTexParameter來實現。
依附階段之后就可以得到 u,v 的坐標了,通過u,v 的坐標和紋理貼圖就可以很容易地得到顏色值,大部分渲染中使用的都是圖像紋理,一維,二維或者三維,但是在procedual texture中是不同的,在procedual texturing 中,并不是查找內存中的紋理值來得到rgb值的,而是通過計算獲得。
關于顏色信息的表示,最簡單的就是Rgb值,雖然也可以使用灰度值,那就是黑白畫了。還有就是Rgba,a表示alpha,多出一個值來表示透明度。法線貼圖中,還有更多的顏色信息。
在復雜的應用中,可能需要用到大量的貼圖,用于存放紋理的高速緩存依硬件的不同而不同,但總歸一句話 - 不夠用。解決的方法有很多,總歸一句話:尋找平衡點。
一種策略是將紋理的體積設計得很小,犧牲一些精度,即使一次性全部加載到內存中也OK,典型的用空間換時間。
還有就是利用OS中的內存調度策略了,比如LRU (Least recently used)。每一次加載紋理的時候都給該紋理一個時間戳,當需要加載新的紋理的時候,如果內存夠用,直接加載,不夠用就把最久未使用的那個紋理踢除,然后加載。
加載紋理會耗費可觀的時間(從硬盤到內存當然耗時啊!),大部分情況下不可能一次性加載全部紋理,一種解決方案就是預加載。
Real-Time Rendering 3rd
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。