© Felipe A. Amaya

Tutorials | Electron Microscope

Electron Microscope

Download Project

Overview

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.

Felipe generated everything in Houdini procedurally.

Reference

As reference and inspiration for this project, images of microscopic pollen taken by an electronic microscope were used.

Scene Development


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.

OSL Look Development

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.

  • Pointlight OSL Shader

    //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));

    }

  • Facing Ratio OSL Shader

    //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));


    }

Rendering

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.

Rendering and compositing breakdown.

Conclusions

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.


About the Author

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.

 
 
 

NEWS | Check out the RenderMan "SciTech" Art Challenge Winners!