Production Volume Rendering: Design and Implementation

Production Volume Rendering: Design and Implementation

Magnus Wrenninge

Language: English

Pages: 355

ISBN: 156881724X

Format: PDF / Kindle (mobi) / ePub


Due to limited publicly available software and lack of documentation, those involved with production volume rendering often have to start from scratch creating the necessary elements to make their system work. Production Volume Rendering: Design and Implementation provides the first full account of volume rendering techniques used for feature animation and visual effects production. It covers the theoretical underpinnings as well as the implementation of a working renderer.

The book offers two paths toward understanding production volume rendering. It describes:

  • Modern production volume rendering techniques in a generic context, explaining how the techniques fit together and how the modules are used to achieve real-world goals
  • Implementation of the techniques, showing how to translate abstract concepts into concrete, working code and how the ideas work together to create a complete system

As an introduction to the field and an overview of current techniques and algorithms, this book is a valuable source of information for programmers, technical directors, artists, and anyone else interested in how production volume rendering works.

Web Resource
The scripts, data, and source code for the book’s renderer are freely available at https://github.com/pvrbook/pvr. Readers can see how the code is implemented and acquire a practical understanding of how various design considerations impact scalability, extensibility, generality, and performance.

 

 

 

 

 

 

 

 

 

 

exactly that routine. For the three-dimensional case, we simply call the existing function, rather than implementing it again. Code 3.11. Implementing nearest-neighbor interpolation in three dimensions float nearest3D(const Imath::V3f &vsP, const VoxelBuffer &buf) { // Convert voxel-space coordinates to discreet voxel-space coordinates V3i dvsP = contToDisc(vsP); return buf.value(dvsP.x, dvsP.y, dvsP.z); } 3.5.2 Linear Interpolation For interpolation schemes that actually do compute in-between

what the density of each primitive is at a given point in space. The control method for placing the primitive in the buffer is independent of the rasterization process, and anything from no geometry through points to splines may be used as the underlying geometric primitive. In pseudocode, the rasterization algorithm has the following structure: Code 5.1. Simplified rasterization loop for (int k = 0; k < kMax; k++) { for (int j = 0; j < jMax; j++) { for (int i = 0; i < iMax; i++) { Vector

primitives also make them simpler to implement. 8.1 Instantiation Primitives, 80 Modeler, 92 The InstantiationPrim Base Class Instantiation primitives (Section 5.5) inherit from the InstantiationPrim base class. It requires nothing from its subclasses apart from the execute() call, which generates new input to the Modeler, based on the instantiation primitive’s inputs and parameters. Code 8.1. The InstantiationPrim base class class InstantiationPrim : public Primitive { public: // Typedefs

the following equations, the incoming radiance from a light source S is a function of a point p and the direction to the light source ω . The scattering coefficient σs tells us how much of the light is likely to scatter over a given length, but we also need to know how much of the light actually scatters towards the observer, as compared to all of the other possible directions. The function that describes the relationship is called the phase function. The phase function is denoted p(ω, ω ), and

classes modeler = Modeler() parts = Particles() geo = Geometry() prim = Prim.Rast.PyroclasticPoint() input = ModelerInput() The particles object is configured with a single point, which by default sits at the origin. The particles instance is then hooked up to the geometry container, and the two are added to the modeler input along with the volume primitive. In a normal render, the volumetric primitive would be configured with a set of attributes to drive its appearance. In this simple example

Download sample

Download