Jump to content

  • Log In with Google      Sign In   
  • Create Account

Raytracing: how to use Perlin noise functions.


Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.


  • You cannot reply to this topic
6 replies to this topic

#1   Members   

101
Like
0Likes
Like

Posted 16 April 2012 - 07:44 AM

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 Posted Image

#2   Moderators   

12317
Like
0Likes
Like

Posted 16 April 2012 - 07:55 AM

Clarify "it didn't work." Exactly what happened? And what did you do?

#3   Members   

101
Like
0Likes
Like

Posted 16 April 2012 - 08:42 AM

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.

#4   Members   

13100
Like
0Likes
Like

Posted 16 April 2012 - 09:07 AM

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.”


#5   Members   

101
Like
0Likes
Like

Posted 16 April 2012 - 09:19 AM

So i need to transform my coordinates to a value between 0 and 1 ?

#6   Members   

13100
Like
0Likes
Like

Posted 16 April 2012 - 09:26 AM

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.”


#7   Members   

101
Like
0Likes
Like

Posted 16 April 2012 - 09:36 AM

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.




Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.