Advertisement

code to make a perlin noise 3d texture?

Started by April 09, 2001 12:35 AM
4 comments, last by Possibility 23 years, 10 months ago
I need to make some animating cloud affects, and I know it can be done by generating a 3D texture from perlin noise, and then viewing 1 slice of the texture at a time. So a texture of 256x256x60 would produce 60 frames of animation. But I cant find any good places online or any source code on how you would produce such a texture. I have searched the web for perlin noise and such, but havent found anything good, or they are extremely to complex in that they go through the rendering of the whole sky box and all that extra crap. I just need to make the 3D texture and nothing else because I already have the code written to render it. So could anyone lead me to a website that covers this indepth? Possibility
Dude...

Get it straight from the source. Some of the sites linked from there might go a little more into detail for the particular effect that you''re looking for.


pwd

---
What makes you think I''m not going to like a goatse pic on my window? - nes8bit



E.A.R.E. To keep your children away from elephants!
Advertisement
Yah, I actually have that original noise.c file from perlin, but how do you use it? There is not a single comment or instruction on what to do with it.

How do you go about filling a structure like this?

typedef struct
{
unsigned short r, g, b;
} Color;

and say I want to make a 256x256x60 3d texture
Color Cloud[256][256][60];

So how do you go about filling this structure so that it looks like a bunch of clouds in it?

Possibility


Edited by - Possibility on April 9, 2001 2:01:40 PM
Did you check out any of the links on that site? Especially the one to Hugo Eliass page? He deals with just that, and has a little cloud program w/pseudocode.

The easiest way to actually fill your cloud color buffer would be to use a color map. Clamp the noise values between 0 and 1 and assign color values based on where they fall (probably want to include alpha). Basically 0.0 = r0 g0 b0, .5 = r180 g180 b180, 1.0 = r255 g255 b255 or something like that. Then either weight the color values depending on the value of your noise, or set it explicitly depending on where it falls (eg between 0.0 and 0.5 = r0 g0 b0).

pwd

---
What makes you think I''m not going to like a goatse pic on my window? - nes8bit



