Blender Geometry Node 程序化建模入门
👉 Geometry Node Editor



几何节点编辑器用于编辑由 *几何节点修改器* 使用的节点编组。该节点编组可定义许多操作,以修改一个物体的几何信息。这是非常特殊的一个修改器,是程序化几何生成器。从实现上来看,几何修改器作用于 GPU 渲染流水线的 Vertex Shder 编程阶段,通过修改顶点数据产生各种几何体。也作用于 Fragment Shader,给几何体进行材质的处理。
使用几何修改器,可以编辑以下内容:
- Meshes
- Curves
- Point Clouds
- Volumes
- Instances
Spreadsheet 电子表格编辑器提供了数据图表,节点所有几何体的数据,包括顶点、边线、面片等数据。此外,几何节点上提供了 Socket Inspection 和 Node Warnings 提示功能,通过鼠标悬停在端口,或者节点右上角的警告图标,就会显示相应的提示信息,帮助了解节点的工作状态。
另外,还可以使用以下两个覆盖层,通过右上角 Node Editor Overlays 弹出菜单设置:
- Node Timings Overlay 显示上一次计算节点组时节点执行所需的时间。
- Named Attributes Overlay 显示节点使用的命名属性。
几何修改器有任意输入、输出端,Node Group 管理,输入输出分别在其它几何修改器中连接使用,引用其它几何修改器时,通过 Group 节点分组下获取相应引用节点。
在几何节点编辑器中,任意节点相连成为一棵节点树,或者称为节点组。可以有任意的节点组,并且通过输入、输出组节点进行数据传递,并且输出的属性可供材质编辑器使用。在几何修改器属性面板中,给输出属性命名,Output Attributes 中指定名称。然后,在材质着色器中使用 **Attribute** 节点,输入几何节点提供的属性名,并选择 Geometry 类型即可以使用属性数据。
几何修改器中设置的节点树可以标记为资产以方便复用,在节点组的下拉选择按钮上使用右键弹出菜单操作。
注意,因为节点的端口在连接时,会自动根据连接时使用的数据类型确定端口的数据类型,如果后继有变更,可以在侧栏工具面板中管理设置,Sidebar - Group - Inputs/Outputs。
通过将字段端口连接到 Group Output,可以从节点树中任何节点的字段输出创建自定义属性。必须在组节点的输出属性中指定属性的域。注意,这不适用于实例化数据,Instanced Data。比如,可以直接将 Curve 或 Mesh Primitive 中提供的基本几何体连接到输出节点的 Geometry,就会忽略输入,生成所设置的几何体。
首次在修改器中使用节点组时默认使用的属性名称在节点组输出面板中定义。
几何编辑器中,Filed 字段是函数,可以处理任意的输入得到一个输出值。几何节点按端口类型差别分为三种:
**Dataflow Nodes**:包含几何体输入/输出的节点,包含圆圆端口 Circle;
**Function Nodes**: 执行函数运算的节点,包含棱形输入输出端口 Diamond;
**Input Nodes**: 为其它节点提供数据的节点;
其中,连接虚线的带点棱形表示 varying input,可以输入多种数据类型。
一个常见的误解是,同样的 Filed 节点连接产生同样的输出!但实际不是,随着场景数据的改变,节点在不同时间下输出的值是可以不相同的。

属性 Attributes 是一个通用术语,描述几何数据块中每个元素存储的数据。是几何节点中非常重要的概念。例如,每个顶点可以关联数值或者向量,通过将值连接到输出节点来更改属性,节点也可以更改特定属性的值。
属性有多种形式及数据类型:
Named Attributes
Anonymous Attributes
Built-In Attributes
Custom Attributes
属性域 Attribute Domains 是指属性对应的几何元素类型。了解属性的域很重要,它定义了如何在节点和着色中进行插值和使用。
可以使用电子表格编辑器来确定属性的域,Spreadsheet 列表中显示的是几何节点当前输出的数据。
各种属性域参考如下:
**Point domain** 关联空间中一个位置的属性,有以下三种:
Vertices of a mesh
Points of a point cloud
Curve control points
**Edge domain** 关联面片的边线的属性。
**Face domain** 关联网格的面片的属性。
**Face Corner domain** 关联网格面片角位的属性,如 UV 映射属性。
**Spline domain** 关联一组样条控制点的属性。
**Instance domain** 几何实例数据属性,只用于几何节点。
不同域的属性会自动插值转换。例如 Position Node 连接到 Set Material Node 节点的选择输入端口,属性值从 Point 域插值到 Face 域。域转换通常取平均值,但布尔数据类型属性具有特殊的插值规则,比如Point 域到 Edge,当边线两个顶点都选中时,则转换结果等于选中边线。
除了存储网格或曲线等真实数据外,几何体可以存储实例,所谓实例 Instance 即引用原始数据,而不是复制出新的实际数据。这些实例本身可以引用更多几何体、对象或集合。实例化目的是在结果中包含更多的几何图形,而避免复制实际数据。这是因为与复制数据时相比,Cycles 这样的渲染器的可以更好地处理只是位置上有差别的相同几何数据。
简单的应用示范,ID Marker,给一个 Cube 各个顶点添加 ID 序号标记显示:
首先,创建一个 String to Curve,将字母作为序号字符串输入到 String 属性中使用;
通过 Instance on Point 将序列字符串实例化到几何体的顶点上。
连接输入节点 Geometry 到 Points;
连接字符串曲线节点 Curve Instance 到 Instance;
连接几何体顶点序号属性到 Pick Instance,可以使用 **Index Node** 或 **ID Node**;
因为字符串生成的曲线会按序号出现偏移位置,可以通过 Set Postion 将每个字符归位。


