當前位置:首頁 » 操作系統 » 法線平滑演算法

法線平滑演算法

發布時間: 2023-01-23 01:33:21

『壹』 計算機圖形學(OPENGL):法線貼圖

本文同時發布在我的個人博客上: https://dragon_boy.gitee.io

  模型的網格構成其結構,紋理賦予其光影,但如果觀察我們之前的所有例子,都會發現模型的表面都是扁平的,就算賦予了紋理也看起來不真實,因為現實生活中的大部分物體都是表面粗糙,凹凸不平的。
  比如,一個貼有磚塊紋理的平面。磚牆本身應該表面凹凸不平,有縫隙,有劃痕,有孔洞,運用我們之前學過的技術,我們會在之前的平面上貼上紋理來模擬磚牆:

  仔細觀察的話,所有的凹凸不平、縫隙和孔洞這些細節全都沒有表現出來,平面看上去非常扁平。我們其實可以利用一些技術來表現細節,比如使用高光貼圖來讓某些地方照亮的更少,但這不算是一種真正的解決方式。
  如果我們從燈光的角度去思考的話:平面是怎麼樣被渲染為完全扁平的平面的?我們可以想到是平面的法線,決定物體形狀的就是它的法線。平面使用的是單獨的法線,所以表面沒有起伏變化,那麼如果我們為每個片段計算不同的法線,並操作這些法線產生一些變化的話,表面應該就能看起來起伏了。下面的圖說明了這個想法:

  為了使用法線貼圖技術我們需要每個片段的法線。就像使用漫反射貼圖和高光貼圖,我們可以將每一片段的法線信息存儲在一張紋理中。
  由於法線向量由幾何方式存儲,而紋理存儲的是顏色信息,所以這二者的轉換不那麼直接。紋理中顏色由r、g、b三個組件構成向量表示,法線由x、y、z三個組件構成向量表示。法線的組件取值范圍為[-1,1],顏色的范圍是[0, 1],所以我們需要進行一下映射:

  這樣的話,我們就可以將法線信息轉化為顏色信息存儲在紋理中。下面是磚塊紋理的法線貼圖:

  可以看到紋理圖片大部分顏色與藍色相關,這是因為大部分法線傾向於垂直於平面,也就是傾向於指向z軸,對應的是b通道,所以傾向於藍色,依此類推解釋其它的顏色。
  通過這個法線貼圖,我們可以結合漫反射紋理來渲染一個平面。(記住,OpenGL紋理的原點在左下角,大部分圖片的原點在左上角)我們需要做的就是按常規載入這張法線貼圖,並設置相關參數。注意,在片元著色器中我們將使用法線貼圖中的法線信息計算光照:

  載入法線貼圖,並根據紋理坐標映射後,我們的到法線信息,首先將其標准化到[-1,1],接著照常計算光照。
  最後的結果就是這樣:

  但存在一個限製法線貼圖使用的問題,法線貼圖中存儲的法線信息大部分都是指向z軸的,如果平面也指向z軸,效果的確很好,但如果不是,比如下面的平面指向y軸,結果就不對了:

  另一種可行的方法是在不同的坐標空間中計算光照,來保證從法線貼圖中采樣的法線向量始終指向z軸,其它相關的向量也會轉換到相同的坐標空間中。使用這種方法,我們可以復用一張法線貼圖,而這種坐標空間被稱為切線空間。

  在法線貼圖中的法線向量在切線空間中表示,在這個空間中,法線基本都會大致指向+z軸的方向。切線空間是相對於每個平面三角形的空間,我們將這個空間作為法線貼圖自己的空間,用來描述法線向量。當我們想要使用法線貼圖中的法線進行計算時,我們就可以使用一個特殊的矩陣變換將法線從切線空間轉化到世界空間或視圖空間,這樣就可以與物體相對應。
  所以解決上面法線貼圖不正確的方法就是定義一個特殊的矩陣將切線空間中的法線進行一些轉化,讓法線大致指向+y軸。
  而這么一個特殊的矩陣被稱為TBN矩陣,每個字母分別代表切線(Tangent)、雙切線(Bitangent)、法線(Normal)向量,這三個向量將用來構成一個矩陣。為了獲取這三個矩陣,我們定義切線空間的三個軸,上、右、前。
  我們已經有了代表上的軸向,即法線向量,右和前軸分別是切線和雙切線向量,下面是圖例說明:

  我們首先定義一個平面的四個頂點和每個頂點的紋理坐標(123和134兩個三角形),以及平面的法線朝向:

  根據上面提到的步驟,計算第一個三角形的兩條邊和兩條邊對應的ΔUV坐標:

  然後,我們就可以按照等式計算切線和雙切線了:

  作為結果,切線和雙切線的值應該為(1,0,0)和(0,1,0),它們和法線(0,0,1)構成TBN矩陣,在平面上顯示就是這樣:

  我們首先在著色器中定義TBN矩陣,可以在頂點著色器中傳入我們計算好的切線、雙切線以及法線作為頂點屬性:

  接著在main方法中創建TBN矩陣:

  我們首先將TBN三個向量分別轉化到我們想要工作的空間中,然後組裝為TBN矩陣。為了跟精確一些,我們可以將TBN三個向量分別進行和我們之前處理向量一樣的操作,因為我們只關心這些向量的指向。
  使用這個TBN矩陣的方式有兩種:

  在片元著色器中輸入:

  使用TBN矩陣我們將采樣的法線向量轉化世界空間:

  接著介紹第二種,我們將TBN矩陣的逆輸出到片元著色器:

  注意到我們使用的是轉置,這是因為TBN矩陣是一個正交矩陣,它的逆等於它的轉置,所以我們避免使用inverse來避免巨大的開銷。
  接著在片元著色器中將所有與燈光計算相關的向量轉化到切線空間:

  看起來第二種方式更為復雜,因為要計算的東西更多,但第二種方式有它的優點:我們可以將所有轉化工作在頂點著色器中進行。這是可行的,因為lightPos和viewLPos這種向量並不會在片元著色器中更新,同時也可以在頂點著色器中計算fs_in.FragPos計算切線空間的位置。的確,考慮效率,不必在片元著色器中進行空間的轉化。
  所以接下來我們在頂點著色器中完成這些操作:

  這樣將相關變數傳入片元著色器中就可以直接進行計算。
  為了觀察光照是否正確,我們可以讓平面一直旋轉:

  最後的結果如下:

  針對復雜模型,我們並不經常手動計算切線空間的相關向量。比如在導入模型時,我們可以藉助assimp庫來幫助我們計算。
  assimp庫有一個讀文件方法有一個配置選項為aiProcess_CalTangentSpace,這樣assimp可以為每個頂點都計算切線和雙切線:

  我們可以像下面這樣獲取切線:

  這樣的話,我們可以為模型載入它的法線貼圖,我們使用aiTextureType_Height選項:

  針對復雜模型時,切線往往是經過許多頂點計算的,這樣就可以得到一個平均值來獲得平滑的結果,這樣會造成一個問題,那就是T、B、N三個向量可能不會相互垂直了,也就是TBN矩陣不是正交的了。
  針對這一問題,我們可以使用格拉姆施密特方法來重新正交化TBN矩陣,在頂點著色器中這么做:

  最後,貼出原文地址供參考: https://learnopengl.com/Advanced-Lighting/Normal-Mapping