E.A.R.E. To keep your children away from elephants!
Here is my code to create a cloud plasma effect:

  void Cloudplasma(unsigned _int16* screen_buffer, short pix_row, unsigned char depth){	int i,x,y;	int shade_nr;		// Pixelhopp i x och yled	int spacing = 2 << depth;	int spacing_div2 = spacing / 2;  int Nr_Pixels = pix_row*pix_row;		unsigned char *fractalBuffer = new unsigned char[(pix_row)*(pix_row)];	memset(fractalBuffer, 255, pix_row*pix_row);		// Sätt ut en pixlar med avståndet "spacing" (2-64) som har ett	// slump-värde mellan 0 och 255	for (y = 0; y < pix_row; y += spacing)		for (x = 0; x < pix_row; x += spacing)      fractalBuffer[x + y * pix_row] = (unsigned char) (rand() % 255);				// Sätt ut pixlarna mellan de ursprungliga positionerna		// Upprepa tills spacing är lika 0		while(spacing != 0)		{      // Lägg till 1 pixel mellan varje pixel och ge den ett värde			// baserat på medelvärdet av de 4 pixlarna runt omkring      // Det svåra är att rita SISTA kolumnen och SISTA raden!			for (y = spacing_div2; y < pix_row; y+=spacing)				for (x = spacing_div2; x < pix_row; x+=spacing)				{					// Bottom Right corner : fractalBuffer[pix_row * pix_row - pix_row - (pix_row * 0) + 0 ] 					// Befinner sig pixlen i undre högra hörnet?					if( (x + spacing) > pix_row && (y + spacing) > pix_row) 					{          						fractalBuffer[x + y * pix_row] = (unsigned char) ((							fractalBuffer[ (pix_row - spacing) ] +							fractalBuffer[  0 ] +							fractalBuffer[ (pix_row - spacing) + ((pix_row-spacing)*pix_row) ] +							fractalBuffer[ ((pix_row-spacing)*pix_row)  ] ) / 4);											} else						            // Befinner sig pixeln i den sista kolumnen ?            if( x + spacing > pix_row )            {							fractalBuffer[x + y * pix_row] = (unsigned char) ((								fractalBuffer[ (x-spacing_div2) + (y*pix_row) - (pix_row*spacing_div2) ] +								fractalBuffer[ (0)              + (y*pix_row) - (pix_row*spacing_div2) ] +								fractalBuffer[ (x-spacing_div2) + (y*pix_row) + (pix_row*spacing_div2) ] +								fractalBuffer[ (0)              + (y*pix_row) + (pix_row*spacing_div2) ] ) / 4);            } else														// Befinner sig pixeln på den sista raden ?							if( y + spacing > pix_row )							{								fractalBuffer[x + y * pix_row] = (unsigned char) ((									fractalBuffer[ (x-spacing_div2) + (y*pix_row) - (pix_row*spacing_div2) ] +									fractalBuffer[ (x+spacing_div2) + (y*pix_row) - (pix_row*spacing_div2) ] +									fractalBuffer[ (x-spacing_div2) + 0 ] +									fractalBuffer[ (x+spacing_div2) + 0 ] ) / 4);							} else																fractalBuffer[x + y * pix_row] = (unsigned char) ((								fractalBuffer[ (x-spacing_div2) + (y*pix_row) - (pix_row*spacing_div2) ] +								fractalBuffer[ (x+spacing_div2) + (y*pix_row) - (pix_row*spacing_div2) ] +								fractalBuffer[ (x-spacing_div2) + (y*pix_row) + (pix_row*spacing_div2) ] +								fractalBuffer[ (x+spacing_div2) + (y*pix_row) + (pix_row*spacing_div2) ] ) / 4);														// Lägg till eller ta bort lite extra färg för att 							// mönstret inte skall bli så jämnt. Endast om djupet							// är större än 3.							if(spacing >= 8)							{								if(rand()% 100 > 48)									shade_nr =  rand()%32;								else									shade_nr = -rand()%32;																if(fractalBuffer[x + y * pix_row] + shade_nr > 255)									shade_nr = 255 - fractalBuffer[x + y * pix_row];								if(fractalBuffer[x + y * pix_row] - shade_nr < 0)									shade_nr = 32 - fractalBuffer[x + y * pix_row];																	/*if(x >= 128 && x <= 384 && y >= 128 && y <= 384)									{									shade_nr = - ((rand()%x / 16) + (rand()%y / 16) / 2);									if(fractalBuffer[x + y * pix_row] - shade_nr < 0)									shade_nr = 16 - (fractalBuffer[x + y * pix_row]/2);							}*/																fractalBuffer[x + y * pix_row] += shade_nr;							}				}								// Jämna ut pixlarna från den ursprungliga slumpkartan				// Ge dem medelvärded på de fyra pixlarna runt omkring				// Det svåra är att rita FÖRSTA kolumnen och FÖRSTA raden!								for (y = 0; y < pix_row; y += spacing)					for (x = 0; x < pix_row; x += spacing)					{						// Top Left corner : fractalBuffer[0 + (pix_row * 0)]            // Befinner sig pixlen i övre vänstra hörnet?            if( x == 0 && y == 0)             {                          fractalBuffer[x + y * pix_row] = (unsigned char) ((								fractalBuffer[ (pix_row-spacing_div2) + (spacing_div2*pix_row) ] +								fractalBuffer[ (spacing_div2) + (spacing_div2 * pix_row) ] +								fractalBuffer[ (pix_row-spacing_div2) + ((pix_row-spacing_div2)*pix_row) ] +								fractalBuffer[ (spacing_div2) + ((pix_row-spacing_div2)*pix_row) ] ) / 4);							            } else														// Befinner sig pixeln i den första kolumnen ?							if( x == 0 )							{								fractalBuffer[x + y * pix_row] = (unsigned char) ((									fractalBuffer[ (pix_row-spacing_div2) + (y*pix_row) - (pix_row*spacing_div2) ] +									fractalBuffer[ (spacing_div2)         + (y*pix_row) - (pix_row*spacing_div2) ] +									fractalBuffer[ (pix_row-spacing_div2) + (y*pix_row) + (pix_row*spacing_div2) ] +									fractalBuffer[ (spacing_div2)         + (y*pix_row) + (pix_row*spacing_div2) ] ) / 4); 							} else																// Befinner sig pixeln på den första raden ?								if( y == 0 )								{									fractalBuffer[x + y * pix_row] = (unsigned char) ((										fractalBuffer[ (x-spacing_div2) + (pix_row-spacing)*pix_row + (pix_row*spacing_div2) ] +										fractalBuffer[ (x+spacing_div2) + (pix_row-spacing)*pix_row + (pix_row*spacing_div2) ] +										fractalBuffer[ (x-spacing_div2) + (y*pix_row) + (pix_row*spacing_div2) ] +										fractalBuffer[ (x+spacing_div2) + (y*pix_row) + (pix_row*spacing_div2) ] ) / 4); 								} else																		fractalBuffer[x + y * pix_row] = (unsigned char) ((									fractalBuffer[ (x-spacing_div2) + (y*pix_row) - (pix_row*spacing_div2) ] +									fractalBuffer[ (x+spacing_div2) + (y*pix_row) - (pix_row*spacing_div2) ] +									fractalBuffer[ (x-spacing_div2) + (y*pix_row) + (pix_row*spacing_div2) ] +									fractalBuffer[ (x+spacing_div2) + (y*pix_row) + (pix_row*spacing_div2) ] ) / 4); 					}										// Medelvärde baserat på den vertikala pixeln					// Det svåra är att rita FÖRSTA kolumnen och SISTA raden!										for (y = spacing_div2; y < pix_row; y+=spacing)						for (x = 0; x < pix_row; x+=spacing)						{							// Bottom Left : fractalBuffer[pix_row * pix_row - (pix_row * 0) - 0 - 1]							// Befinner sig pixlen i undre vänstra hörnet?							if( x == 0 && (y + spacing) > pix_row) 							{ 								fractalBuffer[x + y * pix_row] = (unsigned char) ((									fractalBuffer[ 0 ] +									fractalBuffer[ (spacing_div2) + ((pix_row-spacing_div2)*pix_row) ] +									fractalBuffer[ (pix_row-spacing_div2) + ((pix_row-spacing_div2)*pix_row) ] +									fractalBuffer[ (pix_row-spacing) * pix_row ] ) / 4);															} else 																// Befinner sig pixeln i den första kolumnen ?								if( x == 0)								{									fractalBuffer[x + y * pix_row] = (unsigned char) ((										fractalBuffer[ (x) + (y*pix_row) - (pix_row*spacing_div2) ] +										fractalBuffer[ (pix_row-spacing_div2)  + (y*pix_row) ] +										fractalBuffer[ (x+spacing_div2)  + (y*pix_row) ] +										fractalBuffer[ (x) + (y*pix_row) + (pix_row*spacing_div2) ] ) / 4);             								} else 																		// Befinner sig pixeln på den sista raden ?									if( y + spacing > pix_row )									{										fractalBuffer[x + y * pix_row] = (unsigned char) ((											fractalBuffer[ (x) + (y*pix_row) - (pix_row*spacing_div2) ] +											fractalBuffer[ (x-spacing_div2)  + (y*pix_row) ] +											fractalBuffer[ (x+spacing_div2)  + (y*pix_row) ] +											fractalBuffer[ (x) + 0 ] ) / 4); 									} else																				fractalBuffer[x + y * pix_row] = (unsigned char) ((										fractalBuffer[ (x) + (y*pix_row) - (pix_row*spacing_div2) ] +										fractalBuffer[ (x-spacing_div2)  + (y*pix_row) ] +										fractalBuffer[ (x+spacing_div2)  + (y*pix_row) ] +										fractalBuffer[ (x) + (y*pix_row) + (pix_row*spacing_div2) ] ) / 4);						}												// Medelvärde baserat på den horisontella pixeln						// Det svåra är att rita FÖRSTA raden och SISTA kolumnen !												for (y = 0; y < pix_row; y+=spacing)							for (x = spacing_div2; x < pix_row; x+=spacing)							{								// Top Right : fractalBuffer[(pix_row-0) + (pix_row * 0) - 1]								// Befinner sig pixlen i övre högra hörnet?								if( (x + spacing) > pix_row && y == 0) 								{									fractalBuffer[x + y * pix_row] = (unsigned char) ((										fractalBuffer[ (pix_row-spacing_div2) + (pix_row * spacing_div2) ] +										fractalBuffer[ 0 ] +										fractalBuffer[ pix_row - spacing ] +										fractalBuffer[ (pix_row - spacing_div2) + (pix_row * (pix_row-spacing_div2)) ] ) / 4);								} else 																		// Befinner sig pixeln i den sista kolumnen ?									if( x + spacing > pix_row )									{										fractalBuffer[x + y * pix_row] = (unsigned char) ((											fractalBuffer[ (x) + (y*pix_row) - (pix_row*spacing_div2) ] +											fractalBuffer[ (x-spacing_div2)  + (y*pix_row) ] +											fractalBuffer[ (0) + (y*pix_row) ] +											fractalBuffer[ (x) + (y*pix_row) + (pix_row*spacing_div2) ] ) / 4);  									} else																				// Befinner sig pixeln på den första raden ?										if( y == 0 )										{											fractalBuffer[x + y * pix_row] = (unsigned char) ((												fractalBuffer[ (x) + (pix_row-spacing)*pix_row + (pix_row*spacing_div2) ] +												fractalBuffer[ (x-spacing_div2)  + (y*pix_row) ] +												fractalBuffer[ (x+spacing_div2)  + (y*pix_row) ] +												fractalBuffer[ (x) + (y*pix_row) + (pix_row*spacing_div2) ] ) / 4);             										} else																						fractalBuffer[x + y * pix_row] = (unsigned char) ((											fractalBuffer[ (x) + (y*pix_row) - (pix_row*spacing_div2) ] +											fractalBuffer[ (x-spacing_div2)  + (y*pix_row) ] +											fractalBuffer[ (x+spacing_div2)  + (y*pix_row) ] +											fractalBuffer[ (x) + (y*pix_row) + (pix_row*spacing_div2) ] ) / 4);							}														spacing=spacing/2;							spacing_div2=spacing/2;	}		// Ge de 4 hörnpixlarna samma värde som antingen 	// pixeln som finns till vänster eller höger.		// Top left	fractalBuffer[0 + (512 * 0)]							= fractalBuffer[1 + (512 * 0)];	// Top right	fractalBuffer[(512-0) + (512 * 0) - 1]				= fractalBuffer[(512-1) + (512 * 0) - 1];	// Bottom right	fractalBuffer[512 * 512 - 512 - (512 * 0) + 0 ] = fractalBuffer[512 * 512 - 512 - (512 * 0) + 1 ];	// Bottom left	fractalBuffer[512 * 512 - (512 * 0) - 0 - 1]		= fractalBuffer[512 * 512 - (512 * 0) - 1 - 1];		for(i=0; i<Nr_Pixels; i++)	{		//unsigned short tal = (unsigned short) fractalBuffer;<br></font><br>		<br>		<font color="gray">// Om färgen inte är nästan helt vit, ge den en nyans av blå<br></font><br>		<font color="gray">//if(tal &lt; 240)<br></font><br>		<font color="gray">//	*(screen_buffer) = (unsigned _int16) ((((tal &gt;&gt; 3) &lt;&lt; 11) + ((tal &gt;&gt; 2) &lt;&lt; 5) + (255 &gt;&gt; 3)));<br></font><br>		<font color="gray">//else<br></font><br>		<font color="gray">//	*(screen_buffer) = (unsigned _int16) ((((tal &gt;&gt; 3) &lt;&lt; 11) + ((tal &gt;&gt; 2) &lt;&lt; 5) + (tal &gt;&gt; 3)));<br></font><br>		<br>		*(screen_buffer) = (<font color="blue">unsigned</font> short) g_pNoisePalette[<font color="purple">fractalBuffer[i</font>]];<br>		screen_buffer++;<br>	}<br>	<br>	<br>	delete[] fractalBuffer;<br>	<br>}<br><br>  </pre></font></td></tr></table></center><!–ENDSCRIPT–>     
Gandalf the Black
Wow, thanks.

Possibility

This topic is closed to new replies.

Advertisement