Blender 完全指南: 从零打造吉卜力风格的程序化3D云朵
在本教程中,我们将深入探索如何在 Blender 4.0.2 中完全通过程序化节点来创建令人惊叹的吉卜力风格3D云朵。最终的成果是一个高度可定制的云朵着色器,你不需要任何外部图像纹理,所有效果都将通过 Blender 内置的节点编辑器动态生成。无论你是 Blender 新手还是有一定经验的用户,只要对节点编辑感兴趣,都能从本教程中获益。
通过本教程,你将学到:
- 理解并运用“伪体积云 (Fake Volumetric)”的概念来创建轻量级的云朵效果。
- 掌握 Blender着色器节点 (Shader Node) 的核心工作原理,包括各种混合节点 (Mix Node) 的使用。
- 学习如何通过程序化纹理 (Procedural Textures) 如
Gradient Texture,Musgrave Texture,Noise Texture来构建复杂的云朵形态。 - 如何创建和控制程序化法线 (Procedural Normal),为云朵表面增加丰富的凹凸细节。
- 如何使云朵材质对场景中的光照和物体位置做出动态响应。
- 如何组织和管理复杂的节点网络,使其更易于理解和修改。
核心概念简介:伪体积云与节点工作方式
在我们开始实际操作之前,先简要了解几个核心概念:
- 伪体积云 (Fake Volumetric): 真实的体积云渲染通常非常消耗计算资源。本教程采用“伪体积云”的方法,通过在多个堆叠的平面上应用透明度和纹理,来模拟云朵的体积感和深度,从而实现高效且美观的云朵效果。
- 着色器节点 (Shader Nodes): Blender 的着色器节点系统允许我们通过连接不同的功能模块(节点)来创建复杂的材质。你可以将节点想象成一系列的指令,它们按顺序处理信息,最终决定物体表面的外观。
- 混合节点 (Mix Nodes): 这是节点编辑中的核心。类似于 Photoshop 或 Procreate 中的图层叠加,混合节点 (如
Mix Color,Math,Vector Math) 可以将来自不同源的纹理、颜色或数值信息以多种方式(如叠加、相乘、线性光等)组合起来,创造出更丰富的视觉效果。
步骤一: 基础设置与伪体积云搭建
- 创建基础平面:
- 打开 Blender,在3D视图中,按下
Shift + A组合键,在弹出的菜单中选择Mesh->Plane,创建一个新的平面。 - 选中该平面,按下
R键进入旋转模式,然后按X键限制沿X轴旋转,输入数字90,再按Enter键确认。平面将垂直于地面。
- 打开 Blender,在3D视图中,按下
- UV展开与视图设置:
- 确保平面仍被选中,按下
Tab键进入编辑模式 (Edit Mode)。 - 按下
U键打开UV映射菜单,选择Unwrap。 - 按下小键盘上的
5键,切换到正交视图 (Orthographic View),方便观察。
- 确保平面仍被选中,按下
- 进入着色器编辑器 (Shader Editor):
- 将界面切换到
Shader Editor选项卡。通常可以在顶部标签栏找到,或者通过在窗口左下角类型选择器中选择Shader Editor。 - 选中平面物体,在
Shader Editor窗口中,点击顶部的New按钮,为平面创建一个新的材质。 - 默认会创建一个
Principled BSDF节点和一个Material Output节点。选中Principled BSDF节点,按下X键或Delete键将其删除。
- 将界面切换到
- 创建基础球形渐变:
- 按下
Shift + A,在搜索框中输入Gradient Texture并添加它。 - 选中
Gradient Texture节点,按下Ctrl + T(需要已启用 Node Wrangler 插件),Blender 会自动添加Texture Coordinate和Mapping节点。 - 将
Gradient Texture节点的Color输出端口连接到Material Output节点的Surface输入端口。 - 在
Gradient Texture节点中,将类型从Linear改为Spherical。 - 将
Texture Coordinate节点的Object输出端口连接到Mapping节点的Vector输入端口。 - 在3D视图中,选中平面物体,按下
S键进入缩放模式,输入10,按Enter键确认,将平面放大10倍。
- 按下
- 创建伪体积立方体 (Array Modifier):
- 选中平面物体,在右侧的属性面板中,点击蓝色的扳手图标,进入
Modifier Properties(修改器属性) 选项卡。 - 点击
Add Modifier按钮,在Generate(生成) 类别下选择Array(阵列) 修改器。 - 在
Array Modifier的设置中:- 取消勾选
Relative Offset(相对偏移)。 - 勾选
Constant Offset(恒定偏移)。 - 将
Distance X的值设为0 m。 - 将
Count(数量) 的值设为10(这将创建10个平面副本)。 - 将
Distance Z的值设为0.15 m(这会在Z轴方向上为每个平面副本创建0.15米的间隔,形成堆叠效果)。
- 取消勾选
- 选中平面物体,在右侧的属性面板中,点击蓝色的扳手图标,进入
- 应用修改器并设置原点:
- 在
Array Modifier设置面板的右上角,点击下拉小箭头,选择Apply(应用)。或者在对象模式下,将鼠标悬停在3D视图中的物体上,按Ctrl + A,选择Visual Geometry to Mesh。 - 确保物体仍被选中,在3D视图中右键点击,选择
Set Origin->Origin to Geometry,将物体的原点设置到其几何中心。
- 在
- 设置透明材质基础:
- 回到
Shader Editor窗口。 - 添加
Mix Shader节点 (Shift + A->Search->Mix Shader)。 - 添加
Transparent BSDF节点 (Shift + A->Search->Transparent BSDF)。 - 添加
Emission(自发光) 节点 (Shift + A->Search->Emission)。 - 连接节点:
- 将
Transparent BSDF节点的BSDF输出连接到Mix Shader节点的顶部Shader输入。 - 将
Emission节点的Emission输出连接到Mix Shader节点的底部Shader输入。 - 将之前创建的
Gradient Texture(Spherical) 节点的Color输出连接到Mix Shader节点的Fac(因子) 输入。 - 将
Mix Shader节点的Shader输出连接到Material Output节点的Surface输入。
- 将
- 设置材质透明属性:
- 在右侧的属性面板中,选择红色的球形图标,进入
Material Properties(材质属性) 选项卡。 - 展开
Settings(设置) 面板。 - 将
Blend Mode(混合模式) 从Opaque(不透明) 改为Alpha Hashed(Alpha散列)。 - 将
Shadow Mode(阴影模式) 也改为Alpha Hashed。 - 此时,3D视图中的平面堆叠应该会根据球形渐变的黑白信息显示出透明效果,黑色区域透明,白色区域不透明。
- 在右侧的属性面板中,选择红色的球形图标,进入
- 回到
步骤二: 添加纹理细节与混合
现在我们的云朵有了一个基础的球形,接下来我们将通过混合多种程序化纹理来增加其形态的复杂性和真实感。
- 引入 Musgrave 纹理:
- 添加
Musgrave Texture节点 (Shift + A->Search->Musgrave Texture)。 - 选中
Musgrave Texture节点,按Ctrl + T添加Texture Coordinate和Mapping节点。确保Texture Coordinate的Object输出连接到Mapping节点的Vector输入,再连接到Musgrave Texture的Vector输入。
- 添加
- 复制球形渐变纹理组:
- 选中之前创建的
Gradient Texture(Spherical) 及其关联的Texture Coordinate和Mapping节点,按Shift + D复制它们。我们将用这个副本来与 Musgrave 纹理混合。
- 选中之前创建的
- 第一次纹理混合 (Linear Light):
- 添加
Mix Color节点 (Shift + A->Search->Mix Color)。 - 连接节点:
- 将
Musgrave Texture节点的Height输出连接到Mix Color节点的A输入。 - 将复制出来的
Gradient Texture(Spherical) 节点的Color输出连接到Mix Color节点的B输入。
- 将
- 在
Mix Color节点中,将混合模式从Mix改为Linear Light。 - 将
Mix Color节点的Factor值设置为1.000。 - (可选) 预览效果:按住
Ctrl + Shift并左键点击Mix Color节点,可以在3D视图中预览该节点的输出。你可以通过在编辑模式下隐藏部分平面来观察内部纹理。按Alt + H可以取消隐藏所有面片。
- 添加
- 使用 Color Ramp 控制对比度:
- 为了更精细地控制纹理的混合,我们在每个纹理源和
Mix Color节点之间插入Color Ramp节点。- 在
Musgrave Texture的Height输出和Mix Color节点的A输入之间添加一个Color Ramp节点 (Shift + A->Search->Color Ramp)。 - 在复制的
Gradient Texture的Color输出和Mix Color节点的B输入之间也添加一个Color Ramp节点。
- 在
- 通过拖动
Color Ramp上的黑色和白色滑块,可以调整各个纹理的对比度和影响范围。例如,将滑块向中间靠拢会增加对比度。 - 调整
Musgrave Texture的参数,例如Scale设为5.9,Detail设为2.335,以获得期望的噪点效果。
- 为了更精细地控制纹理的混合,我们在每个纹理源和
- 引入 Noise 纹理并进行第二次混合:
- 添加
Noise Texture节点 (Shift + A->Search->Noise Texture)。 - 同样为
Noise Texture添加Texture Coordinate和Mapping节点 (Ctrl + T),确保连接方式与 Musgrave 纹理类似。 - 添加一个新的
Mix Color节点,混合模式仍设为Linear Light。 - 添加一个新的
Color Ramp节点,将其连接在Noise Texture的Fac(或Color) 输出与新的Mix Color节点的A输入之间。 - 将上一个
Mix Color (Linear Light)节点的Result输出连接到这个新的Mix Color节点的B输入。 - 将这个最终的
Mix Color (Linear Light)节点的Result输出连接到Mix Shader节点的Fac输入 (替换掉之前Gradient Texture的连接)。 - 调整
Noise Texture的参数,例如Scale设为16,Detail设为10。同时调整其后的Color Ramp以达到理想的云朵边缘和内部细节。
- 添加
- 整理节点: 选中相关的纹理、Mapping、Color Ramp 和 Mix Color 节点,按
Ctrl + J将它们组织到一个帧 (Frame) 中。选中帧后,按N键打开侧边栏,在Node标签下可以为帧重命名(例如,Procedural Noise)并设置背景颜色,方便管理。将原始的球形渐变部分也整理成一个名为Spherical的帧。
步骤三: 添加颜色与基础光照响应
我们的云朵现在有了基本的形状和纹理,接下来将赋予它颜色,并使其能够响应场景中的光照。
- 为云朵上色:
- 在连接到
Mix Shader节点的Emission节点的Color输入端口前,添加一个Color Ramp节点。 - 将之前
Procedural Noise帧中最终输出的Mix Color (Linear Light)节点的Result连接到这个新的Color Ramp节点的Fac输入。 - 调整这个
Color Ramp的颜色:- 点击左侧滑块下方的颜色条,选择一个作为云朵暗部的颜色 (例如,视频中选择了一个略带灰的浅蓝色,十六进制码近似
#A2B8C6)。 - 点击右侧滑块下方的颜色条,选择一个作为云朵亮部的颜色 (例如,纯白色
#FFFFFF)。 - 你可以拖动滑块的位置来调整明暗过渡。
- 点击左侧滑块下方的颜色条,选择一个作为云朵暗部的颜色 (例如,视频中选择了一个略带灰的浅蓝色,十六进制码近似
- 在连接到
- 添加并调整场景光源:
- 切换回3D视图。
- 按下
Shift + A,选择Light->Sun,在场景中添加一个太阳光。 - 按下
R键旋转太阳光,调整其照射方向,使其能够照亮云朵。
- 使云朵响应光照:
- 返回
Shader Editor。 - 添加
Diffuse BSDF节点 (Shift + A->Search->Diffuse BSDF)。 - 添加
Shader to RGB节点 (Shift + A->Search->Shader to RGB)。 - 连接节点:
- 将
Diffuse BSDF节点的BSDF输出连接到Shader to RGB节点的Shader输入。 - 将
Shader to RGB节点的Color输出连接到控制Emission颜色的那个Color Ramp节点的Fac输入 (替换掉之前从程序化噪点接过来的连接)。
- 将
- 现在,云朵的颜色会根据
Diffuse BSDF接收到的光照强度(通过Shader to RGB转换)在Color Ramp定义的两种颜色间过渡,从而产生明暗变化。调整Color Ramp的滑块可以进一步控制这种明暗对比。
- 返回
步骤四: 创建程序化法线 (Procedural Normal)
为了让云朵表面看起来更具立体感和细节,我们将用节点创建程序化的法线信息,模拟凹凸效果,而无需使用外部的法线贴图。
- 理解法线信息: 法线贴图通过RGB颜色通道存储表面的方向信息,其中R、G、B通常对应局部坐标系下的X、Y、Z轴的扰动。
- 创建基础法线向量 (模拟切线空间):
- 添加
Separate XYZ节点。 - 添加
Texture Coordinate节点,将其UV输出连接到Separate XYZ节点的Vector输入。UV坐标提供了从0到1的二维渐变。 - 添加两个
Map Range节点,将UV的0-1范围映射到法线常用的-1到1范围:- 第一个
Map Range:Value输入连接Separate XYZ的X输出。设置From Min为0,From Max为1,To Min为-1,To Max为1。 - 第二个
Map Range:Value输入连接Separate XYZ的Y输出。设置参数同上。
- 第一个
- 添加
Combine XYZ节点。将第一个Map Range的Result连接到X输入,第二个Map Range的Result连接到Y输入。将Z输入值设为1(表示法线主要朝外)。
- 添加
- 添加凹凸细节 (Voronoi Texture):
- 添加
Voronoi Texture节点。 - 将其
Dimensions(维度) 设置为4D(允许通过W输入控制纹理演化)。 - 将其
Feature(特征) 输出从F1改为Smooth F1。 - 将
Randomness设为0.000,Smoothness设为1.000(视频中是调整这两个参数以获得想要的基础凹凸单元)。
- 添加
- 混合基础法线与凹凸细节:
- 添加一个
Vector Math节点,将其模式设置为Subtract(减法)。 - 将步骤2中
Combine XYZ节点的Vector输出 (基础法线方向) 连接到Subtract节点的第一个Vector输入。 - 将
Voronoi Texture节点的Position输出连接到Subtract节点的第二个Vector输入。
- 添加一个
- 控制凹凸的强度与范围:
- 为了更灵活地控制凹凸效果,在
Voronoi Texture的Position输出和Subtract节点的第二个输入之间,插入一个Mix节点 (Shift + A->Search->Mix,然后将Data Type改为Vector)。- 将基础法线方向 (来自步骤2的
Combine XYZ) 也连接到这个Mix节点的A输入。 - 将
Voronoi Texture的Position输出连接到Mix节点的B输入。 - 这个
Mix节点的Factor可以控制凹凸与基础法线的混合程度。视频中将其Factor设为接近0,意味着主要使用基础法线,并少量混合Voronoi的扰动。
- 将基础法线方向 (来自步骤2的
- 在
Mix节点的Result输出之后,再添加一个Map Range节点,确保Data Type仍为Vector。通过调整其To Min和To Max的XYZ值 (例如,都设为-0.4和0.4),可以限制法线扰动的整体范围。
- 为了更灵活地控制凹凸效果,在
- 应用法线信息:
- 添加
Normal Map节点 (Shift + A->Search->Normal Map)。 - 将上一部处理得到的最终向量 (来自
Map Range节点) 连接到Normal Map节点的Color输入。 - 将
Normal Map节点的Normal输出连接到场景中Diffuse BSDF节点的Normal输入。 - 可以调整
Normal Map节点的Strength(强度) 参数来控制凹凸的明显程度。
- 添加
- 整理节点: 将这一系列创建法线的节点组织到一个名为
Procedural Normal的帧中。
步骤五: 实现动态纹理与边缘细节
为了让云朵更生动,我们将使其纹理能够随着物体本身的移动或旋转而变化,并添加一些边缘细节。
- 使程序化噪点随物体移动而变化:
- 在
Procedural Noise节点组内,找到控制Musgrave Texture和Noise Texture的Mapping节点。 - 添加
Object Info节点 (Shift + A->Search->Object Info)。 - 在
Object Info节点中,点击吸管图标,然后在3D视图中选择我们的云朵平面物体。 - 将
Object Info节点的Location输出连接到Procedural Noise组内各个Mapping节点的Location输入。 - 为了减弱物体移动对纹理位置的剧烈影响,可以在
Object Info的Location输出和Mapping节点的Location输入之间各添加一个Math节点,模式设为Multiply(乘法),并将第二个Value输入设为一个较小的值 (例如0.050)。
- 在
- 使程序化法线随物体移动而变化:
- 类似地,在
Procedural Normal节点组内,找到Voronoi Texture。如果其Vector输入未连接,可以复制 (Shift+D) 上一步的Object Info和Multiply节点组合,将Multiply的结果连接到Voronoi Texture的Vector输入。或者,如果Voronoi Texture使用了Mapping节点,则连接到Mapping节点的Location输入。 - 这样,当云朵物体移动时,其法线产生的凹凸细节也会随之变化。
- 类似地,在
步骤六: 添加额外光照细节 (Extra Light)
吉卜力动画中的云朵常常在特定区域有微妙的额外光照,我们可以通过引用一个空物体的位置来模拟这种效果。
- 创建空物体 (Empty Object):
- 返回3D视图,按下
Shift + A,选择Empty->Plain Axes(或任何其他类型的空物体)。 - 使用
G键移动这个空物体到你希望产生额外光照效果的参考位置。
- 返回3D视图,按下
- 在 Shader Editor 中设置额外光照:
- 复制 (
Shift + D)Procedural Noise节点组中那组基础的球形渐变节点 (包含Texture Coordinate,Mapping, 和Gradient Texture)。 - 在复制出来的
Texture Coordinate节点中,将Object输入的目标更改为刚刚创建的Empty物体。 - 添加一个新的
Mix Color节点。 - 连接:
- 将这个新的、基于
Empty物体位置的Gradient Texture(Spherical) 的Color输出连接到Mix Color节点的Factor输入。 - 将之前云朵的基础颜色 (来自
Diffuse BSDF->Shader to RGB->Color Ramp的最终结果) 连接到Mix Color节点的A输入。 - 在
Mix Color节点的B输入上设置一个更亮的颜色,作为额外光照的颜色 (例如,浅黄色或更亮的白色)。
- 将这个新的、基于
- 将这个
Mix Color节点的Result输出连接到主Emission节点的Color输入 (替换掉原来的连接)。 - 在连接到
Mix Color节点B输入的亮色之前,可以添加一个Hue Saturation Value节点 (Shift + A->Search->Hue Saturation Value),用它来调整额外光照的色相、饱和度和亮度。 - 调整
Mix Color节点的混合模式 (例如,尝试Add或Screen模式,或者保持Mix并调整Factor) 和Factor值,直到获得满意的额外光照效果。
- 复制 (
- 整理节点: 将这组与额外光照相关的节点组织到一个名为
Extra Light的帧中。
至此,我们已经构建了一个相当复杂的程序化吉卜力风格云朵着色器!你可以尝试调整各个 Color Ramp、纹理参数 (Scale, Detail, Randomness 等)、Mix Color 节点的 Factor 值以及 Normal Map 的强度,来定制出你独一无二的云朵效果。
总结
在本教程中,我们从零开始,在 Blender 中一步步创建了一个完全程序化的吉卜力风格3D云朵着色器。我们学习了如何利用多层平面和透明度来模拟体积感,如何通过混合多种程序化纹理来塑造云朵的复杂形态和边缘细节,如何创建程序化法线来增加表面质感,并最终让云朵对光照和物体位置产生动态响应。
这个着色器的强大之处在于其完全的程序化特性,意味着你可以轻松调整参数,创造出各式各样的云朵,而无需依赖任何外部图片资源。
下一步探索:
- 性能优化 (EEVEE): 视频中提到,当前在EEVEE渲染器中,由于Alpha Hashed的特性,云朵可能会显得有些噪点。在后续的教程中,可能会探讨如何优化以获得更平滑的效果。
- 更多控制: 可以将关键参数(如各种纹理的Scale、Detail,颜色等)连接到节点组的输入端,从而在修改器属性面板或几何节点中更方便地控制云朵的整体外观。
- 动画: 利用
4D纹理的W输入或驱动器 (Drivers) 来让云朵的形态随时间动态变化。
希望本教程能帮助你掌握在 Blender 中创建风格化程序化材质的技巧!不断尝试和探索,你会发现节点编辑的无限可能。