Blender Geometry Node 程序化建模入門
?? Geometry Node Editor



幾何節(jié)點編輯器用于編輯由 *幾何節(jié)點修改器* 使用的節(jié)點編組。該節(jié)點編組可定義許多操作,以修改一個物體的幾何信息。這是非常特殊的一個修改器,是程序化幾何生成器。從實現(xiàn)上來看,幾何修改器作用于 GPU 渲染流水線的 Vertex Shder 編程階段,通過修改頂點數(shù)據(jù)產(chǎn)生各種幾何體。也作用于 Fragment Shader,給幾何體進行材質的處理。
使用幾何修改器,可以編輯以下內(nèi)容:
- Meshes
- Curves
- Point Clouds
- Volumes
- Instances
Spreadsheet 電子表格編輯器提供了數(shù)據(jù)圖表,節(jié)點所有幾何體的數(shù)據(jù),包括頂點、邊線、面片等數(shù)據(jù)。此外,幾何節(jié)點上提供了 Socket Inspection 和 Node Warnings 提示功能,通過鼠標懸停在端口,或者節(jié)點右上角的警告圖標,就會顯示相應的提示信息,幫助了解節(jié)點的工作狀態(tài)。
另外,還可以使用以下兩個覆蓋層,通過右上角 Node Editor Overlays 彈出菜單設置:
- Node Timings Overlay 顯示上一次計算節(jié)點組時節(jié)點執(zhí)行所需的時間。
- Named Attributes Overlay 顯示節(jié)點使用的命名屬性。
幾何修改器有任意輸入、輸出端,Node Group 管理,輸入輸出分別在其它幾何修改器中連接使用,引用其它幾何修改器時,通過 Group 節(jié)點分組下獲取相應引用節(jié)點。
在幾何節(jié)點編輯器中,任意節(jié)點相連成為一棵節(jié)點樹,或者稱為節(jié)點組??梢杂腥我獾墓?jié)點組,并且通過輸入、輸出組節(jié)點進行數(shù)據(jù)傳遞,并且輸出的屬性可供材質編輯器使用。在幾何修改器屬性面板中,給輸出屬性命名,Output Attributes 中指定名稱。然后,在材質著色器中使用 **Attribute** 節(jié)點,輸入幾何節(jié)點提供的屬性名,并選擇 Geometry 類型即可以使用屬性數(shù)據(jù)。
幾何修改器中設置的節(jié)點樹可以標記為資產(chǎn)以方便復用,在節(jié)點組的下拉選擇按鈕上使用右鍵彈出菜單操作。
注意,因為節(jié)點的端口在連接時,會自動根據(jù)連接時使用的數(shù)據(jù)類型確定端口的數(shù)據(jù)類型,如果后繼有變更,可以在側欄工具面板中管理設置,Sidebar - Group - Inputs/Outputs。
通過將字段端口連接到 Group Output,可以從節(jié)點樹中任何節(jié)點的字段輸出創(chuàng)建自定義屬性。必須在組節(jié)點的輸出屬性中指定屬性的域。注意,這不適用于實例化數(shù)據(jù),Instanced Data。比如,可以直接將 Curve 或 Mesh Primitive 中提供的基本幾何體連接到輸出節(jié)點的 Geometry,就會忽略輸入,生成所設置的幾何體。
首次在修改器中使用節(jié)點組時默認使用的屬性名稱在節(jié)點組輸出面板中定義。
幾何編輯器中,F(xiàn)iled 字段是函數(shù),可以處理任意的輸入得到一個輸出值。幾何節(jié)點按端口類型差別分為三種:
?**Dataflow Nodes**:包含幾何體輸入/輸出的節(jié)點,包含圓圓端口 Circle;
?**Function Nodes**: 執(zhí)行函數(shù)運算的節(jié)點,包含棱形輸入輸出端口 Diamond;
?**Input Nodes**: 為其它節(jié)點提供數(shù)據(jù)的節(jié)點;
其中,連接虛線的帶點棱形表示 varying input,可以輸入多種數(shù)據(jù)類型。
一個常見的誤解是,同樣的 Filed 節(jié)點連接產(chǎn)生同樣的輸出!但實際不是,隨著場景數(shù)據(jù)的改變,節(jié)點在不同時間下輸出的值是可以不相同的。

