为了给出一些上下文,我一直在用Java编写一个基本的Perlin噪声实现,当实现播种时,我遇到了一个我无法解释的错误。 为了每次为相同的种子生成相同的随机权向量,无论查询哪组坐标的噪声水平,以什么顺序,我都基于原始种子和原始种子的组合生成新的种子( newSeed )加权vector的坐标,并通过运行将其用作加权vector随机化的种子: rnd.setSeed(newSeed); weight = new NVector(2); weight.setElement(0, rnd.nextDouble() * 2 – 1); weight.setElement(1, rnd.nextDouble() * 2 – 1); weight.normalize() NVector是vectormath的自制课程。 但是,运行时,程序产生非常糟糕的噪音: 经过一番挖掘之后,我发现每个向量的第一个元素非常相似(所以在每个setSeed()调用之后的第一个nextDouble() setSeed()调用)导致向量网格中每个向量的第一个元素是相似的。 这可以通过运行来certificate: long seed = Long.valueOf(args[0]); int loops = Integer.valueOf(args[1]); double avgFirst = 0.0, avgSecond = 0.0, avgThird = 0.0; double lastfirst = 0.0, lastSecond = 0.0, lastThird = 0.0; […]
所以我正在制作一个随机岛屿的地图生成器。 它在发生器的核心部分使用Perlin噪声,然后使用具有梯度的圆来形成岛。 圆方法在地图的中心创build了多个圆,渐变颜色从64开始到0。问题是,此方法正在创build具有圆形边的地图部分的非天生外观。 当一个像素产生珀林噪声时,它将在梯度图上得到该像素,然后用蓝色值对它进行多重比较。 因此,如果珀林噪声在像素1,5上给出一个,而在梯度图上的蓝色值是54,则它将输出54的噪声值。如果像素130,560上的珀林噪声为0.5,并且梯度颜色值为64那么噪声值为32。 这是我得到的: 代码有两个关键点,即perlin位: noise = NoiseGenerator.Noise(x, y); double gradColour = getGradColour(x, y).B; double addedNoise = noise * gradColour; double gradNoise = addedNoise;// – gradColour; 然后是梯度图生成器: public static void DrawGrad(float X, float Y, float R, Color C1, Color C2) { Graphics g = Graphics.FromImage(imgGrad); GraphicsPath path = new GraphicsPath(); path.AddEllipse(X, Y, R, […]
由于GPU驱动程序供应商通常noiseX在GLSL中实现noiseX ,所以我正在寻找一种“graphics随机瑞士军刀”实用程序function集,最好在GPU着色器中进行优化。 我更喜欢GLSL,但是编写任何语言都可以,我可以把它自己翻译成GLSL。 具体来说,我希望: a) 伪随机函数 – 从M维种子计算得到的N维,在[-1,1]或超过[0,1]上的均匀分布(理想情况下是任何值,但是我可以用种子限制为了统一的结果分布,比如0..1)。 就像是: float random (T seed); vec2 random2 (T seed); vec3 random3 (T seed); vec4 random4 (T seed); // T being either float, vec2, vec3, vec4 – ideally. b) 连续的噪音,如柏林噪音 – 再次,N维,+ – 均匀分布,具有一套有限的价值观,而且看起来不错(有些选项可以configuration外观像柏林的水平也可能是有用的)。 我希望签名像: float noise (T coord, TT seed); vec2 noise2 (T coord, TT seed); // […]