2D-perlin-Rauschen in C
Folgte ich
Wenn ich es umsetzen in meinem code (Raytracing), und wenden Sie es auf eine Sphäre, bekomme ich eine uni-Farbe Kugel, mit einem Streifen von dunkler pixel auf. Wenn ich die random-float-generator, ich habe die basic linear Lärm, das ist nicht mein Ziel. Können Sie erklären, was ich verpasst habe?
Hier ist mein code:
#include <stdlib.h>
#include <math.h>
float noise(int x, int y)
{
int n;
n = x + y * 57;
n = pow((n << 13), n);
return (1.0 - ( (n * (n * n * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0);
}
float interpolate(float a, float b, float x)
{
float pi_mod;
float f_unk;
pi_mod = x * 3.1415927;
f_unk = (1 - cos(pi_mod)) * 0.5;
return (a * (1 - f_unk) + b * x);
}
float smooth_noise(int x, int y)
{
float corners;
float center;
float sides;
corners = (noise(x - 1, y - 1) + noise(x + 1, y - 1) +
noise(x - 1, x + 1) + noise(x + 1, y + 1)) / 16;
sides = (noise(x - 1, y) + noise(x + 1, y) + noise(x, y - 1) +
noise(x, y + 1)) / 8;
center = noise(x, y) / 4;
return (corners + sides + center);
}
float noise_handler(float x, float y)
{
int int_val[2];
float frac_val[2];
float value[4];
float res[2];
int_val[0] = (int)x;
int_val[1] = (int)y;
frac_val[0] = x - int_val[0];
frac_val[1] = y - int_val[1];
value[0] = smooth_noise(int_val[0], int_val[1]);
value[1] = smooth_noise(int_val[0] + 1, int_val[1]);
value[2] = smooth_noise(int_val[0], int_val[1] + 1);
value[3] = smooth_noise(int_val[0] + 1, int_val[1] + 1);
res[0] = interpolate(value[0], value[1], frac_val[0]);
res[1] = interpolate(value[2], value[3], frac_val[0]);
return (interpolate(res[0], res[1], frac_val[1]));
}
float perlin_two(float x, float y)
{
float total;
float per;
float amp;
int hz;
int i;
int octave;
total = 0.0;
per = 0.5;
octave = 10;
i = 0;
while (i < octave)
{
hz = pow(2, i);
amp = pow(per, (float)i);
total += noise_handler(x * (float)hz, y * (float)hz) * amp;
i += 1;
}
return (total);
}
EDIT: ich Stelle einen Fehler in der Noise-Funktion (halte ich für das XOR-operand, wie eine power-Funktion ... Jetzt bekomme ich einen barcode, als ob die y-parameter ignoriert wurde in der operations ...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hatte zum implementieren dieses in C vor kurzem und dieser Beitrag geholfen, um mich begonnen. Ein fix für die noise-Funktion, wie zuvor angegeben.
Am wichtigsten ist, ist, dass die Fraktale Brownsche Bewegung ist wirklich wichtig bei der Implementierung von Perlin Noise für die Verwendung in einer Höhe anzeigen. Anstatt der pseudo-code von Hugo Elias, ich habe dieses Google Code-Snippet.
Bevor ich das Tat, ich hatte das gleiche Problem mit uniform 'stripping' oder einfach nur komplett random auf der Suche heightmaps.
noise_hander
? Ist es nur irgendeine Funktion, die Ihnen auch für ein Lärm? (In diesem Fall, was ist einhander
? Warum nicht einfach nennen esnoise_generator
?)Hast du debug & rework wohl alle Ihre Variablen-Typen; die Mathematik in Stift & Papier oder in einem debugger und prüfen Sie den Bereich der Werte. z.B. hier
n
entweder Unterlauf oder überlauf für fast alle nicht-null-Werte. Guten random Werten kann nicht hergestellt werden mit irgendeinem random-Methode, die ist, was diese Formeln Aussehen.Überprüfen Sie auch dieses Thema für einige Referenz code.
n=x+y*57
; wo, wenn Sie verwenden Sie (x+1) vs (y+1) eine dieser änderungen nicht ändern, dass die Ausgabe viel (oder überhaupt). (x+1) vs. (y+1)*57 ?