屬性 Attributes 是一個通用術語,描述幾何數(shù)據(jù)塊中每個元素存儲的數(shù)據(jù)。是幾何節(jié)點中非常重要的概念。例如,每個頂點可以關聯(lián)數(shù)值或者向量,通過將值連接到輸出節(jié)點來更改屬性,節(jié)點也可以更改特定屬性的值。
屬性有多種形式及數(shù)據(jù)類型:
?Named Attributes
?Anonymous Attributes
?Built-In Attributes
?Custom Attributes
屬性域 Attribute Domains 是指屬性對應的幾何元素類型。了解屬性的域很重要,它定義了如何在節(jié)點和著色中進行插值和使用。
可以使用電子表格編輯器來確定屬性的域,Spreadsheet 列表中顯示的是幾何節(jié)點當前輸出的數(shù)據(jù)。
各種屬性域參考如下:
?**Point domain** 關聯(lián)空間中一個位置的屬性,有以下三種:
?Vertices of a mesh
?Points of a point cloud
?Curve control points
?**Edge domain** 關聯(lián)面片的邊線的屬性。
?**Face domain** 關聯(lián)網(wǎng)格的面片的屬性。
?**Face Corner domain** 關聯(lián)網(wǎng)格面片角位的屬性,如 UV 映射屬性。
?**Spline domain** 關聯(lián)一組樣條控制點的屬性。
?**Instance domain** 幾何實例數(shù)據(jù)屬性,只用于幾何節(jié)點。
不同域的屬性會自動插值轉換。例如 Position Node 連接到 Set Material Node 節(jié)點的選擇輸入端口,屬性值從 Point 域插值到 Face 域。域轉換通常取平均值,但布爾數(shù)據(jù)類型屬性具有特殊的插值規(guī)則,比如Point 域到 Edge,當邊線兩個頂點都選中時,則轉換結果等于選中邊線。
除了存儲網(wǎng)格或曲線等真實數(shù)據(jù)外,幾何體可以存儲實例,所謂實例 Instance 即引用原始數(shù)據(jù),而不是復制出新的實際數(shù)據(jù)。這些實例本身可以引用更多幾何體、對象或集合。實例化目的是在結果中包含更多的幾何圖形,而避免復制實際數(shù)據(jù)。這是因為與復制數(shù)據(jù)時相比,Cycles 這樣的渲染器的可以更好地處理只是位置上有差別的相同幾何數(shù)據(jù)。
簡單的應用示范,ID Marker,給一個 Cube 各個頂點添加 ID 序號標記顯示:
?首先,創(chuàng)建一個 String to Curve,將字母作為序號字符串輸入到 String 屬性中使用;
?通過 Instance on Point 將序列字符串實例化到幾何體的頂點上。
?連接輸入節(jié)點 Geometry 到 Points;
?連接字符串曲線節(jié)點 Curve Instance 到 Instance;
?連接幾何體頂點序號屬性到 Pick Instance,可以使用 **Index Node** 或 **ID Node**;
?因為字符串生成的曲線會按序號出現(xiàn)偏移位置,可以通過 Set Postion 將每個字符歸位。


