Raytracing: how to use Perlin noise functions.

Started by
5 comments, last by J 12 years ago
Hello guys,

I'm doing a raytracer in C and I need to apply some textures on 3D objects.
I saw the noise functions created by Ken Perlin, http://mrl.nyu.edu/~.../doc/oscar.html and i think I could use the noise3() function to apply texture on my 3D objets.
I tried to use this functions in my program, but it didn't work.
I'm wondering how to use this noise3() function and the return value to get a good texture.
Thanks guys for helping me smile.png
Advertisement
Clarify "it didn't work." Exactly what happened? And what did you do?
I used the noise3() function with all the 3d points of my objects, then i got a return value (double).
I choosed 2 default colors (and the third one was the one of the object).
I choosed 3 default values, 0.25, 0.5 and 0.75.
And i did this:


t_color get_texture(t_color c1, t_color c3, t_color c2, double tab[3])
{
t_color text;
double v;
double f;
int i;

i = 0;
while (i < 8)
{
v = v + noise3(tab);
i++;
}
if (v <= s1)
text.color_int = c1.color_int;
else if (v < s2)
{
f = (v - s1) / (s2 - s1);
text.color_char[0] = 0;
text.color_char[1] = (c1.color_char[1] * (1 - f)) + (c2.color_char[1] * f);
text.color_char[2] = (c1.color_char[2] * (1 - f)) + (c2.color_char[2] * f);
text.color_char[3] = (c1.color_char[3] * (1 - f)) + (c2.color_char[3] * f);
}
else if (v < s3)
{
f = (v - s2) / (s3 - s2);
text.color_char[0] = 0;
text.color_char[1] = (c2.color_char[1] * (1 - f)) + (c3.color_char[1] * f);
text.color_char[2] = (c2.color_char[2] * (1 - f)) + (c3.color_char[2] * f);
text.color_char[3] = (c2.color_char[3] * (1 - f)) + (c3.color_char[3] * f);
}
else
text.color_int = c3.color_int;
return (text);
}

whit t_color as:

typedef union u_color
{
int color_int;
char color_char[4];
}t_color;

The result was a random snow. So i think i didn't use the noise3() function.
You will need to scale the noise frequency accordingly (by multiplying the input vector by a scalar), otherwise the noise will appear random (if the frequency is too high) or will appear uniform (if the frequency is too low). I believe the default implementation assumes input ranges between 0 and 1, so if your points have coordinates on the order of 100, which is likely, it will appear mostly random.

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”

So i need to transform my coordinates to a value between 0 and 1 ?
Well first you need to make sure that's the problem, try multiplying your input vector (coordinates) by different scalars, say 0.1, 0.001, then 10, and 100, and see how that affects the results. If you see a difference you should be able to tweak it until it looks just right.

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”

Ok i just multiplied my input coordinates by 0.1 and i got some nice results !
Thank you :)

I'll post when i'll see new problems.

This topic is closed to new replies.

Advertisement