当前位置: 首页 > news >正文

Unity噪声图生成(编辑器扩展)

最近发现项目里很多shader都需要噪声图,(shadergraph中有自己的噪声图生成)当遇到需要噪声图时去寻找很麻烦,所以从网上查阅资料编写了一个Unity扩展的噪声图生成。

Perlin噪声

Perlin噪声是一种渐变噪声算法,由Ken Perlin于1983年发明,用于在计算机图形学中生成具有连续和平滑变化的随机纹理。它常用于模拟自然形状,例如山脉、云层、水波等,也可以用于增加纹理的细节和真实感。

Perlin噪声的生成过程如下:
将空间分割成一系列规则的网格单元(通常是正方形或立方体)。

在每个网格单元的顶点位置上随机生成一个梯度向量(通常是二维或三维的)。

对于每个空间点,计算它在网格单元内的位置,并根据梯度向量和位置计算其与网格顶点之间的插值。插值可以使用不同的方法,如线性插值、立方插值等。

将不同网格单元的插值值加权相加,得到最终的Perlin噪声值。
Unity中有可用的数学库

Mathf.PerlinNoise(xCoord, yCoord)

他使用一个二维的随机向量代替了原来的随机值,让各个点之间产生一定的梯度变换,使生成的噪声图几乎感觉不到明显的块状感。
在这里插入图片描述

直接调用即可

Simple噪声

简单噪声(Simple Noise),也称为Value Noise,是一种较为简单的噪声算法。它与Perlin噪声相比较简单,不涉及梯度向量的计算,而是在离散的网格点上生成随机值,然后使用插值算法来获得介于这些随机值之间的噪声值。

简单噪声的生成过程如下:

将空间分割成一系列规则的网格单元(通常是正方形或立方体)。

在每个网格单元的顶点位置上随机生成一个随机值(通常在0到1之间)。

对于每个空间点,计算它在网格单元内的位置,并根据顶点的随机值进行插值。插值可以使用不同的方法,如线性插值、立方插值等。

得到该点的噪声值,作为简单噪声纹理的一部分。

简单噪声相比Perlin噪声计算较快,因为它不需要复杂的梯度计算。然而,简单噪声在生成的纹理中可能会显示出较明显的棱角和分割线,这是因为插值的方式相对简单,造成噪声的变化不够平滑。

   //线性差值 1接近Y 0接近Xfloat mix(float x, float y, float level){return x * (1 - level) + y * level;}float value_noise(Vector2 coord){Vector2 i = floor(coord);Vector2 f = fract(coord);// 4 corners of a rectangle surrounding our pointfloat tl = rand(i);float tr = rand(i + new Vector2(1.0f, 0.0f));float bl = rand(i + new Vector2(0.0f, 1.0f));float br = rand(i + new Vector2(1.0f, 1.0f));Vector2 cubic = f * f * (new Vector2(3.0f, 3.0f) - 2.0f * f);float topmix = mix(tl, tr, cubic.x);float botmix = mix(bl, br, cubic.x);float wholemix = mix(topmix, botmix, cubic.y);return wholemix;}

“状块感”
在这里插入图片描述

Cellular Noise(细胞噪声)

是一种模拟细胞结构的噪声生成算法。它在计算机图形学和游戏开发中被广泛应用于生成具有细小颗粒、斑点、孔洞和均匀分布的纹理。细胞噪声的原理是将空间划分为许多规则或不规则的细胞,并在每个细胞中随机生成一个点,然后计算其他点到最近点的距离。这些距离被用来生成噪声图。

细胞噪声的生成过程如下:

将空间分割为一系列规则或不规则的细胞。

在每个细胞中随机生成一个点,称为“特征点”(Feature Point)。

对于每个空间点,计算它到最近的特征点的距离。通常使用欧氏距离或曼哈顿距离等来计算距离。

可以根据距离来生成噪声值,例如使用距离的倒数或距离的逆平方等函数来计算噪声值。

细胞噪声常用于模拟斑点状纹理、分布均匀的粒子、皮肤纹理、地形等效果。它可以生成有机感和自然感的纹理,因为它基于类似于细胞的结构,而不是简单的随机值。细胞噪声在游戏开发和计算机图形学中是非常有用的工具,可以用于增强视觉效果和增加纹理的复杂性。