Pick Instance 輸入為 0 表示不做選擇,即選擇所有,可以使用 **Math** 節(jié)點進行數(shù)學運算處理。
書本紙張雙面貼圖演示:
?創(chuàng)建 UV 貼圖,勾選 Tile 啟用拼貼貼圖;
?也可以通過側欄工具創(chuàng)建 Image - Source - UDIM Tiles,并對 1001 貼圖執(zhí)行 Fill Tile;
?在 UDIM Tiles 列表中,點擊 + 號添加分塊,指定 Count 為紙張的數(shù)量,即創(chuàng)建相應的貼圖拼塊數(shù)量;
?在 Image 面板中點擊 Pick Image 右側的貼圖選選擇按鈕,從文件瀏覽器中選擇圖像文件;
?著色器中連接紋理坐標、Mapping、Image Texture 使用紋理貼圖,通過調整 UV 坐標就可以使用 UDIM。
?添加輸入節(jié)點 Geometry 獲取幾何數(shù)據(jù),使用 Backfacing 用來做正反面判斷,分別對應 0.0 和 1.0。
?正面放偶數(shù)序號的貼圖,反而放奇數(shù)號的貼圖,需要在幾何節(jié)點編輯器提供相應的數(shù)據(jù)來驅動紋理坐標。
幾何節(jié)點編輯器中設置:
?添加一個 Mesh - Grid 節(jié)點用于定義紙張的基本網(wǎng)格;
?因為有多張紙,需要使用實例化 Instance on Points;
?為了將紙張實例化在一行、一列或一疊的形態(tài),可以使用 Mesh Line 節(jié)點給實例節(jié)點提供 Points 輸入;
?為了給實例出來的網(wǎng)格設置不同的紙張貼圖,需要對其進行 Realise 真實化,這樣可以能進行材質設置;
?注意,實例 Realize 之后會產(chǎn)生 Face Corner 屬性 uv_map,原本幾何體的坐標數(shù)據(jù)為 UVMAP;
?為了著色器能夠正確使用紙張的正反面貼圖,需要將網(wǎng)格體的 ID 輸出,索引屬性也可以;
?在 Realize 后使用 Capture Attribute 捕捉幾何數(shù)據(jù),Value 連接一個 ID 屬性節(jié)點;
?將捕捉到的 ID 屬性數(shù)據(jù)值連接到輸出節(jié)點,并在幾何修改器屬性面板中為其指定一個名稱,如 faceid。
注意,捕捉節(jié)點要設置為 **float** 類型和 **face** 屬性域,并且要保持和 Group Outputs 設置一致。否則在著色器中不能正確獲取屬性數(shù)據(jù),盡管捕捉節(jié)點中可以設置為 integer 數(shù)據(jù)類型,但輸出端口一定要設置為 float 類型。
使用 Transfer Attribute 節(jié)點也可以將面片 ID 輸出給著色器使用,但需要注意,其映射方式和屬性域的設置,與 Surface 輸入不匹配則不能正確獲取到面片 ID 值??梢允褂?Spreadsheet 數(shù)據(jù)表查看相應屬性域中是否有相應的數(shù)據(jù)輸出。
著色器使用 Attribute 讀取 uv_map 作為紋理貼圖坐標,以正確處理實例產(chǎn)生的幾何體貼圖。注意,UDIM 各個貼圖 UV 空間依次為 (0-1, 1-2, 2-3),遞增關系。在處理 UV 坐標時,只需要修改對應的分量即可,使用 Vector 合并節(jié)點。再與初始 UV 值相加,得到正確 UV 坐標。
面片 ID 從 0 開始計數(shù),為了將貼圖與正反面對應,可以按以下思路處理:
?使用 Math Multiply 將 ID 加倍,這時,每個面片的正面顯示的是同為奇數(shù)偶數(shù)頁的貼圖;
?使用 Backfacing 值,將其乘 -1 并且與上一步產(chǎn)生的值疊加起來,即可以實現(xiàn)兩面不同貼圖;
?注意:渲染可能從背面開始,此時應該將乘數(shù) -1 改為 1。
新版本使用 Store Named Attribute 將屬性值保存為 2D Vector 類型以及 Face Corner 屬性域,并且命名為 uv。然后,在著色器中就可以通過紋理坐標讀取,并且輸出 UV,不需要再通過屬性節(jié)點。舊版本雖然可以覆蓋掉 UVMap,但是只能使用 3D Vector,所以并不能正確存儲 UV 坐標屬性值。
要自動創(chuàng)建貼圖并加載貼圖到相應的位置,需要按以下兩種規(guī)則之一命令貼圖文件,每行最多 10 張圖:
<UDIM>: A 4-digit notation calculated as 1001 + u-tile + v-tile * 10.
<UVTILE>: A notation defined as u(u-tile + 1)_v(v-tile + 1).
例如,
monster.<UDIM>.png? ?will load/save files like monster.1021.png etc.
monster.<UVTILE>.png will load/save files like monster.u1_v3.png etc.
使用以下 PowerShell 腳本可以對 JPG 文件進行序列化命名:
幾何編輯器提供的節(jié)點類型非常豐富,涉及曲線、網(wǎng)格、材質等各個方面,總體可以將它們分成三類型,使用它們進行程序化建模:
功能處理類型:
01.?Input Nodes 幾何節(jié)點輸入;
02. Utilities Nodes 工具類節(jié)點;
03. Vector Nodes 向量運算處理;
04. Volume?Nodes 體積處理;
05. Instances Nodes 實例處理節(jié)點;
06. Output Nodes 幾何節(jié)點輸出;
幾何體、網(wǎng)格、曲面處理類型:
01. Geometry Nodes 幾何處理節(jié)點;
02. Point Nodes
03. Curve Nodes
04. Curve Primitive Nodes 基本曲線節(jié)點;
05. Curve Topology Nodes 曲線拓撲節(jié)點;
06. Mesh Nodes
07. Mesh Primitive Nodes 基本網(wǎng)格幾何體;
08. Mesh Topology Nodes 網(wǎng)格拓撲節(jié)點;
紋理處理類型:
01. Color Nodes 顏色處理;
02. Material Nodes 材質處理節(jié)點;
03. Text Nodes 字符串、文本紋理處理;
04. Texture Nodes 紋理生成;
05. UV Nodes 貼圖坐標處理;
幾何節(jié)點中不支持創(chuàng)建材質,需要先創(chuàng)建好材質,再通過 **Material** 節(jié)點獲取相應的材質,以及使用材質處理節(jié)點對使用不同材質的面片進行處理。
參考
- [點云 實例隨機材質賦予](https://www.bilibili.com/video/BV1wR4y1W7cN)
- [幾何節(jié)點詳解 書頁坐標傳遞](https://www.bilibili.com/video/BV1k44y1Y7gE)
- https://docs.blender.org/manual/zh-hans/2.93/editors/geometry_node.html
- https://docs.blender.org/manual/zh-hans/2.93/modeling/geometry_nodes/index.html
- https://docs.blender.org/manual/en/3.5/modeling/geometry_nodes/index.html