17.柏林噪声纹理生成工具

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

×

喜欢就点赞,疼爱就打赏