斷斷續(xù)續(xù)的也學了一些圖形學和3D渲染的知識,出于對游戲的喜歡吧。
因為有一些知識是,我當時不明白,后來突然煥然大悟的,我覺得可以寫出來,分享一下。大神略過。
管線?流水線
英文單詞是pipeline,可以翻譯成管道、管線。但是管線,這個根本不形象,甚至誤導?!颁秩竟芫€”,難道是拿筆 去畫一個管子?直到我看了這個單詞,之前都是看中文,這個單詞還可以翻譯成流水線?!颁秩竟芫€”實際是指像工廠的流水線那樣一套流程下來,把定點數(shù)據(jù)變成屏幕上的像素的一套流程。或者說,它想說的是流程,抓住“Render Pipeline”這個東西的本質(zhì)是一套流程。
UV
可樂的瓶子上有一層紙,就是那層油紙,一般飲料瓶上都有。這個紙它是二維的,而瓶子是三維的,但是,這是重點,當它們貼在一起的時候,對于瓶子上的某一點,它在紙上都有一個對應的點。
那么是不是對于任何形狀的物體,我們都可以找到一張紙,可以很完美的貼到它的表面上?這個我無法確定,但可以用來理解概念,就假設真的有。假如這張紙是粘性的,可以把物體表面的點粘下來,那么把這張紙再張開成二維的,那么原本在物體表面上的點都被展開到了二維平面里,那么在這個二維的平面里就有另一套坐標系統(tǒng),這個坐標就是UV。
UV有什么用?假設有一個三維物體表面的點A,它的UV坐標是(u,v),然后我給你一張圖片,你按這個坐標去圖片里去點,然后把這個點的顏色涂到三維物體表面的這個點A上,那么結(jié)果是什么?
想象瓶子的表面上每個點,都射出一條線,線的另一端連接到圖片上他們對應的UV坐標上。然后這些線逐漸的縮短,最終,是不是這個圖片就被貼到了三維物體表面上的?!
這個圖就是紋理(texture)
- 有了UV坐標,就可以把任意二維圖片貼到三維物體上,所以你建模的時候,建一個空白的,然后你想要什么表面就要什么。所以“皮膚”就是這么來的。
- UV還有一個大用處,就是動畫?想象可樂瓶上的包裝紙被轉(zhuǎn)動時候的情況,其實就是每個點的UV同步調(diào)的發(fā)生改變。比如水面效果,先給一個水的波紋圖片,然后把這個波紋圖片不斷的移動,看起來就像水面不斷的起伏。而這個波紋圖片的移動,就是不斷隨時間調(diào)整物體上點的UV左邊。
這些東西,下個Unity,建個膠囊,搞個貼圖,拖一拖UV就有直觀的感覺。
法線貼圖
- 首先光照模型里要用到法線,比如漫反射模型
I_diff = K_d * ambient+ K_d * light* dot (Normal,lightDir);
K_d 是反射系數(shù),ambient 是環(huán)境光,light是光照,Normal是法線方向,lightDir光照方向
從公式里可以看出:法線可以影響光照。
假如有一個平面A,那么它的光是均勻的,然后有另一個平面B是凹凸不平的,當我在計算A的光照的時候,我用B的法線數(shù)據(jù),那么計算出來是什么結(jié)果?那就是把平面A掰成B那樣凹凸不平的結(jié)果,是不是?
進一步,我把B的法線用一張圖記下來,然后計算A的時候用這張圖,那么A就擁有了B的表面光照特征。而這張圖就是法線貼圖。
怎么用圖記下來?普通圖片是什么,每個點是RGB(當然也有其他顏色空間的)的 數(shù)據(jù),而法線是一個向量,剛好也是3個分量(xyz),那么正好把xyz存到RGB里去。那么我們得到了一張圖,而這個圖里每個顏色信息實際是法線信息。
然后是為什么要這么干?
假如游戲里有一堵墻,墻上是凹凸不平的磚塊,要么建模的時候就是這樣的,那就要費力氣了,也可以實際這個墻是個極其光滑的平面,然后用一個磚塊墻面的法線貼圖來計算的它的光照,它就有了凹凸不平的效果。這樣:1.我想換其他效果,一張圖的事 2. 省去了建模的工作
打個比喻:你在一張白紙上畫了一個極其逼真的坑,那個坑存在嗎?不存在。你看上去是一個坑嗎?是。什么地方出了問題:光照!
這個東西,追根溯源,其實就是這本身是一個操縱眼睛的技術(shù)。而性能是永遠不嫌多的,能省則省,所以就有了很多的模擬。