切線空間是由模型中該頂點(diǎn)處的法線、切線和副切線組成的,就算沒(méi)有法線紋理,模型的每個(gè)頂點(diǎn)也是有自己的切線空間的。因?yàn)槲覀円趂ragment shader里構(gòu)建變換矩陣,所以到了像素級(jí)別的時(shí)候你可以認(rèn)為此時(shí)每個(gè)像素的切線空間的三個(gè)坐標(biāo)軸是由頂點(diǎn)處的三個(gè)向量插值過(guò)來(lái)的。
你所說(shuō)的“每個(gè)像素點(diǎn)的法線應(yīng)該都是和它自己的切線空間的z軸重合的”,準(zhǔn)確說(shuō)來(lái)是每個(gè)像素點(diǎn)的插值法線應(yīng)該都是和它自己的z軸重合的,因?yàn)槲覀兙褪鞘褂昧诉@個(gè)值肯定是一致的……法線貼圖里存儲(chǔ)的是在這個(gè)切線空間里面的某個(gè)方向,是我們希望高模中該處的法線方向。
你會(huì)有這樣的問(wèn)題應(yīng)該是把模型法線和我們期望的法線弄混了。法線貼圖一般是由高精度模型得來(lái)的,而我們真正使用的模型是由高模簡(jiǎn)化而來(lái)的,它包含了的頂點(diǎn)數(shù)和面片數(shù)都大大小于高模,這就意味著法線精度一定會(huì)缺失。所以我們就需要使用一張像素精度級(jí)別的紋理來(lái)存儲(chǔ)高模的法線信息,這就是法線紋理。
頂點(diǎn)坐標(biāo)和正切線為什么是float4,這有點(diǎn)意思,因?yàn)檫@里它表示是齊次坐標(biāo),比如我們這樣表示一個(gè)float4(x,y,z,w),當(dāng)w = 1的時(shí)候它表示點(diǎn)(x,y,z),當(dāng)w= 0的時(shí)候它表示一個(gè)向量(x,y,z)。區(qū)別就在這里,當(dāng)W為1時(shí)表示點(diǎn),當(dāng)W為0時(shí)表示向量。