溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Real-Rime Rendering (3) - 紋理(Texturing)

發(fā)布時(shí)間:2020-07-13 11:43:08 來源:網(wǎng)絡(luò) 閱讀:445 作者:拳四郎 欄目:開發(fā)技術(shù)

簡(jiǎn)介

      在圖形學(xué)中,Texturing是一個(gè)將物體表面繪制上圖像或者其他數(shù)據(jù)的過程。紋理貼圖通過修改物體表面的渲染效果,達(dá)到一種更加真實(shí)渲染的目的。


渲染管線(Textureing Pipeline)

       物體表面的渲染顏色由光照,材質(zhì),視口位置和透明度決定。紋理可以改變物體表面的顏色值,而凹凸(bump texture) 改變的是法線。

       整個(gè)貼圖的過程可以描述為一個(gè)貼圖管線:

Real-Rime Rendering (3) - 紋理(Texturing)

         之所以把貼圖的過程細(xì)分為幾個(gè)階段,是因?yàn)槊總€(gè)階段都為程序員提供了可控制性。

         以一個(gè)墻面的貼圖為例,來描述整個(gè)階段.

Real-Rime Rendering (3) - 紋理(Texturing)

1.找到需要貼圖的位置的空間坐標(biāo) (x,y,z) ; 

2.將該位置進(jìn)行投影,3D->2D, (x,y,x) -> (u,v) ,這個(gè)變換等同于將坐標(biāo)乘以一個(gè)正交矩陣。

3. u,v 的坐標(biāo)范圍為 (0,1),這樣做的目的是為了適應(yīng)不同分辨率的紋理。u,v的值就用于確定該點(diǎn)的顏色值,通過查找內(nèi)存中的紋理,將 u,v 由轉(zhuǎn)換到紋理的二維坐標(biāo)上(相乘就行),就可以確定顏色值了,這個(gè)值就是物體的 diffuse color。



投射過程(Projector function)

       紋理管線的第一個(gè)過程就是獲取物體表面的空間坐標(biāo),然后投影到(u,v)空間上,uv空間是紋理的二維空間,(u,v)坐標(biāo)通常是由3D設(shè)計(jì)師通過3D建模工具來標(biāo)定的,這個(gè)過程通常稱為uv展開,目的就是生成紋理坐標(biāo)。投影的方法包括球投影,圓柱投影,平面投影。

        在非交互行的渲染中,貼圖過程就在渲染過程中,整個(gè)場(chǎng)景可能就只使用一種貼圖方式,但通常設(shè)計(jì)師會(huì)把模型進(jìn)行分割并對(duì)各個(gè)模型使用不停的貼圖方法。在實(shí)時(shí)渲染的時(shí)候,投影過程通常在建模階段完成,而投影的結(jié)果會(huì)存儲(chǔ)在頂點(diǎn)中,或者在shader中完成,這樣就可以實(shí)現(xiàn)動(dòng)態(tài)的貼圖,比如環(huán)境貼圖 (environment mapping).

        雖然有很多種方法來實(shí)現(xiàn)貼圖,但是思路都是一樣的:通過插值來確定便面的參數(shù),然后去查找對(duì)應(yīng)的紋理值。


依附階段(Corresponder function)

       插值節(jié)點(diǎn)能夠?qū)?shù)空間的組表(u,v)轉(zhuǎn)化到紋理空間坐標(biāo),這將為賦材質(zhì)提供很大的靈活性,很常用的一個(gè)功能就是3d游戲中的換妝。

       常用的一種依附方式就是矩陣運(yùn)算,可以在shader中進(jìn)行,另一種情況是控制紋理在問題貼不到的地方的處理方式,在OpenGL中該控制由 glTexParameter來實(shí)現(xiàn)。


紋理值(Texture value)

       依附階段之后就可以得到 u,v 的坐標(biāo)了,通過u,v  的坐標(biāo)和紋理貼圖就可以很容易地得到顏色值,大部分渲染中使用的都是圖像紋理,一維,二維或者三維,但是在procedual texture中是不同的,在procedual texturing 中,并不是查找內(nèi)存中的紋理值來得到rgb值的,而是通過計(jì)算獲得。

        關(guān)于顏色信息的表示,最簡(jiǎn)單的就是Rgb值,雖然也可以使用灰度值,那就是黑白畫了。還有就是Rgba,a表示alpha,多出一個(gè)值來表示透明度。法線貼圖中,還有更多的顏色信息。


貼圖緩存(Texture catching)

       在復(fù)雜的應(yīng)用中,可能需要用到大量的貼圖,用于存放紋理的高速緩存依硬件的不同而不同,但總歸一句話 - 不夠用。解決的方法有很多,總歸一句話:尋找平衡點(diǎn)。

       一種策略是將紋理的體積設(shè)計(jì)得很小,犧牲一些精度,即使一次性全部加載到內(nèi)存中也OK,典型的用空間換時(shí)間。

        還有就是利用OS中的內(nèi)存調(diào)度策略了,比如LRU (Least recently used)。每一次加載紋理的時(shí)候都給該紋理一個(gè)時(shí)間戳,當(dāng)需要加載新的紋理的時(shí)候,如果內(nèi)存夠用,直接加載,不夠用就把最久未使用的那個(gè)紋理踢除,然后加載。

        加載紋理會(huì)耗費(fèi)可觀的時(shí)間(從硬盤到內(nèi)存當(dāng)然耗時(shí)啊?。?,大部分情況下不可能一次性加載全部紋理,一種解決方案就是預(yù)加載。


參考

Real-Time Rendering 3rd

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI