unityshader 噪声

参考

理论参考
实践参考

学习

perlin噪声

在这里插入图片描述

Shader "Unlit/GenerateNoise"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            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;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
           
           float random (float2 st) {
               return frac(sin(dot(st.xy,float2(12.9898,78.233)))*43758.5453123);
           }
           // 散列函数(哈希值)
           float hash(float n) {
               return frac(sin(n) * 1e4);
           }
           
           //为每个晶格的顶点设置一个“伪随机”的梯度向量
           	fixed2 randVec(fixed2 value)
           	{
           		fixed2 vec = fixed2(dot(value, fixed2(127.1, 337.1)), dot(value, fixed2(269.5, 183.3)));
           		vec = -1 + 2 * frac(sin(vec) * 43758.5453123);
           		return vec;
           	}
 
           float perlinNoise(float2 uv)
           {
           //计算该点到各个晶格顶点的距离向量,再分别与顶点上的梯度向量做点乘
           	float a, b, c, d;
           	float x0 = floor(uv.x); 
           	float x1 = ceil(uv.x); 
           	float y0 = floor(uv.y); 
           	float y1 = ceil(uv.y); 
           	fixed2 pos = frac(uv);
           	a = dot(randVec(fixed2(x0, y0)), pos - fixed2(0, 0));
           	b = dot(randVec(fixed2(x0, y1)), pos - fixed2(0, 1));
           	c = dot(randVec(fixed2(x1, y1)), pos - fixed2(1, 1));
           	d = dot(randVec(fixed2(x1, y0)), pos - fixed2(1, 0));
           	
           	//使用缓和曲线(ease curves)来计算它们的权重和 
           	float2 st = 6 * pow(pos, 5) - 15 * pow(pos, 4) + 10 * pow(pos, 3);
           	a = lerp(a, d, st.x);
           	b = lerp(b, c, st.x);
           	a = lerp(a, b, st.y);
           	return a;
           }
           //叠加形成分型噪声 noise(p)+1/2noise(2p)+1/4noise(4p) 即每一次噪声的采样频率翻倍,而振幅减少一倍。
           float fbm(float2 uv)
           {
           	float f = 0;
           	float a = 1;
           	for(int i = 0; i < 3; i++)
           	{
           		f += a * perlinNoise(uv);
           		uv *= 2;
           		a /= 2;
           	}
           	return f;
           }
            //把x的值从原本的t1~t2范围映射到 s1~s2范围
            half remap(half x, half t1, half t2, half s1, half s2)
            {
                return (x - t1) / (t2 - t1) * (s2 - s1) + s1;
            }
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
               int density=90;
               float v=fbm(i.uv*density);
               if(v>0.3)
               {
               v=remap(v,0,1,0.7,1);
               }
               return saturate(v);
            }
            ENDCG
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值