is just a little place i'm setting aside for various CG experiments and
some of the resultant images. Often when developing a shader or trying
to achieve a particular effect with materials, lighting, post, etc you
end up some interesting test images that may not be exactly what you expected.
These redheaded stepchildren are not often displayed but sometimes they
end up being more interesting that the final product. I'm not sure what
all will end up in here so beware and enjoy.
Recently I've been playing with some ocean surface simulation code based on the work of Jerry Tessendorf of Arete fame. The results are fairly realistic and naturally Id love to get it to the point where it looks as good as Arete. This sample image was rendered in Brazil and was set up so that the surface spans a 100m grid. Unlike implicitly evaluated functions, the ocean height field map is pre-calculated just like a regular bitmap so it is of limited resolution. Moreover, if you don't interpolate between the samples you end up with discreet changes in height per pixel of the map. If the map is stretched out over a big enough area you can end up with something like the image below. Not what you want for a nice smooth ocean but neat all the same. For an image of what the result should look like I've added a Sphere to the gallery using the shader.
A Better form of Noise
Most noise procedurals including Perlin noise are based on the interpolation of values from an underlying lattice. Unfortunately, this lattice can sometimes show up as an artifact in the final image. One form of noise that doesn't have this problem is Sparse Convolution Noise. It has a slightly different character than Perlin noise as can be seen in the image below. It also does a much better job at appearing organic and not displaying a regular structure as demonstrated in the turbulence version of the Perlin noise. The trade off for all these benefits is that it is considerably more expensive to compute. Though the speed hit is a possible downside I am planning on incorporating it as an option in some of the future plugins that I am developing.
Thats no moon! Well not yet at least. At some point Max needs to have a nice Lunar shader. I hope someone else writes it so I don't have too.
One of the fun things you can do with procedurals is to distort them based on another procedural. All the samples below use the same base procedural; in this case it's my Turbulent map. The difference in the results comes from the procedural that has been used to distort the shader space. Actually any map procedural or bitmap can be distorted in this fashion.
What can I say, Multifractals are cool!
Just an idea I'm playing with.
This is a test image of the Turbulent map I'm currently working on. As a still, it certainly has a nice fiery/billowy appearance.
The Good & The Ugly
Some days you're code just doesn't behave. In this case an early version of the SuperCell map was doing some strange things when used for displacement. Thankfully, its all better now.
Sometimes it's not the appearance of the image but the content that's what counts. This was a test for a .ply importer script that I wrote one afternoon with a friend at work. I had wanted to get a hold of some the test meshes that Stanford has used in their graphics department. Fortunately they provide them on the web. Unfortunately, none of the formats easily allowed me to get the data into Max. The solution was to write an importer. I later went on to convert the dragon and Buddha as well. Check out the Stanford 3d Scanning Repository for more information on the data.
Not every image works out as you would hope. This is especially true when you are working with alpha software. The results can be interesting though.
One of the nice things about the max material/map api is that it is close enough to Renderman that its not too tough to convert .sl over to something you can play with in Max. The image below was one of those conversions. Mark Allan was kind enough to hand me a copy of his Opal Renderman shader. The conversion was less than stellar and who knows maybe I'll spend some more time with it. The cool part of the shader is that it modifies the normals to give the appearance of the flakes sitting below the surface. This image doesn't do the effect justice but it look fairly cool when animated.
Not always does your code work the first time. In fact, for most of the code I've worked on it rarely works at all the first time. That being said, sometimes you do get little gifts along the way. Both of the images below are the results of bugs. While not being what I intended they look interesting all the same. Sometimes bugs even turn into features, which can be thought of as serendipity in some eyes.
This was the second attempt at a proceedural in Max. A bit more on this one later.
How it all began
I've been interested in procedural modeling and shading for as long as I've been doing computer graphics, i.e. around 1991. Having an artistic vs. programming background it took a bit of effort to finally break out the Max sdk and try some experimentation with the maps and materials. The sample below was the first thing I tried other than just getting something other than black to render out. I took the idea of the Top/Bottom material and turned it into a map. It allowed for the colors, blend position, fuzzy region and orientation to be specified. I don't think I've touched it since, but I might dig it up again at some point.
For those interested
in trying there hand at some shader writing I cant really say that Max
is a great place to start but once you get the hang of it, it can be quite
a bit of fun with some real hair pulling mixed in for good measure.