『貳』 maya如何低線段做平滑

通過你上面的圖片,可以看出,你說的低線段平滑,就是我們所說的法線光滑

法線光滑可以讓兩個面之間硬的交界線做一個平滑過渡,

它在maya軟體的命令位置為:建模板塊Modeling下面 Mesh Display命令下面的Soft Edge

如下圖所說

『叄』 Max小技巧(一)鎖法線(使模型光滑組平滑過渡)

有的模型給多個光滑組效果並不好,給一個光滑組會有漸變效果,結構不能很平滑的過渡,不是想要的效果,怎麼處理呢。

方法:給模型Edit Normals編輯器,然後選擇面Face,在點Selected鎖住法線。

『肆』 2019-12-23法線原理及法線處理

法線有兩種:一種是多邊形法線(也可以i 叫做表面法線),一種是頂點法線。shift+V進入視圖設置,勾選法線顯示,在視窗可以看到法線,短小的白線就是,並且其總是垂直於表面,多邊形法線可以運用在多個工具配合使用  比如網格——創建工具——偏移(M-Y);專門配合法線的工具:網格——移動工具——法線移動、法線旋轉、法線縮放;

法線處在多邊形的重心位置,其會隨著多變形形狀的變化發生變化,不過立方體軸線就沒有那麼聰明,依舊處在多邊形邊界框(BOX模式線可以查看邊界框)的重心,移動工具——軸向——選擇模式下便可以查看,如果你想把立方體軸向移動到法線的同等位置,移動工具——軸向——點模式下(重心點的位置就會選取所有點的平均值,即與法線位置重合)

法線的反面,shift+V  忽略背面。多邊形就會消失

