Chrono::Render Aaron Bartholomew
Problem Requirements • Render huge data sets efficiently and beautifully • Have flexibility to render anything • Make the rendering process streamlined and simple
Raytracing • Conceptually simple • Easy to get complex visual effects without much effort
Raytracing Detriments • Breaks down when scene complexity grows large • Only efficient if you can load the whole scene into memory • Poor memory locality • Any ray can access any object in the scene at any time
What Is RenderMan? • REYES algorithm – Render Everything You Ever Saw • Pixar’sPRMan implementation is considered the industry gold standard of rendering • “Used on every Visual Effects Academy Award Winner of the past 15 years” – pixar.com
Why RenderMan? • Engineered to be as fast, efficient, and configurable as possible • Extremely low memory overhead • Hybrid rendering capabilities • Raytracing on demand • Highly scriptable and controllable
Things RenderMan is Really Good At: Immense Scene Complexity
Things RenderMan is Really Good At: Displacement
Things RenderMan is Really Good At: MotionBlur and Depth Of Field
RenderMan::under the hood • REYES • Dice Primitives to Microgeometry Grids • Shade Microgeometry • Bucket, load only relevant Microgeometry into memory
RenderMan::Shaders • Procedural material definition of how the microgeometry is rendered • Surface, Displacement, Atmosphere, Volume, … • Can do anything • Modular • RenderMan Shading Language (C-like syntax)
RenderMan::RenderPasses • Compute some data that an effect is dependent on • “Pass” over the scene to process the necessary data • Composite the data in another pass to get the final image • Example: Depth Map => Shadow
Render Pass Example: Point-Based Ambient Occlusion
Chrono::Render • RenderMan requires a lot of work to configure and optimize correctly • Need to specify long chains of RenderMan Interface Bytestream calls • Make it easy and more general to configure a quality render, while still enabling flexibility • What is it: C++ processing binaries, simple Python scripting interface, and succinct XML specification
Chrono::Render User Scripts XML Chrono::Render RenderMan Bytestream DATA
Chrono::Render <Settings/> • Salient data for the render process <settings> <!--general render and data settings--> <string name="write_filename" value="cube"/> <string name="write_path" value="./"/> <string name="data_filename" value="pos.dat"/> <string name="data_path" value="/home/aaron/Documents/Programming/Repos/chronoman/test/input/data/rot_euler_y/"/> <string name="data_format" value="id,pos_x,pos_y,pos_z,euler_x,euler_y,euler_z,ignore,ignore,ignore,ignore"/> <string name="delim" value=","/> <string name="searchpath" value="./SHADERS/:/home/aaron/Documents/Programming/Repos/chronoman/share/shaders/:/usr/share/aqsis/shaders/:/usr/share/aqsis/shaders/surface/”/> <vector name="framerange" value="0 0"/> </settings>
Chrono::Render <renderpass/> • Scene definition and outputs <renderpass> <string name="name" value="default_pass"/> <string name="scene" value="./ARCHIVES/default_scene.rib"/> <string name="lighting" value="./ARCHIVES/default_lighting.rib"/> <string name="camera" value="./ARCHIVES/default_camera.rib"/> <vector name="resolution" value="320 320"/> <string name="renderscript" value="AO.py"/> <!---RENDEROBJECTS---> </renderpass>
Chrono::Render <renderobject/> • Data and its appearance <renderobject> <string name="name" value="default"/> <bool name="motionblur" value="0"/> <vector name="range" value="1 1"/> <vector name="color" value="1 1 1"/> <geometry name="sphere"> <float name="radius" value="1"/> </geometry> <shader type="surface" name="bake_areas"> <string name="string filename" value="file"/> <string name="string displaychannels” value="_area"/> </shader> </renderobject>
Chrono::Render Scripting • Python Scripting • Complete control of RIB emission at runtime • Custom-grained Scripting • Write a script for any of the cameras, renderobjects, renderpasses, or lights • Wraps around fast C++ implementation • Really complex effects, very easy and concise
Chrono::Render on RAILS • Bootstrap your render • Generate/Transform scripts, shaders, and xml for commonly desired effects • Example: cman generate test.xml pass ao • Updates XML • Writes AO.py script to project tree • Convert file formats into RenderMan-specific types • Example: cman rib cube.obj • Converts cube.obj & cube.mtl to cube.rib & cube.sl • Adds files to render searchpaths
Live Demo • “Suppose we’ll do it live” – Bill O’Reilly, Fox News
Chrono::Render::Questions::Suggestions