Vector 具有vec2随机化的GLSL柏林噪声
我尝试使用以下算法在GLSL中实现柏林噪声:Vector 具有vec2随机化的GLSL柏林噪声,vector,glsl,perlin-noise,Vector,Glsl,Perlin Noise,我尝试使用以下算法在GLSL中实现柏林噪声: 将屏幕划分为chekerbord 为棋盘的每个方框的每个角点计算伪随机向量(使用一些散列函数) 计算从长方体的每个角到实际点的差向量 在随机向量和差分向量之间做点积 最后用一个混合函数混合这4个向量 我的代码如下 in vec2 uv; out vec3 color; uniform sampler2D tex; uniform float tex_width; uniform float tex_height; // Functions
- 将屏幕划分为chekerbord
- 为棋盘的每个方框的每个角点计算伪随机向量(使用一些散列函数)
- 计算从长方体的每个角到实际点的差向量
- 在随机向量和差分向量之间做点积
- 最后用一个混合函数混合这4个向量
in vec2 uv;
out vec3 color;
uniform sampler2D tex;
uniform float tex_width;
uniform float tex_height;
// Functions headers
vec2 hash(vec2 p);
float smooth_interpolation(float t);
float mix(float x, float y, float alpha);
float rand(vec2 c);
vec4 taylorInvSqrt(vec4 r);
void main() {
// Grid size in squares
float N = 16.;
// Get to the correct square in grid (row number and column numer)
vec2 colums_line_number = floor(uv*N);
// Compute the pixel values [0, 1] of the 4 corners of the square
vec2 bl = (colums_line_number+vec2(0.,0.) ) / N;
vec2 br = (colums_line_number+vec2(0.,1.) ) / N;
vec2 tl = (colums_line_number+vec2(1.,0.) ) / N;
vec2 tr = (colums_line_number+vec2(1.,1.) ) / N;
// Compute difference vectors from corners to actual point
vec2 bl_diff = bl - uv; // a
vec2 br_diff = br - uv; // b
vec2 tl_diff = tl - uv; // c
vec2 tr_diff = tr - uv; // d
// Generate random vector for each corner
vec2 bl_rand_vec = hash(bl); // g(x0, y0)
vec2 br_rand_vec = hash(br); // g(x1, y0)
vec2 tl_rand_vec = hash(tl); // g(x0, y1)
vec2 tr_rand_vec = hash(tr); // g(x1, y1)
vec4 norm = taylorInvSqrt(vec4(dot(bl_rand_vec, bl_rand_vec), dot(br_rand_vec, br_rand_vec), dot(tl_rand_vec, tl_rand_vec), dot(tr_rand_vec, tr_rand_vec)));
bl_rand_vec*=norm.x;
br_rand_vec*=norm.y;
tl_rand_vec*=norm.z;
tr_rand_vec*=norm.w;
// Dot product to get scalar values for the corners
float bl_scalar = dot(bl_rand_vec, bl_diff); // s
float br_scalar = dot(br_rand_vec, br_diff); // t
float tl_scalar = dot(tl_rand_vec, tl_diff); // u
float tr_scalar = dot(tr_rand_vec, tr_diff); // v
// Smooth interpolation vectors (merge bottoms together, merge tops, then merge the mergings)
float bottom_mix = mix(bl_scalar, br_scalar, smooth_interpolation(uv.x));
float top_mix = mix(tl_scalar, tr_scalar, smooth_interpolation(uv.x));
float noise = mix(bottom_mix, top_mix, smooth_interpolation(uv.y));
color = vec3(pow(noise, 0.15));
}
然而,在实际显示的噪音中,盒子是清晰可见的,但整个东西应该是同质的
显示我的功能
非常感谢你的帮助