February 18, 2020
This is the end result of the final project developed by Felipe A. Amaya for the Programming 3-D Models and Shaders (VSFX 502) class at SCAD. It shows microscopic particles of pollen suspended in the air with a collision between two of them as the main feature of the animation providing the scene with a focal point.
As reference and inspiration for this project, images of microscopic pollen taken by an electronic microscope were used.
All aspects of the scene were developed within Houdini parametrically and procedurally.
Based on the main reference image, five models of the individual pollen spores were procedurally modeled to later populate the scene.
The main goal of the class was to get comfortable working with custom OSL shaders. In particular for this project, the overall main goal was to create OSL shaders that gave non-photorealistic results, narrowing those results to replicating the look that electronic microscope images have. For this project two shaders were written. One to create a fake “fresnel” effect and another one to generate a fake point of light in space, but one that didn’t generate any shading.
//SEM_pointLight
shader SEMpointLight(
//calculate a position for a fake light
point position = point(0,10,0),
//color of the fake light
color lightRGB = color (1,1,1),
//base color for the surface
color baseRGB = color (0.05, 0.05, 0.05),
//add falloff
float falloff = 1,
string coordsys = "world",
//result
output color resultRGB = 0)
{
//normalize normal, store it in "n"
vector n = normalize(N);
//remap position(of surface of object) to world space
point p = transform(coordsys, P);
//remap position of fake light to world space
point pos = transform(coordsys, position);
//calculate direction of light from its orgin
vector dir = normalize(pos - p);
//dot product between n and dir, clamped negatives to zero
float dp = clamp(dot(n,dir), 0, 1);
resultRGB = mix(baseRGB, lightRGB, pow(dp,falloff));
}
//FacingRatioShader
shader FacingRatio(color FaceColor = 0,
color EdgeColor = 1,
float gain = 1,
output color resultRGB = 0)
{
vector i = normalize(-I);
vector n = normalize (N);
float dp = 1 -fabs(dot(i,n));
resultRGB = mix (FaceColor,EdgeColor,pow(dp,gain));
}
Renderman played a crucial role in the development of this project. The overall look was achieved firstly by using Occlusion as the integrator for the rendering node and making sure to have Use Albedo on (This is important to get the color assigned on the geometry in the render). By using PxrOSL nodes, the two written shaders were brought into the scene and plugged into a PxrSurface assigned to the objects of the scene. Additionally, through the use of Primvar nodes, the geometry color was imported into the Material context and plugged into the diffuse color of the Pxr Surface assigned to the pollen objects. This ensured that their point color would be their primary surface color.
This project was very enriching. It allowed me to explore RenderMan for the first time in Houdini. And taught me a lot of its capabilities. Also this project posed very interesting challenges, including the lack of lighting, which made it extremely unconventional, but offered an opportunity to generate fascinating and unusual images.
My name is Felipe Amaya. I’m a visual effects artist with emphasis on parametric, procedural and dynamic effects. Prior to computer graphics, I worked as a graphic designer for a decade playing the role of creative and art director in multiple advertisement related jobs.