17.噪声-制作纹理-柏林噪声纹理生成工具
17.1 知识点
什么是柏林噪声纹理生成工具?
在过去,我们可能会使用 Photoshop 制作最简单的噪声纹理,而 Unity 提供了 Mathf.PerlinNoise
方法,使我们可以利用代码来生成柏林噪声纹理,并将噪声数据存储到图片中。这种方式不仅更加灵活,还能动态生成不同参数的噪声纹理。
制作编辑器拓展 UI 界面
创建工具窗口与生成纹理按钮
/// <summary>
/// 柏林噪声纹理生成编辑器工具
/// 功能:创建可配置参数的柏林噪声灰度纹理并保存为 PNG
/// </summary>
public class PerlinNoiseTextureTool : EditorWindow
{
/// <summary>
/// 在 Unity 菜单栏注册工具入口
/// 路径:柏林噪声纹理生成工具/打开
/// </summary>
[MenuItem("柏林噪声纹理生成工具/打开")]
public static void ShowWindow()
{
// 创建浮动窗口实例
GetWindow<PerlinNoiseTextureTool>("柏林噪声纹理生成工具");
}
}
配置可调参数
// ---------------------- 配置参数 ----------------------
[Header("纹理尺寸配置")] [Tooltip("生成纹理的宽度(像素)")]
private int textureWidth = 512;
[Tooltip("生成纹理的高度(像素)")]
private int textureHeight = 512;
[Header("噪声参数")] [Tooltip("噪声缩放系数,值越大噪声细节越密集")]
private int scale = 20;
[Header("输出配置")] [Tooltip("生成纹理的文件名(无需扩展名)")]
private string textureName = "PerlinNoiseTexture";
绘制编辑器界面与生成按钮
// ---------------------- 界面绘制 ----------------------
private void OnGUI()
{
// 界面标题
GUILayout.Label("柏林噪声纹理设置", EditorStyles.boldLabel);
// 参数输入区域
textureWidth = EditorGUILayout.IntField("纹理宽", textureWidth);
textureHeight = EditorGUILayout.IntField("纹理高", textureHeight);
scale = EditorGUILayout.IntField("缩放", scale);
textureName = EditorGUILayout.TextField("纹理名", textureName);
// 生成按钮
if (GUILayout.Button("生成柏林噪声纹理"))
{
// ---------------------- 核心生成逻辑 ----------------------
// ---------------------- 文件保存操作 ----------------------
}
}
Mathf.PerlinNoise
的作用
// float Mathf.PerlinNoise(float x, float y)
该函数是 Unity 提供的用于生成 Perlin Noise 的方法,主要用于生成平滑、连续的伪随机值,常用于:
- 纹理生成
- 地形生成
- 动画与特效等需要平滑过渡的场景
参数解析:
x, y
:二维坐标点,表示柏林噪声空间中的位置- 返回值:一个
0~1
之间的浮点数,且相邻输入值对应的输出值是平滑过渡的
生成柏林噪声纹理图片
核心生成逻辑
// 创建空白纹理
Texture2D texture = new Texture2D(textureWidth, textureHeight);
// 遍历所有像素点
for (int y = 0; y < textureHeight; y++)
{
for (int x = 0; x < textureWidth; x++)
{
/* 柏林噪声采样逻辑:
* 1. 将像素坐标归一化到 [0,1] 范围
* 2. 乘以缩放系数得到采样坐标
* - 缩放系数越大,噪声纹理越不平滑
* - 通过缩放系数可以控制噪声图的平滑程度
* 3. 获取 [0,1] 范围的噪声值
*/
float xCoord = (float)x / textureWidth * scale;
float yCoord = (float)y / textureHeight * scale;
float noiseValue = Mathf.PerlinNoise(xCoord, yCoord);
// 将噪声值写入颜色通道(RGB 相同值生成灰度图)
texture.SetPixel(x, y, new Color(noiseValue, noiseValue, noiseValue));
}
}
// 应用纹理修改
texture.Apply();
保存柏林噪声纹理文件
// 组合保存路径:Assets 目录下,添加 .png 扩展名
string savePath = $"Assets/{textureName}.png";
// 将纹理编码为 PNG 字节流
byte[] pngData = texture.EncodeToPNG();
// 写入文件系统
File.WriteAllBytes(savePath, pngData);
// 刷新资源数据库,使新文件立即可见
AssetDatabase.Refresh();
// 用户反馈弹窗
EditorUtility.DisplayDialog("操作完成",
$"噪声纹理已保存至:{savePath}",
"确定");
生成纹理测试
- 缩放系数影响:通过调整缩放系数,可以控制生成噪声纹理的平滑程度
- 缩放系数大:噪声图更粗糙
- 缩放系数小:噪声图更平滑
生成的噪声纹理可以用于各种场景,如材质贴图、地形高度图、特效遮罩等。
17.2 知识点代码
PerlinNoiseTextureTool.cs
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
/// <summary>
/// 柏林噪声纹理生成编辑器工具
/// 功能:创建可配置参数的柏林噪声灰度纹理并保存为PNG
/// </summary>
public class PerlinNoiseTextureTool : EditorWindow
{
// ---------------------- 配置参数 ----------------------
[Header("纹理尺寸配置")] [Tooltip("生成纹理的宽度(像素)")]
private int textureWidth = 512;
[Tooltip("生成纹理的高度(像素)")] private int textureHeight = 512;
[Header("噪声参数")] [Tooltip("噪声缩放系数,值越大噪声细节越密集")]
private int scale = 20;
[Header("输出配置")] [Tooltip("生成纹理的文件名(无需扩展名)")]
private string textureName = "PerlinNoiseTexture";
// ---------------------- 编辑器界面入口 ----------------------
/// <summary>
/// 在Unity菜单栏注册工具入口
/// 路径:柏林噪声纹理生成工具/打开
/// </summary>
[MenuItem("柏林噪声纹理生成工具/打开")]
public static void ShowWindow()
{
// 创建浮动窗口实例
GetWindow<PerlinNoiseTextureTool>("柏林噪声纹理生成工具");
}
// ---------------------- 界面绘制 ----------------------
private void OnGUI()
{
// 界面标题
GUILayout.Label("柏林噪声纹理设置", EditorStyles.boldLabel);
// 参数输入区域
textureWidth = EditorGUILayout.IntField("纹理宽", textureWidth);
textureHeight = EditorGUILayout.IntField("纹理高", textureHeight);
scale = EditorGUILayout.IntField("缩放", scale);
textureName = EditorGUILayout.TextField("纹理名", textureName);
// 生成按钮
if (GUILayout.Button("生成柏林噪声纹理"))
{
// ---------------------- 核心生成逻辑 ----------------------
// 创建空白纹理
Texture2D texture = new Texture2D(textureWidth, textureHeight);
// 遍历所有像素点
for (int y = 0; y < textureHeight; y++)
{
for (int x = 0; x < textureWidth; x++)
{
/* 柏林噪声采样逻辑:
* 1. 将像素坐标归一化到[0,1]范围
* 2. 乘以缩放系数得到采样坐标 缩放系数越大 会越不平滑 通过缩放系数可以控制生成出来的噪声图的平滑程度
* 3. 获得[0,1]范围的噪声值
*/
float xCoord = (float)x / textureWidth * scale;
float yCoord = (float)y / textureHeight * scale;
float noiseValue = Mathf.PerlinNoise(xCoord, yCoord);
// 将噪声值写入颜色通道(RGB相同值生成灰度图)
texture.SetPixel(x, y, new Color(noiseValue, noiseValue, noiseValue));
}
}
// 应用纹理修改
texture.Apply();
// ---------------------- 文件保存操作 ----------------------
// 组合保存路径:Assets目录下,添加.png扩展名
string savePath = $"Assets/{textureName}.png";
// 将纹理编码为PNG字节流
byte[] pngData = texture.EncodeToPNG();
// 写入文件系统
File.WriteAllBytes(savePath, pngData);
// 刷新资源数据库使新文件立即可见
AssetDatabase.Refresh();
// 用户反馈弹窗
EditorUtility.DisplayDialog("操作完成",
$"噪声纹理已保存至:{savePath}",
"确定");
}
}
}
Lesson17_噪声_制作纹理_柏林噪声纹理生成工具.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson17_噪声_制作纹理_柏林噪声纹理生成工具 : MonoBehaviour
{
void Start()
{
#region 知识点一 柏林噪声纹理生成工具是什么?
//之前是使用PS制作了最简单的噪声纹理
//而我们将要讲解的柏林噪声纹理生成工具
//就是利用Unity提供给我们的Mathf.PerlinNoise方法
//将噪声数据存储在图片中的工具
//我们利用程序代码去生成柏林噪声纹理
#endregion
#region 知识点二 制作编辑器拓展UI界面
#endregion
#region 知识点三 Mathf.PerlinNoise的作用
//float Mathf.PerlinNoise(float x, float y)
//该函数是 Unity 提供的一个用于生成 Perlin Noise 的函数,
//主要用于生成平滑、连续的伪随机值。
//它广泛应用于纹理生成、地形生成、动画和特效等需要平滑过渡的场景
//传入的两个参数是二维坐标点,通常用于表示柏林噪声空间中的位置
//返回值为一个浮点数,范围为0~1之间
//返回的噪声值具有连续性,即相邻输入值对应的输出值是平滑过渡的
#endregion
#region 知识点四 利用该函数生成柏林噪声纹理图片
#endregion
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com