Pick Instance 输入为 0 表示不做选择,即选择所有,可以使用 **Math** 节点进行数学运算处理。
书本纸张双面贴图演示:
创建 UV 贴图,勾选 Tile 启用拼贴贴图;
也可以通过侧栏工具创建 Image - Source - UDIM Tiles,并对 1001 贴图执行 Fill Tile;
在 UDIM Tiles 列表中,点击 + 号添加分块,指定 Count 为纸张的数量,即创建相应的贴图拼块数量;
在 Image 面板中点击 Pick Image 右侧的贴图选选择按钮,从文件浏览器中选择图像文件;
着色器中连接纹理坐标、Mapping、Image Texture 使用纹理贴图,通过调整 UV 坐标就可以使用 UDIM。
添加输入节点 Geometry 获取几何数据,使用 Backfacing 用来做正反面判断,分别对应 0.0 和 1.0。
正面放偶数序号的贴图,反而放奇数号的贴图,需要在几何节点编辑器提供相应的数据来驱动纹理坐标。
几何节点编辑器中设置:
添加一个 Mesh - Grid 节点用于定义纸张的基本网格;
因为有多张纸,需要使用实例化 Instance on Points;
为了将纸张实例化在一行、一列或一叠的形态,可以使用 Mesh Line 节点给实例节点提供 Points 输入;
为了给实例出来的网格设置不同的纸张贴图,需要对其进行 Realise 真实化,这样可以能进行材质设置;
注意,实例 Realize 之后会产生 Face Corner 属性 uv_map,原本几何体的坐标数据为 UVMAP;
为了着色器能够正确使用纸张的正反面贴图,需要将网格体的 ID 输出,索引属性也可以;
在 Realize 后使用 Capture Attribute 捕捉几何数据,Value 连接一个 ID 属性节点;
将捕捉到的 ID 属性数据值连接到输出节点,并在几何修改器属性面板中为其指定一个名称,如 faceid。
注意,捕捉节点要设置为 **float** 类型和 **face** 属性域,并且要保持和 Group Outputs 设置一致。否则在着色器中不能正确获取属性数据,尽管捕捉节点中可以设置为 integer 数据类型,但输出端口一定要设置为 float 类型。
使用 Transfer Attribute 节点也可以将面片 ID 输出给着色器使用,但需要注意,其映射方式和属性域的设置,与 Surface 输入不匹配则不能正确获取到面片 ID 值。可以使用 Spreadsheet 数据表查看相应属性域中是否有相应的数据输出。
着色器使用 Attribute 读取 uv_map 作为纹理贴图坐标,以正确处理实例产生的几何体贴图。注意,UDIM 各个贴图 UV 空间依次为 (0-1, 1-2, 2-3),递增关系。在处理 UV 坐标时,只需要修改对应的分量即可,使用 Vector 合并节点。再与初始 UV 值相加,得到正确 UV 坐标。
面片 ID 从 0 开始计数,为了将贴图与正反面对应,可以按以下思路处理:
使用 Math Multiply 将 ID 加倍,这时,每个面片的正面显示的是同为奇数偶数页的贴图;
使用 Backfacing 值,将其乘 -1 并且与上一步产生的值叠加起来,即可以实现两面不同贴图;
注意:渲染可能从背面开始,此时应该将乘数 -1 改为 1。
新版本使用 Store Named Attribute 将属性值保存为 2D Vector 类型以及 Face Corner 属性域,并且命名为 uv。然后,在着色器中就可以通过纹理坐标读取,并且输出 UV,不需要再通过属性节点。旧版本虽然可以覆盖掉 UVMap,但是只能使用 3D Vector,所以并不能正确存储 UV 坐标属性值。
要自动创建贴图并加载贴图到相应的位置,需要按以下两种规则之一命令贴图文件,每行最多 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 文件进行序列化命名:
几何编辑器提供的节点类型非常丰富,涉及曲线、网格、材质等各个方面,总体可以将它们分成三类型,使用它们进行程序化建模:
功能处理类型:
01. Input Nodes 几何节点输入;
02. Utilities Nodes 工具类节点;
03. Vector Nodes 向量运算处理;
04. Volume Nodes 体积处理;
05. Instances Nodes 实例处理节点;
06. Output Nodes 几何节点输出;
几何体、网格、曲面处理类型:
01. Geometry Nodes 几何处理节点;
02. Point Nodes
03. Curve Nodes
04. Curve Primitive Nodes 基本曲线节点;
05. Curve Topology Nodes 曲线拓扑节点;
06. Mesh Nodes
07. Mesh Primitive Nodes 基本网格几何体;
08. Mesh Topology Nodes 网格拓扑节点;
纹理处理类型:
01. Color Nodes 颜色处理;
02. Material Nodes 材质处理节点;
03. Text Nodes 字符串、文本纹理处理;
04. Texture Nodes 纹理生成;
05. UV Nodes 贴图坐标处理;
几何节点中不支持创建材质,需要先创建好材质,再通过 **Material** 节点获取相应的材质,以及使用材质处理节点对使用不同材质的面片进行处理。
参考
- [点云 实例随机材质赋予](https://www.bilibili.com/video/BV1wR4y1W7cN)
- [几何节点详解 书页坐标传递](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