float cellular_noise(Vector2 coord){Vector2 i = floor(coord);Vector2 f = fract(coord);float min_dist = 99999.0f;// going through the current tile and the tiles surrounding itfor (float x = -1.0f; x <= 1.0; x++){for (float y = -1.0f; y <= 1.0; y++){// generate a random point in each tile,// but also account for whether it's a farther, neighbouring tileVector2 node = rand2(i + new Vector2(x, y)) + new Vector2(x, y);// check for distance to the point in that tile// decide whether it's the minimumfloat dist = Mathf.Sqrt((f - node).x * (f - node).x + (f - node).y * (f - node).y);min_dist = Mathf.Min(min_dist, dist);}}return min_dist;}

细胞
在这里插入图片描述

随机用的伪随机生成,后续贴出全部代码

FBM

分形布朗运动噪声,是一种基于分形技术的噪声生成算法。它通过多次叠加不同频率和幅度的噪声图层来生成复杂的纹理效果。FBM噪声常用于生成具有细节层次的纹理,如云朵、火焰、波浪等效果。

FBM噪声的生成过程如下:

将空间分割为一系列规则或不规则的网格单元(通常是正方形或立方体)。

在每个网格单元的顶点位置上随机生成一个噪声值(通常在0到1之间)。

对于每个空间点,计算它在网格单元内的位置,并根据顶点的噪声值进行插值。插值可以使用不同的方法,如线性插值、立方插值等。

将不同网格单元的插值值加权相加,并乘以一个缩放因子,得到最终的FBM噪声值。

FBM噪声的特点是可以通过调整不同图层的频率和幅度来控制纹理的细节和粗糙程度。通过增加图层的数量和缩放因子,可以使纹理呈现出更加复杂和自然的效果。FBM噪声可以模拟自然界中的许多复杂的现象,使得生成的纹理具有更加真实和细致的外观。

loat fbm(Vector2 coord){int OCTAVES = 4;float normalize_factor = 0.0f;float value = 0.0f;float scale = 0.5f;for (int i = 0; i < OCTAVES; i++){value += Mathf.PerlinNoise(coord.x, coord.y) * scale;normalize_factor += scale;coord *= 2.0f;scale *= 0.5f;}return value / normalize_factor;}

FBM噪声通过多次叠加不同频率的Perlin噪声图层来生成,因此可以生成更加复杂和多样化的纹理,具有更丰富的细节层次。
多次Perlin
在这里插入图片描述
用到的一些数学库

  Vector2 mod(Vector2 coord, float a){return new Vector2(coord.x % a, coord.y % a);}float fract(float x){return x - Mathf.Floor(x);}Vector2 fract(Vector2 x){return new Vector2(x.x - Mathf.Floor(x.x), x.y - Mathf.Floor(x.y));}Vector2 floor(Vector2 x){return new Vector2(Mathf.Floor(x.x), Mathf.Floor(x.y));}float rand(Vector2 coord){// prevents randomness decreasing from coordinates too largecoord = mod(coord, 10000.0f);// returns "random" float between 0 and 1return fract(Mathf.Sin(Vector2.Dot(coord, new Vector2(12.9898f, 78.233f))) * 43758.5453f);}//线性差值 1接近Y 0接近Xfloat mix(float x, float y, float level){return x * (1 - level) + y * level;}Vector2 rand2(Vector2 coord){// prevents randomness decreasing from coordinates too largecoord = mod(coord, 10000.0f);// returns "random" vec2 with x and y between 0 and 1return fract((new Vector2(Mathf.Sin(Vector2.Dot(coord, new Vector2(127.1f, 311.7f))), Mathf.Sin(Vector2.Dot(coord, new Vector2(269.5f, 183.3f))))) * 43758.5453f);}

取模运算,取小数部分,取整数部分,伪随机代码
自己来实现一个随机函数,并且这个随机函数是 ”可控的“ ,相同的输入要得到相同的输出。

 void SaveTexture(Texture2D texture){byte[] bytes = texture.EncodeToPNG();//读取图像为PNGvar dirPath = Application.dataPath + "/" + AssetsName + "/";//当前文件夹路径Debug.Log("生成路径:" + dirPath);//生成路径位置if (!Directory.Exists(dirPath)){Directory.CreateDirectory(dirPath);//没有路径则生成}for (int i = 0; i < 1000; i++){if (!File.Exists(dirPath + "Image" + "(" + i + ")" + ".png")){File.WriteAllBytes(dirPath + "Image" + "(" + i + ")" + ".png", bytes);//写入文件里面break;}}}Texture2D GenerateTexture(){Texture2D texture = new Texture2D(width, height);//新建贴图for (int x = 0; x < width; x++){for (int y = 0; y < height; y++){Color color = CalculateColor(x, y);//计算颜色,遍历像素texture.SetPixel(x, y, color);//设置像素颜色}}texture.Apply();//应用贴图修改return texture;}

图像文件保存

一些参考材料

Unity实现噪声图(Perlin Noise)的制作
使用Unity生成各类型噪声图的分享
FBM分形布朗运动
噪声函数的基本生成方式
后续我会上传.cs文件
点击此次下载

相关文章:

Unity噪声图生成(编辑器扩展)

最近发现项目里很多shader都需要噪声图&#xff0c;&#xff08;shadergraph中有自己的噪声图生成&#xff09;当遇到需要噪声图时去寻找很麻烦&#xff0c;所以从网上查阅资料编写了一个Unity扩展的噪声图生成。 Perlin噪声 Perlin噪声是一种渐变噪声算法&#xff0c;由Ken …...

http-为什么文件上传要转成Base64

# 前言 最近在开发中遇到文件上传采用Base64的方式上传&#xff0c;记得以前刚开始学http上传文件的时候&#xff0c;都是通过content-type为multipart/form-data方式直接上传二进制文件&#xff0c;我们知道都通过网络传输最终只能传输二进制流&#xff0c;所以毫无疑问他们本…...

htmlCSS-----定位

目录 前言 定位 分类和取值 定位的取值 1.相对定位 2.绝对位置 元素居中操作 3.固定定位 前言 今天我们来学习html&CSS中的元素的定位&#xff0c;通过元素的定位我们可以去更好的将盒子放到我们想要的位置&#xff0c;下面就一起来看看吧&#xff01; 定位 定位posi…...

腾讯云大数据型CVM服务器实例D3和D2处理器CPU型号说明

腾讯云服务器CVM大数据型D3和D2处理器型号&#xff0c;大数据型D3云服务器CPU采用2.5GHz Intel Xeon Cascade Lake 处理器&#xff0c;大数据型D2云服务器CPU采用2.4GHz Intel Xeon Skylake 6148 处理器。腾讯云服务器网分享云服务器CVM大数据型CPU型号、处理器主频性能&#x…...

计算机科学cs/电子信息ei面试准备——数学基础/线性代数复习

1. 中值定理 中值定理是反映函数与导数之间联系的重要定理&#xff0c;也是微积分学的理论基础&#xff0c;在许多方面它都有重要的作用&#xff0c;在进行一些公式推导与定理证明中都有很多应用。中值定理是由众多定理共同构建的&#xff0c;其中拉格朗日中值定理是核心&…...

极速查找(2)-算法分析

篇前小言 本篇文章是对查找&#xff08;1&#xff09;的续讲线性索引查找 线性索引查找&#xff08;Linear Index Search&#xff09;是一种基于索引的查找算法。它在数据集合中创建一个索引 结构&#xff0c;然后使用该索引结构来加快对目标元素的查找。 线性索引是一种在数…...

flask路由添加参数

flask路由添加参数 在 Flask 中&#xff0c;可以通过两种方式在路由中添加参数&#xff1a;在路由字符串中直接指定参数&#xff0c;或者通过 request 对象从请求中获取参数。 在路由字符串中指定参数&#xff1a;可以将参数直接包含在路由字符串中。参数可以是字符串、整数、…...

网络安全系统教程+学习路线(自学笔记)

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…...

23. 合并 K 个升序链表

题目描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组…...

Nexus3部署、配置+SpringBoot项目Demo

Docker部署Nexus 搜索Nexus3镜像&#xff1a;[rootlocalhost ~]# docker search nexus 拉取Nexus3镜像&#xff1a;[rootlocalhost ~]# docker pull sonatype/nexus3 启动Nexus3前查看虚拟机端口是否被占用&#xff1a;[rootlocalhost ~]# netstat -nultp 通过Docker Hub查看安…...

linux下用docker安装mysql

1.mysql Docker镜像 docker pull mysql:[版本号 或 latest]例&#xff1a;docker pull mysql:5.7 2.查看拉取的docker镜像 docker images3.设置 Docker 卷 docker volume create mysql-data列出 Docker 已知的所有卷 docker volume ls4.运行一个 MySQL Docker 容器 docke…...

Vue - 可视化用户角色、菜单权限、按钮权限配置(动态获取菜单路由)

GitHub Demo 地址 在线预览 前言 关于动态获取路由已在这里给出方案 Vue - vue-admin-template模板项目改造&#xff1a;动态获取菜单路由 这里是在此基础上添加了系统管理模块&#xff0c;包含用户管理&#xff0c;角色管理&#xff0c;菜单管理&#xff0c;字典管理&#xf…...

hive库操作示例

hive库操作示例 1、常规表 创建数据库 CREATE DATABASE mydatabase;使用数据库 USE mydatabase;创建表 CREATE TABLE mytable (id INT,name STRING,age INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE;插入数据 INSERT INTO TABLE mytable VALUE…...

LeetCode第 N 个泰波那契数 (认识动态规划)

认识动态规划 编写代码代码空间优化 链接: 第 N 个泰波那契数 编写代码 class Solution { public:int tribonacci(int n) {if(n 0){return 0;}else{if(n 1 || n 2)return 1;}vector<int> dp(n 1);dp[0] 0;dp[1] 1;dp[2] 1;for(int i 3;i < n;i){dp[i] dp[i-3]…...

线程安全问题(内存可见性)

导致的原因 内存可见性问题的出现主要是因为编译器优化多线程导致的 示例代码 package 线程安全问题;import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: wuyulin* Date: 2023-07-26* Time: 13:49*/ public class Demo2 {private volatile sta…...

STM32MX配置EEPROM(AT24C02)------保姆级教程

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子&#xff0c;使用STM32CUBEMX做了很多驱动&#x…...

微信小程序 样式和全局配置

WXSS wxss 把屏幕分为750个物理像素&#xff0c;大屏大&#xff0c;小屏小&#xff0c;随着设备不一致自动适配 推荐使用iPhone6作为标准&#xff0c;1个rpx 0.5个px&#xff0c;把px乘以2就是rpx的参数 import 导入外部样式表 import /common/common.wxss 样式 权重一…...

一.初识C语言

一.初识C语言 C语言标准规定&#xff1a; sizeof(long)>sizeof(int)就可以了变量要定义在当前代码块的最前面 #defin _CRT_SECURE_NO_WARNINGS 1#include <stdio.h> //包含一个stdio.h的文件 std-标准standard input outputint main() //主函数-程序的入口-main函数…...

filebeat到kafka示例

docker run -d \ --namefilebeat_7.14_0 \ #filebeat名称 --userroot \ --volume"/data/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml" \ #映射filebeat.yml配置 --volume"/data/filebeat/log:/usr/share/filebeat/log" \…...

AlmaLinux系统下的Zabbix汉化

我安装的是zabbix下的虚拟机&#xff0c;安装完成后&#xff0c;直接可以打开网站了&#xff0c;但是界面是英文&#xff0c;看了设置&#xff0c;没有中文选项&#xff0c;就需要在系统中安装中文字符集了。 # locale -a #查看里面没有zh_CN之类的项 # dnf install -…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

leetcode73-矩阵置零

leetcode 73 思路 记录 0 元素的位置&#xff1a;遍历整个矩阵&#xff0c;找出所有值为 0 的元素&#xff0c;并将它们的坐标记录在数组zeroPosition中置零操作&#xff1a;遍历记录的所有 0 元素位置&#xff0c;将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...