V-Ray RT: A New Paradigm in Photorealistic Raytraced Rendering on NVIDIA s Vladimir Koylazov Chaos Software
V-Ray RT demonstration V-Ray RT demonstration
V-Ray RT architecture overview Goals of V-Ray RT To allow faster iterations and to speed up lookdev To produce final frame output Requirements Interactive response to scene adjustment Distributed rendering Production-oriented features Motion-blur Render elements Various non-physical features (invisible objects, lights etc)
V-Ray RT architecture overview Distributed rendering architecture Modeling app V-Ray translator V-Ray renderer Client machine TCP/IP TCP/IP Render server V-Ray renderer Server machine Render server V-Ray renderer Server machine
V-Ray RT architecture overview Render client Performs initial scene translation to V-Ray plugins Tracks user changes to the scene and records them Holds and displays the frame buffer with the rendered image Render server Downloads the initial scene Receives scene changes and applies them to the local scene Requests data to compute Passes back the results
implementation details The smallest unit of work is an image sample The render server requests a bunch of samples to compute from the render client The samples are uploaded on the calculates the color values for these samples The resulting colors are downloaded and sent back to the render client The render client assembles the samples and displays the final image
implementation details Maximizing the load We need to keep the busy as much as possible We use multiple threads to prepare data for one Each thread uses a separate CUDA stream to work with the Some tasks can be performed in parallel
implementation details Maximizing the load Multiple threads work independently with the same Render client Thread 0 Thread 1 Thread 7 Render server
implementation details The result is that the works constantly on full load CPU CPU 0 CPU 1 CPU 2 CPU CPU 0 CPU 1 CPU CPU 2 CPU 0 CPU CPU 1 CPU 2
Raytracer model Algorithm Unbiased path tracing We could do biased, but not much point in that Adaptive image sampling guided by the CPU (show adaptive mask) Multibounce adaptive sampling is in the works Ray intersections Faster convergence for e.g. caustics Binary kd-tree for non-instanced geometry Motion kd-tree for non-instanced animated geometry (motion blur) BVH + kd-trees for instanced geometry
Raytracer model Example of instanced geometry
Raytracer model Lights Fixed number of light sources (point lights, directional, area lights, dome lights with IBL) Layered BSDF model Fixed number of physically plausible BSDF models Diffuse, Phong, Blinn, Ward, blurry refraction SSS and volumetrics in the works BSDFs can be layered for complex materials Car paint shaders Plastics shaders BSDF properties are controlled through (procedural) textures
Raytracer model Complex car paint material with layered BRDFs
Raytracer model Textures In even simple scenes, texture trees can be very complex Bitmaps, blends, color corrections etc. In C++, this is easy to implement through virtual functions Virtual functions are available in CUDA, but peformance is not very good They are not available in OpenCL Our solution: a very simple stack-based high-level virtual machine which interprets texture shaders on the A complex texture tree is compiled into a sequence of texture VM instructions Each V-Ray texture plugin can provide its description as instructions for the texture VM A bitmap read is one single texture VM instruction
Raytracer model An example of a complex texture tree
Raytracer model One-pass render elements Utility elements: Z-depth, normal Lighting elements: Direct lighting, GI Material elements: Diffuse, reflections, refractions Frame buffers are not stored on the, so large resolution renders are possible
Raytracer model One-pass render elements
Questions????