烘焙法線中的坑
同步更新unity connect,求點贊收藏
https://connect.unity.com/p/hong ... ngconnect.unity.com
法線是什麼?
先簡單說下定義。
物體平面上任意一點,垂直於平面的方向,就是法線方向。以3dsmax為例,修改器新增“編輯法線”。就能看到該模型的頂點法線方向。
法線貼圖的做法相當簡單:做高模和低模→低模展UV→高低模烘焙法線
烘焙法線的意義,就是把高模的法線方向,以畫素的形式,存到低模的表面上。貼上法線貼圖的低模,就會有高模的光影變化,從而看起來像高模一樣。(unlit沒有法線,因為沒有光影變化。)
下面開始說問題
做法線貼圖看似三步,但每個環節都會出問題。
1. 高模法線有問題
正方體的硬轉角,低模轉高模,為了高模能有圓滑的轉角(或叫高光邊),常見做法是,倒角+細分。
如果用的是這種倒角+細分。恭喜你,不管細分有多高,烘焙後肯定會獲得一個凸起來的面。這就像正方形直接細分會變成球一樣。
並且由於貼圖在引擎壓縮後,貼圖精度不夠,會產生馬賽克方塊一樣的平面。
正確做法,倒角不能影響到原模型的邊緣形狀。
這樣才能保住中心平面是用4個相同方向的法線算平均,算出來整個面都是一個方向。高模甚至不需要細分,拐角處正好是完美的0-90度過渡。
2.低模法線有問題
高模的光滑組(軟硬邊)隨便分都沒事,只要看起來對就能用。
但低模不同,作為接收法線的受體,有很多限制。
低模需要烘焙的地方不能有硬邊。如果一定要硬邊,硬邊處UV需要切開。
這是高模,綠線是硬邊
如果低模UV不斷開處有硬邊,法線明顯有一條鋸齒錯誤。
會發生錯誤的原因很好理解,硬邊同時存在兩個方向的法線,分別對應到左右兩個面。
假設法線貼圖,左邊需要紅色才能還原高模法線,右邊需要藍色。
而紅過渡到藍沒法在一個畫素內完成,所以共用畫素的硬邊,肯定會產生錯誤。
同理切開UV重新擺,會使硬邊上有足夠畫素做紅藍過渡。
可效果相同誰會選擇更麻煩的做法呢。。直接低模全軟就好
3.低模UV重疊
為保證貼影象素利用率,低模一般會有UV左右對稱重疊。
常見做法如下。
低模刪掉對稱面,和高模一起把穿插部件分開。高低模烘焙出法線貼圖,對稱低模縫合斷面,貼上法線貼圖。
思考一下,低模的對稱縫合線,應該用硬邊還是軟邊?
看圖可知。答案是硬邊。
用於烘焙的“低模”在刪除面時,切口就已經變成了硬邊,所以烘焙出來的法線只能用於硬邊模型。螺口不對自然無法開螺絲。
結合23兩條,不難得出:
• 模型全軟邊也能烘焙,不管UV切不切。
• 烘焙模型法線被你改了,自然要把原模型切口處法線改成一樣。
• 所以,是UV接縫但不是切口處的線,無需改成硬邊。
有些老前輩的教條“烘焙法線時UV接縫處要硬邊”,現在看看就是笑話。知其然而不知其所以然的樣子,真有趣。
甚至於我還要繼續打臉。
“UV接縫處要硬邊”的源頭,是UV重疊會影響烘貼圖。只要UV重疊不會影響到烘貼圖,就不用切開模型。
做法如下:
• 低模對稱縫合好,全軟邊,存為最終遊戲內用的低模A
• 原本想用於烘焙的面,設為一個單獨材質球。其他面設為另一個材質球,存為低模B。
• B模型紅色材質球烘焙貼圖。出來的法線即可直接貼到低模A上。
4.不同軟體互導
改變法線的方法有分兩種,1.軟硬邊2.光滑組
軟體匯出模型成FBX,OBJ等模型資源時,會把 光滑組/軟硬邊 轉化成法線方向。
以max為例,模型在匯入匯出時,均會提示你,是否導光滑組(max裡的光滑組)。
如果匯入時沒勾選,光滑組資訊會丟棄,法線方向被鎖定,法線顏色變為綠色,此時編輯光滑組會不起作用,編輯面會導致法線凌亂瞎算。(重置法線即可解開)
5.引擎裡貼圖設定
Unity內法線貼圖在用時,需要指定Texture Type為Normal map。勾選這個相當於對法線進行了Unpack,也就是法線貼圖的RG兩個通道進行了*2-1
但如果你不需要引擎為你unpack,而是自己解的話,記得把sRGB去掉。
曾經有一次自己反覆檢查1-4到底哪裡出了問題,結果花了好久才發現自己沒去掉sRGB,慘痛的教訓。
還沒點贊收藏的GKD,I‘ve got you in my sight.
下面是我的artstation地址:
https://www.artstation.com/luteli
作者:Lute Li
專欄地址:https://zhuanlan.zhihu.com/p/107252209
相關文章
- unity陰影(一)烘焙和Quality中Shadows的設定Unity
- ACS:研究發現烘焙甜點中的巧克力暗藏健康風險
- Unite 2019|Unity的光照烘焙技術(上)Unity
- storage事件中的坑,storage.setItem()無法觸發storage事件事件
- 圖形學 畫直線 DDA掃描法與中點畫線法
- 雙均線策略:量化交易中的黃金法則
- 使用 GPU 進行 Lightmap 烘焙 - 簡單 demoGPU
- node編碼中的坑
- nginx配置gzip中的坑Nginx
- JasperReport 中踩過的坑
- 列表與字典中的坑
- Zuul中聚合Swagger的坑ZuulSwagger
- 小心 Enum Parse 中的坑
- IDEA無法連線docker中的資料庫的問題IdeaDocker資料庫
- 那些年走過下劃線的坑
- 記一個 Docker 映象無法執行的坑Docker
- 踩坑篇之WebSocket實現類中無法使用@Autowired注入物件Web物件
- Unity乾貨知識:加速Lightmap烘焙速度的一些小技巧Unity
- Hyperledger Fabric部署的坑(更新中)
- Fragment中呼叫startActivityForResult的那些坑Fragment
- MySQL中wait_timeout的坑MySqlAI
- Vue 3.0 使用 Vuetify中的坑Vue
- Java中浮點數的坑Java
- Oracle 解決like中無法匹配下劃線的問題Oracle
- 懸線法
- Weex線上踩坑實錄
- 最近線上發生的兩個坑爹鍋
- ajax中回撥的幾個坑
- Java 中,Arrays 轉 List 的那些坑Java
- Oracle資料庫中遇到的坑Oracle資料庫
- HTTP 規範中的那些暗坑HTTP
- Redis中的Scan命令踩坑記Redis
- Fragment中的那些坑——Android進階FragmentAndroid
- mysql中null與“空值”的坑MySqlNull
- async語法升級踩坑小記
- 法線紋理
- Windows無法配置此無線連線這個問題的解決辦法Windows
- 本地無法連線Mysql的原因MySql