但在添加材質的時候要添加的是頂點法線,C4D中默認的燈光和攝像機的位置和角度都是一樣的,在點編輯模式下選中vertext normal tool(頂點法線編輯工具),選中多邊形,在多邊形的定點可以看到法線。通過旋轉法線可以看到多邊形表面顏色發生變化,其原理和平滑著色標簽有息息相關的聯系,當平滑著色的角度小於90的時候,轉折處生硬,當大於90度的時候則會很漸變看起來(為什麼轉折處很生硬,是因為轉折處的點有兩個互相垂直的法線,為什麼看起來圓潤漸變,兩法線合並並法線角度發生轉變(平均分配),平分的角度則是轉折角度的一半,但還是垂直於表面的)

U-A 對齊法線和反轉法線功能相似,

選擇——平滑著色器斷開的                 用來顯示斷開了平滑著色的過度線——在屬性窗口選擇全部,選擇斷開的邊  然後用倒角工具倒角    倒角處與其他面不符合,是因為倒角工具在選項中默認選擇勾選了斷開勾選平滑圓角       斷開平滑著色圓角的作用就是把原表面與新產生的面斷開分離開來     恢復的方法是  網格工具——法線——恢復平滑著色  OK看起來就會好很多了

倒角變形器也會有相同的結果   處理方法則是   取消勾選平滑著色斷開圓角並在細分處添加細分  OK了

低面幾何體就有著色不平滑的問題,造成這個問題的原因就是一個幾何體和其他幾何體權重角度的不同,也就是每個多邊形,其頂點法線角度是不統一的,但是平滑著色標簽默認的狀態又不能解決這個問題,對於低面幾何體的法線整修主要是通過頂點法線編輯插件解決:選擇所有沒有倒角的面,對其法線進行重新定向,

snapselection——UNselected(shift cycle)用來反向選擇倒角的面,並吸附到剛才校正的法線角度 

對於倒角,倒角後法線垂直角度被新產生的加上原來的角度所平分,要想保持效果,可以進行內部擠壓,先產生的倒角線可以再次倒角一次,OK效果完美。在這里為什麼不使用倒角

法線貼圖其實就是每像素XYZ軸法線信息的集合,但凹凸貼圖不一樣,他是灰度圖上下信息的集合

『伍』 Blender拆邊和平滑法線的簡單應用

本質上,拆邊和平滑法線的效果是一樣的,那就是給一個物體正確的平滑顯示。

那麼既然它們效果一樣,為什麼開發者要分開來弄這兩個功能呢?他們當然不是吃飽了撐的。在游戲模型的建造里,為了盡量減少draw call,我們會把多個網格合並成一個網格。但是,有些部件之間的平滑法線角度要求可能不一樣,比如刀刃的部分可能需要26.8°,刀柄部分可能需要54°,可一旦這兩個網格合並在了一起時,就會使用活躍物體的平滑法線度數,單獨使用平滑法線功能會有差勁的表現。

因此這個時候,如果使用拆邊修改器單獨對刀刃和刀柄進行對應角度的法線平滑,再把它們合為一體時就不會受到平滑法線角度的影響了。

不過要注意的問題是,拆邊修改器顧名思義就是給模型進行拆邊,尖銳邊上的點會被拆開,這樣會導致後續對模型進行更改的時候不方便選擇。

『陸』 maya 平滑法線 在哪裡

maya中smooth是將一個面分為4個面,通過4個面的法線矯正達到圓滑的目的,但隨之而來的是大量面和大量的線,將佔用更多的系統資源,不更改模型直接圓滑法線是比較好的選擇,先選擇需要圓滑物體的所有邊,maya主菜單下Edit Polygons->Normals->Soften/Harden
點後面的小方塊 在彈出的窗口中將角度值打到180就圓滑法線了

熱點內容
隨機啟動腳本 發布:2025-07-05 16:10:30 瀏覽:528
微博資料庫設計 發布:2025-07-05 15:30:55 瀏覽:26
linux485 發布:2025-07-05 14:38:28 瀏覽:305
php用的軟體 發布:2025-07-05 14:06:22 瀏覽:757
沒有許可權訪問計算機 發布:2025-07-05 13:29:11 瀏覽:433
javaweb開發教程視頻教程 發布:2025-07-05 13:24:41 瀏覽:709
康師傅控流腳本破解 發布:2025-07-05 13:17:27 瀏覽:244
java的開發流程 發布:2025-07-05 12:45:11 瀏覽:688
怎麼看內存卡配置 發布:2025-07-05 12:29:19 瀏覽:285
訪問學者英文個人簡歷 發布:2025-07-05 12:29:17 瀏覽:835