在光照這部分里我講了怎么實(shí)現(xiàn)物體的明暗關(guān)系缀辩,但物體還是純色。在實(shí)際的3D建模過程中弱睦,3D物體一般都需要手繪貼圖百姓,本次講一講渲染引擎是怎么實(shí)現(xiàn)貼圖的。
貼圖况木,即使用一張2D圖片垒拢,來規(guī)定3D模型上一部分或者全部的點(diǎn)的每一個(gè)的顏色。
(一般是用來設(shè)置每個(gè)點(diǎn)的顏色火惊,但也可以設(shè)置法線等其他屬性求类,比如法線貼圖)
關(guān)于如何將3維的點(diǎn)一一映射到2D圖片上,是Maya屹耐,3DMAX等建模軟件的工作尸疆,想了解的可以搜索“UV展開”,本文主要講引擎獲得了模型和貼圖后,怎么將每個(gè)點(diǎn)的顏色從貼圖中獲取寿弱。
貼圖是2D的犯眠,我們稱x軸為u,y軸為v症革,也就是uv筐咧,范圍為[0, 1]。
在光柵化過程中噪矛,每一個(gè)三角形有3個(gè)頂點(diǎn)量蕊,這3個(gè)頂點(diǎn)的uv數(shù)據(jù)建模軟件已經(jīng)存進(jìn)去了,我們直接讀取出來艇挨,根據(jù)其uv值取出圖像上對應(yīng)坐標(biāo)的顏色即可残炮。
注意:
- 貼圖的分辨率要重映射到0~1,比如一張1028×720的圖片缩滨,u要乘上1027势就,v要乘上719來變換為圖片坐標(biāo)。
- 如果u是0.123456789楷怒,乘上1027之后還是個(gè)小數(shù)怎么辦蛋勺?因?yàn)閳D片像素點(diǎn)都是整數(shù)瓦灶,所以我們要把這個(gè)小數(shù)坐標(biāo)的顏色進(jìn)行插值鸠删。插值方法為雙線性插值(bilinear interpolation)。
即該點(diǎn)的顏色為其4個(gè)相鄰整數(shù)點(diǎn)顏色的加權(quán)平均贼陶,當(dāng)s=0刃泡,t=0時(shí),p在A點(diǎn)碉怔,所以B,C,D的系數(shù)都是0烘贴,A的系數(shù)為1,根據(jù)這個(gè)特征來確定4個(gè)系數(shù)撮胧,這就是這4個(gè)系數(shù)長這樣的原因桨踪。
到目前為止,我們可以拿到物體上某個(gè)點(diǎn)的貼圖顏色了芹啥,那么融合光照之后公式又是什么樣呢锻离?
在Phong里面,把Ka和Kd替換為貼圖顏色墓怀。Ks不換汽纠,因?yàn)橐话愣际前咨?br> 在Gouraud里面,全部換成貼圖顏色傀履。
在三角形內(nèi)部的點(diǎn)虱朵,貼圖uv是多少?
答:插值,和光照里面插值方法一樣碴犬,平面方程插值絮宁。
目前為止,計(jì)算出來的貼圖應(yīng)該是下圖中間這樣的
我們看到有明顯的不對的地方翅敌,這是因?yàn)槲覀儾逯档膗v計(jì)算是在仿射空間計(jì)算的羞福,而從image到perspective的過程中,圖形會(huì)扭曲蚯涮,所以插值的uv也會(huì)扭曲治专。
解決方法:透視修正
將uv轉(zhuǎn)換到perspective或者screen space進(jìn)行uv插值,將插出來的uv值再變回仿射空間獲取像素顏色遭顶。