Taught by Christos Obretenov, this course covers the use of the software in production. Artists and Technical Directors will find this course useful for expanding their shading knowledge in Renderman, as well as learning some of the newer advanced ray tracing, physically-based shading, and image-based lighting techniques being used in production today. Coming out of the course the student will be able to put into practice, in a production environment, the procedural shading techniques we cover and understand their use more thoroughly, as well as design a shading/lighting pipeline around the physically-based shading and lighting paradigm.
Obretenov has worked in a variety of roles, designing and developing shading software for Walt Disney's The Wild feature film, followed by shading and lighting for Superman Returns
, Spider-Man 3
, Christmas Carol
, and Mars Needs Moms
The curriculum is broken up into three sections:
Part 1 - Procedural Shading
Why is procedural shading important and interesting? Dealing with complex models and sets in production, its very useful to explore shading solutions that can solve detailed procedural variation. We look at all aspects of the pipeline from design, modeling, shader development, and rendering to incorporate procedural shading variation.
In addition we explore procedural patterns for surface and displacement shaders, creating complex organic shading solutions for things like snow and ocean surfaces. We expose all the complex noise parameters and clearly define each one.
Part 2 - Raytracing and Global Illumination
Finally we are seeing a large shift towards ray tracing in production. With PRMan16’s improved ray tracing features and speed, including the radiosity cache, raytrace hider, and weighted sampling, we dive into some of the newer production techniques.
Also important is making our scenes and shading efficient for ray tracing, so we discuss different approaches to efficiency.
Also new in PRMan16 is the “Physically Plausible Shading” paradigm, including coshaders and multiple importance sampling. These are advanced topics we explore in this section of the course.
Part 3 - Image Based Lighting
In CG film production, we rely on captured HDRI maps to drive realistic lighting response from the environment.
In the course we test multiple unclipped HDRI Lightmaps using fully raytraced importance-sampled shading. With proper unclipped HDRI maps and importance sampled energy conserving shaders as our tools, we demonstrate how we can properly configure materials that are consistent and physically correct under different lighting conditions. Topics covered include showing the requirement of high contrast lighting environments to correctly setup materials, ie low contrast lighting environments will not be sufficient for materials to be tuned across all lighting scenarios. Also key is making sure our BRDF’s are normalized and energy conserving to be able to set material properties (balancing of diffuse and specular) that hold across all lighting environments.
In addition to importance sampling the HDRI dome light, in some cases it is more accurate to “cut out” the extreme bright spots in the HDRI and place those on geometric “area lights”. These textured area lights are then placed in the correct position and size with respect to the CG object and sampled during rendering, with the resulting cutout area filled with a neutral color in the original HDRI. As is often the case of the CG object not being in the exact space of the HDRI capture, this cutting out and placing of the area light textures can be more representative since the solid angle math is only accurate at the exact spot of the HDRI capture. Also, the resulting importance sampling on a given area light with super bright exposure can be more efficient than sampling that same region on the entire dome. Most importantly, the correct distance from object and size of highlight is preserved.
Educated at Simon Fraser University in Computing Science and Computer Graphics, Christos started contributing to the Animation and Film industry during "co-op" work terms at Mainframe Entertainment in conjunction with Simon Fraser University. He continued his career by designing and developing shading software for Walt Disney's The Wild feature film, followed by shading and lighting for Superman Returns, Spider-Man 3, Beowulf, Christmas Carol, and Mars Needs Moms feature films. Recently co-founding LollipopShaders.com, Christos develops procedural solutions to shading and lighting, currently experimenting with Physically Plausible Shading and Image Based Lighting. He currently resides in Vancouver, BC, Canada.
Procedural Variation - Part 1
We jump right into our first topics: procedural variation. We bring up two great examples of procedural variation in action. a rust/metals shaders and a treeleaf shader that I developed for the Disney feature film "Mars Needs Moms". We outline the "id's" needed in the modelling pipeline that the shaders pickup in order to drive our procedural variation: we launch Houdini and show how these id's are put into our treeleaf example. We then look at the Renderman RIB file that Houdini generated from our scene, and see the id's attached to each object. We follow with a simple shader example that picks up these id's and creates a noise value for each unique id on each tree leaf.
Procedural Variation - Part 2
We continue on with our procedural variation topic, building on our "Tree Leaf" example. Previously we built a very simple shader that picked up our "id" from the RIB file, in this lesson we build a more comprehensive treeleaf shader that uses this id to procedurally vary aspects of our shading. We can vary the hue of the leaf color, specular roughness, opacity, and any other attribute we chose. We look at the concept of the hue shift in Photoshop, and build it into our shader, and we render from Houdini as well as the RIB file.
Image Based Lighting - Part 1
We start off this section with a discussion of HDRI maps, and how important it is in a Physically Based system to use raw, unclipped maps. We take an example of a map with an unclipped sun captured, examine its values in Photoshp and Houdini's Mplay, and show some renders with it as well as other unclipped HDR's. We look at traditional workflows of clipping the HDR's to 8-bit and the render results and their workaround solutions in production, as well as the shaders involved with this workflow. This sets us up for next lesson where we render the same scene but with PRMan's "Physically Plausible" shaders and lights and see the resulting renders with the same unclipped HDR's.
Taking off from lesson 3 (Image Based Lighting, Part 1), we continue on the topics of Image Based Lighting and Physically Based Shading. We introduce the concept of Multiple Importance Sampling (MIS), where we define importance sampling both the the material BRDF and the physically-based light sources. Moving on, we look at the actual implementation of our concepts in PRMan16+ (16, 17, …) with the new "Physically Plausible Shading" paradigm introduced in PRman16; this includes the new pipeline methods of lighting(), diffuselighting(), and specularlighting(). We render some physically based glass with the factory shipped glass.rib in PRMan, and look into our own physically based scene with our van and our unclipped HDR light sources. In our own scene we achieve our goal of rendering diffuse with no artifacts from a raw unclipped HDR map. Inside our RIB file we go through the new physically plausible shaders (plausibleMatte, plausibleDielectric, plausibleConductor, and plausibleEnvlight).
Continuing on from our last lesson, we use our Physically-Plausible scene in multiple lighting environments to demonstrate how our ONE material setup holds across ALL lighting environments. We then look at how a clipped HDR, or incorrect lighting environment, always leads to material settings that fail to hold across multiple different lighing environments. Thus we argue that you can't "fully tune" a material using the old traditional methods of clipped HDR's and non-Physically-Plausible shading. To gain a deeper understanding of our shading, we explore the details of our plausibleMatte, plausibleDielectric, and other plausible shaders in our scene. We also look at the Fresnel coefficient and how that mixes between our diffuse and specular sampling inside our plauisbleDielectric shader. Finally, we introduce the workflow of cutting out the unclipped sun in 32-bit mode from our HDR texture, and placing it onto an arealight instead - something we will continue in the next lesson.
We continue with our Physically Plausible Shading, and Image Based Lighting project. We move onto the topics of cutting out super bright spots from our HDR and placing it onto an arealight, using the plausibleSunlight shader, and placing it onto another plausibleEnvlight. In our exploration we notice pros and cons of each approach, and look at the shaders and RIB file implementation.
We continue with our Physically Plausible Shading, and Image Based Lighting project. We cover related Ray Tracing topics such as sampling the hemisphere related to cone angle and solid angle. We do a "furnace test" on our scene to confirm normalized BRDF's and energy conservation in our materials and lights.
We start on a new topic, procedurally generated noise patterns for specific techniques in production. This technique can be used for many organic patterns found in nature, we look at a complex ocean shader first in this lesson. We start off with a render of our ocean scene, compare renders with the different noise layers, and talk about the concept of the noise functions, as well as sine and cosine patterns for our base layer ocean. Then we spend some time in Houdini going over our scene, the shader setup for both surface and displacement, and the parameters in the shaders. Finally we look at the concept of modifying our noise call to create a "Sharp Crested" noise layer by applying absolute value calls, inverting and offsetting our noise function.
We continue with our project in procedural noise patterns for our ocean surface and displacement shader. We go step by step through some of the displacement parameters we talked about in the last lesson, and render with changes in each parameter, looking at both the coreocean displacement and the sharp-crested displacement. We look at the source code for a basic FBM layered fractal noise, as well as our modified one we use in the ocean displacement. We also talk about some of the dicing strategy options in PRMan and displacement bound attribute.
In this final lesson of our procedural noise shading section, we continue with our ocean scene. We introduce procedurally generated "whitecaps" to our ocean that are generated based on the vectors of the individual noise layers. We look at a final render animation with the whitecaps, then overview the shader parameters in our Houdini scene, and go into a lesson on the vector math that drives the shading. We also look at our "noise time" parameter for animating our sharpcrests displacement layer. In addition we look at how these very same techniques can be used to simulate other patterns in nature such as snow, and we look at a snow shader with its corresponding renders, as well as the parameters in a Houdini scene.