unity中噪声函数和应用

博客介绍了在Unity中不同噪声图的效果及实现。涉及白噪声,使用frac函数返回小数部分;柏林噪声,通过smoothStep函数及双线性插值实现;还给出分形布朗运动代码。最后提到将高度雾与噪声结合实现流动的雾,强调要动手输出效果并结合代码分析。

关于下面的噪声图,一定要自己动手输出每张图的效果,结合代码分析图的效果。
1.白噪声WhiteNoise
主要是用到 frac函数,此函数主要是 返回小数部分
{小注: frac(10x) 和 frac(100x)的区别}

在这里插入图片描述

            // 白噪声
            float whiteNoise(float2 uv,int seed)
            {
   
   
                float r = frac(sin(dot(uv,float2(seed + 12.9898,seed + 78.233)))*43758.5453);
                return r;
            }

2.柏林噪声perlinNoise
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述下面是smoothStep的函数用代码来表达的形式:
重点:t = t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f);

            // smooth interpolation for perlin noise
            float SmoothLerp(float min, float max, float t)
            {
   
   
                t = t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f);
                return min + t * (max - min);
            }

在这里插入图片描述

“双线性插值”:
(1)在水平方向上插值X1
(1)在水平方向上插值X2
(1)在将X1和X2在竖直方向上插值得到结果

// 当w为0时,返回a,当w为1时返回b,否则返回a与b的插值
float lerp(float a, float b, float w) {
   
   
   return a + w*(b-a);
} 

3.分形布朗运动
在这里插入图片描述在这里插入图片描述

下面给出代码:包括白噪声,柏林噪声,用分形布朗运动对柏林噪声进行处理:
高度雾 + 噪声–>流动的雾:
在这里插入图片描述

Shader "custom/fog"
{
   
   
    Properties
    {
   
   
        _MainTex ("Texture", 2D) = "white" {
   
   }
        _FogXSpeed("_fogXSpeed",range(0,0.5)) = 0.01
        _FogYSpeed("_fogYSpeed",range(0,0.5)) = 0.03
    }
    SubShader
    {
   
   
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
   
   
            Tags {
   
    "RenderType"="Opaque" }
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
   
   
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };


            struct v2f
            {
   
   
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                float4 scrProj : TEXCOORD1;
                float2 uv_depth : TEXCOORD2;
                float4 interpolatedRay : TEXCOORD3;
            };

            sampler2D _MainTex;
            half4 _MainTex_TexelSize;
            sampler2D _CameraDepthTexture;
            float4x4 _FrustumCornersRay;

            float4 _FogColor;
            float _FogDensity;
            float _FogStart;
            float _FogEnd;
            float _FogXSpeed;
            float _FogYSpeed;

            // 白噪声
            float whiteNoise(int seed, int i, int j)
            {
   
   
                //return  frac(sin(dot(float2(i,cos(j)),float2(seed+12.9898,seed + 78.233)))*43758.5453);
                return frac(
                    sin(dot(float2(i, cos(j)), 
LibNoise分形噪声函数库的JAVA翻译版,个人开发,仅供参考。 包中包含: 异常模块: noise.Exception noise.ExceptionInvalidParam 无效的参数异常。 noise.ExceptionNoModule 无模块异常,无法检索到该源模块 noise.ExceptionOutOfMemory noise.ExceptionUnknown 模型模块: noise.model.Line 线 noise.model.Plane 平面 noise.model.Sphere 球体 noise.model.Cylinder 圆柱 发生器模块: noise.module.Perlin 培林噪声 noise.module.RidgedMulti 脊多重分形噪声 noise.module.Billow 巨浪 value = |perlin_value|*2-1.0; noise.module.Voronoi 细胞噪声,Voronoi图 noise.module.Const 常量 value = const; noise.module.Cylinders 圆柱 noise.module.Checkerboard 棋盘格 value = (floor(x) & 1 ^ floor(y) & 1 ^ floor(z) & 1) != 0 ? -1.0 : 1.0; noise.module.Spheres 球体 选择器模块: noise.module.Select 选择 noise.module.Blend 混合 value = ((1.0 - (modules[3].value+1)/2) * modules[0].value) + ((modules[3].value+1)/2 * modules[1].value); 修饰器模块: noise.module.Invert 倒置 value = -value; noise.module.Abs 绝对值 value = |value|; noise.module.Clamp 截取 value = (value < lowerBound ?lowerBound : value) or (value > upperBound ?upperBound : value);lowerBound:下截取值;upperBound:上截取值 noise.module.Curve 曲线 value = noise.module.Curve.ControlPoint 控制点 noise.module.ScaleBias 偏移缩放, value = value*scale+offset noise.module.Turbulence 湍流 value = modules[0].getValue(x+modules[1].value * power,y+modules[2].value * power,z+modules[3].value * power); noise.module.Exponent 指数 value = (pow(abs((value + 1.0) / 2.0), exponent) * 2.0 - 1.0); 组合模块: noise.module.Add 添加 value = modules[0].value+modules[1].value; noise.module.Max 最大值 value = max(value); noise.module.Min 最小值 value = min(value); noise.module.Multiply 乘法 value = modules[0].value * modules[1].value; noise.module.Power 权重 value = pow(modules[0].value , modules[1].value); 变压模块: noise.module.Displace 位移替换,扭曲 value = modules[0].getValue(x+modules[1].value,y+modules[2].value,z+modules[3].value); noise.module.RotatePoint 点旋转 noise.module.ScalePoint 点缩放,轴缩放 value = modules[0].getValue (x * xScale, y * yScale,z * zScale); noise.module.Terrace 露台,梯台 noise.module.TranslatePoint 位移变换 value = modules[0].getValue (x * xTranslation, y * yTranslation,z * zTranslation); 其他: noise.module.Cache 缓存 value = noise.module.Module 噪声模块基类 如果发现有要更改的地方,请发邮件给我,或者本人QQ:343179390,欢迎技术探讨
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值