I am studying noise from the bookofshaders and in 2d noise this is the code in the book or website.
#ifdef GL_ES
precision mediump float;
#endif
uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;
// 2D Random
float random (in vec2 st) {
return fract(sin(dot(st.xy,
vec2(12.9898,78.233)))
* 43758.5453123);
}
// 2D Noise based on Morgan McGuire @morgan3d
// https://www.shadertoy.com/view/4dS3Wd
float noise (in vec2 st) {
vec2 i = floor(st);
vec2 f = fract(st);
// Four corners in 2D of a tile
float a = random(i);
float b = random(i + vec2(1.0, 0.0));
float c = random(i + vec2(0.0, 1.0));
float d = random(i + vec2(1.0, 1.0));
// Smooth Interpolation
// Cubic Hermine Curve. Same as SmoothStep()
vec2 u = f*f*(3.0-2.0*f);
// u = smoothstep(0.,1.,f);
// Mix 4 coorners percentages
return mix(a, b, u.x) +
(c - a)* u.y * (1.0 - u.x) +
(d - b) * u.x * u.y;
}
void main() {
vec2 st = gl_FragCoord.xy/u_resolution.xy;
// Scale the coordinate system to see
// some noise in action
vec2 pos = vec2(st*5.0);
// Use the noise function
float n = noise(pos);
gl_FragColor = vec4(vec3(n), 1.0);
}
There are few things i am not able to understand in this code is
-
why is the mixing or combining noise value from all the corner has calculation like that
mix(a, b, u.x) + (c - a)* u.y * (1.0 - u.x) + (d - b) * u.x * u.y;
from initial understanding it is easy guess that everything is linear interpolation but i am not able to understand the thinking behind why u.y*(1.0-u.x)
and u.x*u.y
are used as a factor.
is it something like someone choosed this specific way and there is no concerete reason why it is specificially done this way or this mixing is not standard way of mixing but people can mix anyway they want ?
-
and in the line of code
vec2 pos = vec2(st*5.0)
i am not able to understand how does this increase the frequency of noise.
can anyone please help me understand this ?
Aucun commentaire:
Enregistrer un commentaire