Unity Shader学习:噪声noise
perlin,value,simplex噪声的实现,详细原理可以看乐乐大佬博客,还是较为复杂的,这里直接给出现成代码和效果。
perlin:
value:
simplex:
shader部分:
Shader "Custom/NoiseTest" {
Properties{
_MainTex("MainTex",2D) = "white"{
}
}
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment frag
#include "UnityCG.cginc"
float2 hash22(float2 p) {
p = float2(dot(p,float2(127.1,311.7)),dot(p,float2(269.5,183.3)));
return -1.0 + 2.0*frac(sin(p)*43758.5453123);
}
float2 hash21(float2 p) {
float h=dot(p,float2(127.1,311.7));
return -1.0 + 2.0*frac(sin(h)*43758.5453123);
}
//perlin
float perlin_noise(float2 p) {
float2 pi = floor(p);
float2 pf = p - pi;
float2 w = pf * pf*(3.0 - 2.0*pf);
return lerp(lerp(dot(hash22(pi + float2(0.0, 0.0)), pf - float2(0.0, 0.0)),
dot(hash22(pi + float2(1.0, 0.0)), pf - float2(1.0, 0.0)), w.x),
lerp(dot(hash22(pi + float2(0.0, 1.0)), pf - float2(0.0, 1.0)),
dot(hash22(pi + float2(1.0, 1.0)), pf - float2(1.0, 1.0)), w.x), w.y);
}
//value
float value_noise(float2 p) {
float2 pi = floor(p);
float2 pf = p - pi;
float2 w = pf * pf*(3.0 - 2.0*pf);
return lerp(lerp(hash21(pi+float2(0.0, 0.0)), hash21(pi + float2(1.0, 0.0)), w.x),
lerp(hash21(pi + float2(0.0, 1.0)), hash21(pi + float2(