包含20節(jié)視頻教程
關(guān)注12.2萬次
本系列是MAYA基礎(chǔ)建模教程,會員可以用零基礎(chǔ)學(xué)習(xí)MAYA的各種建模工具,制作出一個(gè)完整的火車模型,老師講解非常細(xì)致和耐心,讓會員輕松的學(xué)習(xí)MAYA建模,一步步變成MAYA建模高手,為之后的MAYA工作打好扎實(shí)的基礎(chǔ)。
最近搜集了不少資料和試驗(yàn),打算把maya中法線貼圖(normal map)的相關(guān)信息綜合一下并且心思一下思路。慢慢來!:)
法線貼圖(normal map)是一種較新的貼圖技術(shù),類似于bump map,通過對模型表面的法線的矯正來用以表現(xiàn)模型的細(xì)節(jié)與紋理,其效果比后者要好,能達(dá)到bump map所達(dá)不到的效果,但是其并不能真正的在模型表面產(chǎn)生細(xì)節(jié),相對于displacement map而言,又不如其滿意。而且其制作和應(yīng)用很麻煩,問題也很多,所以這種技術(shù)cg中并不常用,不過,在游戲中卻有相當(dāng)?shù)陌l(fā)展空間。其他不多說了,先來看個(gè)圖:
為什么同一個(gè)模型(10*10段的多邊形球體)會出來兩種效果,我使用了soften/harden edge命令來柔化了右邊的模型邊,這樣看起來就圓滑了很多!
我現(xiàn)在打開了custom polygon display options,顯示出來法線來看看區(qū)別:
模型的法線有兩種:點(diǎn)法線和面法線。面法線是在面中心發(fā)出,表示面的方向;而點(diǎn)法線是從點(diǎn)發(fā)出的,取決于點(diǎn)周圍的面的方向,左右模型的區(qū)別說明了soften/harden edge命令工作原理。同時(shí)也normal map的基礎(chǔ)。(其實(shí)還有一種:uv coodinate normal。但maya中似乎沒有這個(gè)概念,這個(gè)東東是在normal map應(yīng)用中許多問題產(chǎn)生的根源,這里暫不講述)
下面我們開始。建立一個(gè)polygon球體,參數(shù)如下。
然后再復(fù)制出一個(gè)隱藏。
對這個(gè)球體平滑2次后,用雕刻工具作出一些細(xì)節(jié)。
打開hypershade,賦予這個(gè)球一個(gè)新的lambert材質(zhì)。
再建立一個(gè)sampleinfo和setrange節(jié)點(diǎn),作如下連接:
這樣我們把這個(gè)球的法線與攝象機(jī)信息輸入,將其輸出到物體材質(zhì)的color上,這里我的材質(zhì)選擇了surfaceshader,這并不重要。只是為了方便觀察效果。
調(diào)節(jié)參數(shù):我們將法線變量轉(zhuǎn)化為顏色值,需要重新定義取值區(qū)間,由[-1,1]轉(zhuǎn)化為[0,1]。
顏色改變,但是你會發(fā)現(xiàn)硬件顯示的顏色與渲染的顏色不一樣!
這可是個(gè)問題的關(guān)鍵!而且不管你如何移動或旋轉(zhuǎn)攝象機(jī)和模型,物體的顏色分布都不變化,上面是綠色,左邊藍(lán),右邊紅。這可不是我們想要的。
這個(gè)問題的原因是因?yàn)閟ampleinfo輸出的法線信息是基于攝象機(jī)的,所以與攝象機(jī)關(guān)聯(lián),而并非物體本身,這樣我們后面的得到的也是不能用的法線信息。
為了解決這個(gè)問題,我們斷開samlpeinfo和setrange之間的聯(lián)系,新建一個(gè)vector product節(jié)點(diǎn),如下連接。
將透視攝象機(jī)的節(jié)點(diǎn)拖進(jìn),輸入其世界矩陣信息到vector product節(jié)點(diǎn),運(yùn)算方式為vector matrix product,再將輸出值連接到setrange的
value上。
這樣做是矢量與矩陣運(yùn)算,把攝象機(jī)坐標(biāo)系轉(zhuǎn)換為世界坐標(biāo)系,這樣攝象機(jī)的變化不在影響物體的顏色分布了,但是如果我們轉(zhuǎn)動物體,問題仍然出現(xiàn)。所以要把物體的變化的信息也要加進(jìn)去,將世界坐標(biāo)系轉(zhuǎn)換為物體坐標(biāo)系。
如果將此時(shí)的顏色轉(zhuǎn)換為貼圖,我們就叫它world-space normal map。(后面在介紹這些分類)
如圖再加入如下類似的節(jié)點(diǎn),注意這次選擇的是world inverse matrix。
圖中colorball就是這個(gè)球體的模型節(jié)點(diǎn),你可以在outliner中找到它,拖到hypershade里。
這樣,我們看到顏色顯示與渲染的一致了,以渲染出來的為準(zhǔn),這樣移動攝象機(jī)或物體,顏色分布就正確的象貼在物體上一樣。
選中球體和其材質(zhì),使用convert to file texture options將顏色轉(zhuǎn)化為貼圖,參數(shù)如下,分辨率和自行設(shè)置。
此時(shí)生成的貼圖,顏色以紅,綠,藍(lán)分布類似彩虹,就叫做
object- 或 local-space normal map。這個(gè)與上面的world-space normal map看上去會很類似。
下面看看如何使用這張貼圖
顯示出原來的復(fù)制出的那個(gè)低精度的球體,命名為normalball。賦予一個(gè)材質(zhì),然后連接。使用這樣的貼圖相當(dāng)于一次逆運(yùn)算。我想不用多說了吧。
看看效果,我這里用的software渲染。
效果還不錯,但是問題總是伴隨著,如果我們保持?jǐn)z象機(jī)不動,旋轉(zhuǎn)物體,你看會怎樣?
細(xì)節(jié)正確,但是光影卻完全錯誤,陰影也象貼圖一樣“粘”在模型上,與燈光的位置毫無關(guān)系了,這可是不允許的!
所以,我們還要把normball的節(jié)點(diǎn)引入,再次逆運(yùn)算。
這樣,模型細(xì)節(jié)和光影都正常了,旋轉(zhuǎn)模型和鏡頭都沒有問題,可以用于構(gòu)建場景了。
但是,這樣就完了嗎?
我們先來看看在hardware渲染和high quality rending渲染結(jié)果。
這是什么玩意的一坨啊?
顯然,在即時(shí)運(yùn)算更新時(shí)顯示是不正常的,這意味著對于游戲的設(shè)計(jì)顯然是不可用的 ,同樣,mentalray渲染也是不行的!
而且后面還有更大的問題存在呢!
按f9進(jìn)入點(diǎn)元素模式,對這個(gè)球隨意進(jìn)行一些變形。
再轉(zhuǎn)回物體模式,渲染看。注意場景中只有一盞燈。
發(fā)現(xiàn)了嗎,光影還是錯誤的,又是這個(gè)討厭的問題!
這就意味著如果要在物體以下的級別變形,比如蒙皮,綁定等,就會出現(xiàn)嚴(yán)重的問題。
在maya7以后有這樣一組工具:surface sampler(相當(dāng)于maya6中
transfer surface options),這個(gè)工具里面包含了很多有用的工具。
當(dāng)map space選中object space時(shí),那么transfer in world space
/object space所生成的normal map就相當(dāng)于world-space normal map
和object- 或 local-space normal map。
那么還有個(gè)tangent space是什么呢?
tangent space就是切線坐標(biāo),即與法線垂直正交的方向,其有個(gè)很重要的特性就是它是針對模型上的每個(gè)點(diǎn)的坐標(biāo),而不是整個(gè)物體,這正是我們需要的特性。
這個(gè)工具的用法我以前的帖子里講過的,很簡單的。文件格式常用tif的,有很多優(yōu)勢。
生成的貼圖就是所謂的tangent-space normal map,其明顯不同,顏色是以蘭色為基調(diào)的。這個(gè)應(yīng)該說是比較完美的,不會出現(xiàn)前面的問題。來看看。
maya中沒有直接的normal map的通道,使用麻煩,不象3dmax或lightwave,所以這方面的文章才比較少,不過maya7以后加入了,它是隱藏在
bump2d的節(jié)點(diǎn)中,使用和bump map一樣簡單。
打開high quality rendering,這樣我們終于看到了期望的結(jié)果。
而且各個(gè)角度都正常。
有時(shí)硬件即時(shí)顯示并不能很正確,如果看不到正確結(jié)果,可以用
hardware渲染一下看。
不過遺憾的是,maya中這個(gè)節(jié)點(diǎn)只能被硬件渲染,同樣不支持在software和mentalray渲染。但是也是,本來maya中這個(gè)節(jié)點(diǎn)就是為了制作游戲而生的,針對的多是游戲中的渲染引擎。
還有人用這樣的方法連接:
這種直接連接的方法可得到同樣的硬件渲染效果,也可以 軟件渲染,但是光影失真;不支持mentalray。最大的問題就是:如果要與其他bump map聯(lián)合使用就會很困難。
繼續(xù)……
至此我們可以先總結(jié)一下,以便有更好的理解和應(yīng)用。
world-space normal map
1. 彩色.
2. 使用后物體不能旋轉(zhuǎn)和以點(diǎn)為基礎(chǔ)的變形,否則材質(zhì)和陰影會亂掉
3. 適用于不動的物體(比如建筑物).
4. 計(jì)算快
object- or local-space normal map
1. 和world-space normal map一樣,不同的只是針對了部分元素游戲編碼
2. 物體可以旋轉(zhuǎn),但是不能在物體以下級別變形.
3. 適用于某些簡單機(jī)械運(yùn)動中的元素(門,車輛,機(jī)械等)
4. 計(jì)算較快
tangent-space normal map
1. 以蘭色為基調(diào)
2. 物體可以旋轉(zhuǎn)和變形
3. 適用于變形物體(角色,水面,布料等)
3. 計(jì)算最慢(并不經(jīng)常).
如果我們要在軟件渲染或mentalray渲染中也應(yīng)用該則呢們辦呢?
一般來說,在maya中或第三方的渲染器渲染normal map,需要建立一定的節(jié)點(diǎn)來模擬,這可不是一件愉快的事情。我這里用maya的節(jié)點(diǎn)軟件渲染,看看效果:
還不錯,但是它的節(jié)點(diǎn)卻是比較復(fù)雜的。這個(gè)節(jié)點(diǎn)來自于headus (metamorphosis) pty ltd。但是原節(jié)點(diǎn)的坐標(biāo)并不適用maya(針對的是zbrush),我將其修改重新連接。
總的來說就是要把攝象機(jī)的normalcamera和tangentu,v的信息都輸出,與normal map輸出的信息進(jìn)行點(diǎn)乘運(yùn)算,連接到物體材質(zhì)的
normalcamera。這樣軟件渲染時(shí)就可以收集到相應(yīng)信息。
如果需要,我在后面共享了這個(gè)節(jié)點(diǎn),耐心讀完我的帖子,你可以找到它。
適用與任何版本的software渲染,速度較慢,不支持硬件渲染。
但是mentalray就比較麻煩,目前我試驗(yàn)的節(jié)點(diǎn)如下:
相當(dāng)于在軟件渲染節(jié)點(diǎn)上再與透視攝象機(jī)進(jìn)行矢量矩陣運(yùn)算,輸出到材質(zhì)。
遺憾的是,只支持maya6.5以下的mentalray版本,maya7中的mentalray由于更新了渲染方式和代碼,無效!
你也可以使用jan sandstrom的js_normalmapper的mentalray節(jié)點(diǎn)。但是同樣是不支持maya7。
同時(shí),在mentalray渲染中可以使用global illumination,但開啟final gather渲染無效!這是由于fg的運(yùn)算方式?jīng)Q定的,目前尚未有辦法解決!
下來我們介紹一下normal map與bump map的聯(lián)合使用。
從本質(zhì)來說,normal map更接近bump map而不是displacement map。
但是也就是說normal map要和bump map合用,是很難發(fā)現(xiàn)區(qū)別的,所以會產(chǎn)生錯覺,在應(yīng)用中較難發(fā)現(xiàn)錯誤,這是在游戲運(yùn)用中比較麻煩的,往往不能及時(shí)更正,導(dǎo)致計(jì)劃拖延。
先來介紹硬件即時(shí)渲染中的合用。
bump map分為bump3d和bump2d,曾經(jīng)有位介紹過了這兩種
bump效果的合用,你可以在以前的帖子里找到。但是在試驗(yàn)中發(fā)現(xiàn),如果合用的話,其效果只能在軟件渲染中體現(xiàn),硬件渲染是無效的。這樣normal map和bump map直接采用這種合用,即時(shí)顯示是無法正確的。而我們需要在游戲制作中能即時(shí)瀏覽到。
所以我采用了層紋理(layered texture)來混合。這里用了個(gè)bump3d的節(jié)點(diǎn)。
在層紋理中混合方式選擇over,normal map在上層?刂破鋋lpha值調(diào)節(jié)凸凹效果(或bump depth)。注意!這樣做會其實(shí)是削弱了normal map的效果,所以alpha不能太低。其實(shí)在后面的setrange節(jié)點(diǎn)的用途是可以輸入表達(dá)式通過與alpha值相關(guān)聯(lián)的矯正削弱現(xiàn)象。
你也可以將bump3d層放在上層混合,你看看會有什么結(jié)果?
即時(shí)顯示的效果出現(xiàn),但是似乎哪里不對勁。
我前面提到了,這個(gè)區(qū)別是很難看出來,因?yàn)槲覀冇玫腷ump紋理并不是法線貼圖,但是用法是直接連入,但仍有效,是因?yàn)槠涫?d紋理,這點(diǎn)視覺差別是幾乎可以忽略的。
那么實(shí)際的用法該如何呢?
這里我們要用到一個(gè)小插件:transpace(你可以在網(wǎng)上很容易找到)
它的作用是把bump信息轉(zhuǎn)化為tangent normal信息,可以用來
bake normal map。
as color output:確保顏色值區(qū)間。應(yīng)當(dāng)鉤選。
invert y(v):對于某些ati和某些其他軟件,要反轉(zhuǎn)y(v)方向。選擇鉤選
normalize output:確保法線值區(qū)間。選擇鉤選。
這個(gè)插件可以用我前面的方法模擬,不過很麻煩。
下面是hradware渲染后效果。
bump2d的紋理或文件紋理就比較麻煩了。因?yàn)榇蠖鄶?shù)時(shí)候,他們并不能被正確的硬件顯示!采用與bump3d相同的連接。
解決這個(gè)很簡單,只要把bump紋理轉(zhuǎn)換成一張法線貼圖就可以了,然后混合。
在軟件渲染中就比較容易,和bump嵌套是一樣的,2d和3d紋理都一樣的可以得到滿意的效果。
朱峰社區(qū)網(wǎng)頁版(手機(jī)掃描-分享-添加到屏幕)
朱峰社區(qū)微信公眾號(微信掃一掃-關(guān)注)
未知用戶
2005-2025 朱峰社區(qū) 版權(quán)所有 遼ICP備2021001865號-1
2005-2025 ZhuFeng Community All Rights Reserved
VIP