Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 2D柏林噪波似乎是方形的_Opengl_Glsl_Shader_Procedural Programming - Fatal编程技术网

Opengl 2D柏林噪波似乎是方形的

Opengl 2D柏林噪波似乎是方形的,opengl,glsl,shader,procedural-programming,Opengl,Glsl,Shader,Procedural Programming,我似乎得到了方形柏林噪声地形的2d输入 我一直在关注这个,它使用WebGL而不是opengl。在这里,我用0.0到1.0范围内的浮点数组替换了从一些样本纹理中提取的渐变方法 #version 330 core out vec4 FragColor; uniform float gradient[256]; float fade(float t) { return t*t*t*(t*(t*6.0-15.0)+10.0); } vec2 grad(vec2 p){ vec2

我似乎得到了方形柏林噪声地形的2d输入

我一直在关注这个,它使用WebGL而不是opengl。在这里,我用0.0到1.0范围内的浮点数组替换了从一些样本纹理中提取的渐变方法

#version 330 core
out vec4 FragColor;


uniform float gradient[256];

float fade(float t)
{
    return t*t*t*(t*(t*6.0-15.0)+10.0);
}


vec2 grad(vec2 p){
    vec2 v = vec2(gradient[int(p.x)&255],gradient[int(p.y)&255]);
    return normalize(v.xy*2.0 - vec2(1.0));
}

float noise(vec2 p){
    vec2 p0 = floor(p);
    vec2 p1 = p0 + vec2(1.0,0.0);
    vec2 p2 = p0 + vec2(0.0,1.0);
    vec2 p3 = p0 + vec2(1.0,1.0);

    vec2 g0 = grad(p0);
    vec2 g1 = grad(p1);
    vec2 g2 = grad(p2);
    vec2 g3 = grad(p3);

    float t0 = p.x - p0.x;
    float fade_t0 = fade(t0);
    float t1 = p.y - p0.y;
    float fade_t1 = fade(t1);

    float p0p1 = (1.0-fade_t0)*dot(g0,(p-p0)) + fade_t0*dot(g1,(p-p1));
    float p2p3 = (1.0-fade_t0)*dot(g2,(p-p2)) + fade_t0*dot(g3,(p-p3));

    return ((1.0-fade_t1)*p0p1 + fade_t1*p2p3);
}


void main()
{
    float n = noise(vec2(gl_FragCoord.x,gl_FragCoord.y)/64.0)*1.0 +
              noise(vec2(gl_FragCoord.x,gl_FragCoord.y)/32.0) * 0.5 +
              noise(vec2(gl_FragCoord.x,gl_FragCoord.y)/16.0) * 0.25 +
              noise(vec2(gl_FragCoord.x,gl_FragCoord.y)/8.0) * 0.125;


    FragColor = vec4(vec3(n*0.5+0.5),1.0);

}


shadertoy版本中的源纹理是二维的,由256*256个随机像素和多个颜色通道组成。 此外,当在原始
grad
函数中查找纹理时,则根据纹理缩小过滤器对像素进行插值,该过滤器可能是
GL_线性的

vec2梯度(vec2p){
常量浮动纹理宽度=256.0;
vec4v=纹理(iChannel0,vec2(p.x/纹理宽度,p.y/纹理宽度));
返回标准化(v.xy*2.0-vec2(1.0));
}
您的统一数组只有256个不同的值,并且在
grad
函数中没有模拟texel之间的插值:

vec2梯度(vec2p){
vec2v=vec2(梯度[int(p.x)&255],梯度[int(p.y)&255]);
返回标准化(v.xy*2.0-vec2(1.0));
}
使用a并将噪波函数的返回值解释为角度(噪波*2*PI),以计算
grad()的返回值。

float rand(vec2 co){
返回分数(sin(dot(co.xy,vec2(12.9898,78.233)))*43758.5453);
}
vec2梯度(vec2 p){
浮动a=兰特(p)*2.0*3.1415926;
返回向量2(cos(a),sin(a));
}

或者使用统一数组生成随机值

vec2梯度(vec2p){
ivec2 i00=ivec2(整数倍和255倍,整数倍和255倍);
vec2f=地板(p);
浮动vx=混合(梯度[i00.x],梯度[i00.x+1],f.x);
浮动vy=混合(梯度[i00.y],梯度[i00.y+1],f.y);
浮点数a=(vx+vy)*3.141529;
返回向量2(cos(a),sin(a));
}

你能发布一张你的噪音外观的图片吗?@Kalle Halvarsson donethanks对于解决方案,我得到了想要的结果。但在这里,我认为这并不是什么导致了这种方形的噪音,因为我总是通过一个地板(vec2)来梯度作为输入。是我生成的值不够随机还是其他原因?@ashish正如我在回答的第一句中提到的“shadertoy版本中的源纹理是二维的,由256*256个随机像素和多个颜色通道组成。[…]您的统一数组只有256个不同的值”因此,从理论上讲,如果有一个256*256随机像素值的统一数组(对于vec2的两个组件中的每一个),它应该使用旧方法工作?@ashish当然。但请注意,256*256浮点超出了(默认)统一块大小的限制。正确的解决方法是使用纹理(或随机噪声函数)。我从256个浮点数中选取x和y分量的值,使得所谓的随机值不是随机的,因为x是水平重复的,或者y是垂直重复的,因此出现了长方体外观。谢谢