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 Frénésie   Members   -  Reputation: 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

Sponsor:

#2 JTippetts   Moderators   -  Reputation: 8508

Like
0Likes
Like

Posted 16 April 2012 - 07:55 AM

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

#3 Frénésie   Members   -  Reputation: 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 Bacterius   Crossbones+   -  Reputation: 8945

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.

The slowsort algorithm is a perfect illustration of the multiply and surrender paradigm, which is perhaps the single most important paradigm in the development of reluctant algorithms. The basic multiply and surrender strategy consists in replacing the problem at hand by two or more subproblems, each slightly simpler than the original, and continue multiplying subproblems and subsubproblems recursively in this fashion as long as possible. At some point the subproblems will all become so simple that their solution can no longer be postponed, and we will have to surrender. Experience shows that, in most cases, by the time this point is reached the total work will be substantially higher than what could have been wasted by a more direct approach.

 

- Pessimal Algorithms and Simplexity Analysis


#5 Frénésie   Members   -  Reputation: 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 Bacterius   Crossbones+   -  Reputation: 8945

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.

The slowsort algorithm is a perfect illustration of the multiply and surrender paradigm, which is perhaps the single most important paradigm in the development of reluctant algorithms. The basic multiply and surrender strategy consists in replacing the problem at hand by two or more subproblems, each slightly simpler than the original, and continue multiplying subproblems and subsubproblems recursively in this fashion as long as possible. At some point the subproblems will all become so simple that their solution can no longer be postponed, and we will have to surrender. Experience shows that, in most cases, by the time this point is reached the total work will be substantially higher than what could have been wasted by a more direct approach.

 

- Pessimal Algorithms and Simplexity Analysis


#7 Frénésie   Members   -  Reputation: 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.



PARTNERS