This page gives a quick overview of the App SDK and introduces you to the general topic of photorealistic rendering.
I. Introduction The V-Ray Application SDK allows third-party integrators to initiate and control a rendering process that makes use of the V-Ray engine. It provides a high-level API that enables users to render and manipulate a V-Ray scene inside the host process or outside it using distributed rendering . The scene may be created in memory by translating the native format to V-Ray plugins or it could be loaded from a file, potentially exported from another application.
II. Setup In order to use V-Ray Application SDK, the VRAY_SDK environment variable should be set. To use the Python binding, the python folder must be in the Python module load paths (e.g. by adding it to PYTHONPATH).
The setenv script will set both environment variables. To use it run from the corresponding command line tool:
setenv.bat (Windows) source setenv.sh (Linux/macOS) When VRAY_SDK is set, the App SDK binding will search for the VRaySDKLibrary binary and its dependencies inside VRAY_SDK/bin. If the directory structure of a product that uses App SDK doesn’t include the binaries inside a /bin folder, VRAY_APPSDK_BIN can be used instead of VRAY_SDK. In that case, the App SDK binding will try to load the binaries directly from the folder that VRAY_APPSDK_BIN points at.
In the case that no environment variables could be used, the App SDK API allows setting the search path at runtime. Please read the API documentation for the corresponding binding.
III. Package Contents bin - V-Ray core binaries. Includes the V-Ray Application SDK library cpp - C++ header files dotnet - .NET Framework 4.0 (Mono) V-Ray Application SDK DLLs dotnetcore - .NET Core 3.1 V-Ray Application SDK DLLs examples - Code samples for all supported languages help - SDK documentation and API guide for offline use node - Node.JS and Electron V-Ray Application SDK module/binding python - Python V-Ray Application SDK module scenes - Sample scenes made by Chaos tools - V-Ray tools for viewing/converting assets etc. setenv.bat/sh - script that sets up a local environment for running the V-Ray Application SDK. To use it, invoke a script in a command window (in bash use "source setenv.sh"). It will update the environment variables needed by the SDK. IV. Basic Rendering The V-Ray Application SDK exposes a VRayRenderer class that initiates and controls any rendering process. The class defines high-level methods for creating or loading a V-Ray scene and rendering it. It hides the inner complexities of the V-Ray engine while keeping its powerful capabilities.
The basic workflow for starting a render process usually consists of the following steps:
Instantiating the configurable VRayRenderer class Either of (or even a combination of):Creating new instances of V-Ray render plugins to translate your native scene description to V-Ray and setting their parameters Loading a scene by specifying a path to a .vrscene file (the V-Ray native format for serializing scenes) Invoking the method for rendering Waiting for the image to become available Cleaning up memory resources by closing the VRayRenderer All language implementations of the VRayRenderer class offer a method without arguments (start()) that is used to start the rendering of the currently loaded scene. The method is a non-blocking call which internally runs the V-Ray engine in a separate thread. Thus the rendering can conveniently take place as a background process without the need to use language-specific tools for creating threads.
The VRayRenderer class gives access to the current state of the rendered image at any point in time. Whether the render process has finished or not, an image can be extracted to track the progress of the rendering. All language bindings expose a method that returns an image object which holds the rendered image data at the time of the request. This image class can be used for direct display or to save the rendered image to a file in one of several supported popular compression formats.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">import vray</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('intro.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start() </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image = renderer.getImage()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.save('intro.png')</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#include "vraysdk.hpp"</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using namespace VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> LocalVRayImage image(renderer.getImage());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image->saveToPng("intro.png");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Start(); </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayImage image = renderer.GetImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.SaveToPNG("intro.png");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var vray = require('vray');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('intro.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start(function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var image = renderer.getImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.save('intro.png', function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
V. Render Modes The V-Ray Application SDK offers the ability to run the V-Ray engine in two distinct render modes - Production and Interactive.
Production mode is suitable for obtaining the final desired image after the scene has been carefully configured as the render process can take a lot of time before the whole image is available.
Interactive mode on the other hand is very useful for fast image preview and progressive image quality improvement which makes it the perfect choice for experimenting with scene settings and modifying content and receiving fast render feedback.
Each render mode is supported in two flavors - CPU and GPU. The former utilizes the CPU resources while the latter takes advantage of the graphics card computing power. The GPU rendering type is in turn subdivided into two modes - CUDA and Optix (both NVIDIA only) depending on the technology that is used with the GPU.
The type of rendering that will be initiated can be chosen easily through the renderMode property of the VRayRenderer object. The default render mode for the VRayRenderer class is Interactive (CPU). The render mode can be changed between renders to avoid having to re-create or re-load the scene. This allows you to work interactively on a scene with V-Ray and then to switch to production mode for final rendering without any overhead.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.renderMode = 'production'</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('intro.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image = renderer.getImage()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.save('intro.png')</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.setRenderMode(VRayRenderer::RenderMode::RENDER_MODE_PRODUCTION);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.waitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">LocalVRayImage image(renderer.getImage());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">image->saveToPng("intro.png");</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.RenderMode = RenderMode.PRODUCTION;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Start(); </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayImage image = renderer.GetImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.SaveToPNG("intro.png");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.renderMode = 'production';</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('intro.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start(function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var image = renderer.getImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.save('intro.png', function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
VI. Common Events During the rendering process that runs in the background in a separate thread V-Ray emits a number of events that are available to App SDK users. You can subscribe to these events through the main VRayRenderer class.
The V-Ray Application SDK provides the means for attaching callbacks that execute custom client logic when an event occurs. The code of the callbacks is executed in a separate thread that is different from the main V-Ray rendering thread. This design allows the V-Ray rendering process to remain fast without additional overhead and ensures that slow operations in client callback code will not affect the total rendering time. Keep in mind that slow user callbacks may delay the execution of other callbacks. Each callback includes a time 'instant' argument that gives you the exact time the event ocurred. The callback itself may be executed at a noticeably different moment due to queueing and being asynchronous.
The events can be broadly classified into three types: events common for all render modes, events specific to bucket rendering and events specific to progressive rendering. This section covers the events that are emitted regardless of the type of sampling.
The common render events occur when:
The renderer state changes (e.g. starts rendering, stops rendering) V-Ray outputs text messages prior to and during rendering V-Ray switches the current task (e.g. loading, rendering) and reports progress percentage State Changed Event The state change event is emitted every time the renderer transitions from one state to another, such as when starting to render, when the image is done or when an error occurs and it stopped. This is the main point to implement user logic related to initiating and completing renders.
Unless startSync() is used instead of the asynchronous start() method, no changes should be made to the scene and renderer while in the PREPARING state before transitioning out of it. Attempting to make changes will be rejected.
The final image is available when the renderer gets to the IDLE_DONE state. Intermediate images are also available during rendering.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">def onStateChanged(renderer, oldState, newState, instant):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('State changed from', oldState, 'to', newState)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnStateChanged(onStateChanged) </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('intro.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start() </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void onStateChanged(VRayRenderer& renderer, RendererState oldState, RendererState newState, double instant, void* userData) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("State changed from %d to %d\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", oldState, newState);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnStateChanged(onStateChanged);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.StateChanged += new EventHandler<StateChangedEventArgs>((source, e) =></span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("State changed from {0} to {1}", e.OldState, e.NewState);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.on('stateChanged', function(oldState, newState, instant) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('State changed from ' + oldState + ' to ' + newState);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('intro.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err; </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start(function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
Log Message Event Output messages are produced by the V-Ray engine during scene loading and rendering and they can be captured by subscribing to the message log event. The callback data that becomes available when a message is logged is the text of the message and the log level type (info, warning or error).
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">def onLogMessage(renderer, message, level, instant):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if level == vray.LOGLEVEL_ERROR:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print("[ERROR]", message)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> elif level == vray.LOGLEVEL_WARNING:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print("[Warning]", message)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> elif level == vray.LOGLEVEL_INFO:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print("[info]", message)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Uncomment for testing, but you might want to ignore these in real code</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> #else: print("[debug]", message)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnLogMessage(onLogMessage)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # ...</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void onLogMessage(VRayRenderer &renderer, const char* message, MessageLevel level, double instant, void* userData) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> switch (level) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> case MessageError:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("[ERROR] %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", message);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> break;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> case MessageWarning:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("[Warning] %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", message);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> break;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> case MessageInfo:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("[info] %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", message);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> break;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> case MessageDebug:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Uncomment for testing, but you might want to ignore these in real code</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> //printf("[debug] %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", message);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> break;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnLogMessage(onLogMessage);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // ...</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.LogMessage += new EventHandler<MessageEventArgs>((source, e) =></span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // You can remove the if for testing, but you might want to ignore Debug in real code</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (e.LogLevel != LogLevelType.Debug)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine(String.Format("[{0}] {1}", e.LogLevel.ToString(), e.Message));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // ...</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.on('logMessage', function(message, level, instant) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (level == vray.LOGLEVEL_ERROR)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log("[ERROR] ", message);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> else if (level == vray.LOGLEVEL_WARNING)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log("[Warning] ", message);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> else if (level == vray.LOGLEVEL_INFO)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log("[info] ", message);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Uncomment for testing, but you might want to ignore these in real code</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> //else console.log("[debug] ", message);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// ...</span></code>
Progress Event Progress events are emitted whenever the current task changes and also when the amount of work done increases. They include a short message with the current task name and two numbers for the total amount of work to do and the work that is already complete.
Here are short examples how to report progress in percentage:
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">def printProgress(renderer, msg, progress, total, instant):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Progress: {0} {1}%'.format(msg, round(100.0 * progress / total, 2)))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnProgress(printProgress)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # render ...</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void printProgress(VRay::VRayRenderer &renderer, const char* message, int progress, int total, double instant, void* userData) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Progress: %s %.2f%%\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", message, 100.0 * progress / total);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // ...</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnProgress(printProgress);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // render ...</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">renderer.Progress += new EventHandler<ProgressEventArgs>((source, e) =></span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine(String.Format("Progress: {0} {1}%", e.Message, 100.0 * e.Progress / e.Total));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// render ...</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var printProgress = function(message, progress, total, instant) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Progress: ' + message + (100.0 * progress / total).toFixed(2) + '%');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.on('progress', printProgress);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// render ...</span></code>
VII. Bucket Events There are two types of image sampling in Production mode - "bucket" sampling and progressive sampling. Bucket rendering splits the image into small rectangular sub-images, each processed independently by a different local CPU thread or network server (see the Distributed Rendering section). The sub-images are only returned when completely ready. Progressive rendering works the same way as in Interactive mode - the whole image is sampled and images are returned for each sampling pass, reducing noise with each pass. This section covers the events which are specific to Production bucket rendering only. The progressive sampling mode emits the event described in the Progressive Events section further below.
There are two phases in Production bucket rendering - assigning a bucket to a render host (or local thread) and rendering the assigned region of the image. This is why there are two events that are raised for each bucket of the image - initializing a bucket and receiving the image result. Users of the API can subscribe to the events via the main VRayRenderer class.
In Production bucket mode the image is perceived as a grid of rectangular regions, "buckets". The bucket is uniquely identified by the coordinates of its top left corner and the width and height of its rectangular region. The top left corner of the whole image has coordinates (0, 0).
To enable bucket sampling, the VRayRenderer’s render mode must be production and SettingsImageSampler::type=1.
Bucket Init Event The bucket init event is raised when the main V-Ray thread assigns a bucket to a network render host or local thread. The callback data that is provided for this event is the bucket size and coordinates as well as the name of the render host (if any) as it appears on the network.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">def onBucketInit(renderer, bucket, passType, instant):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Starting bucket:')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('\ x: ', bucket.x)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('\ y: ', bucket.y)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('\ width: ', bucket.width)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('\ height:', bucket.height)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('\ host:', bucket.host)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.renderMode = 'production'</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnBucketInit(onBucketInit)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('intro.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Set the sampler type to adaptive(buckets).</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sis = renderer.classes.SettingsImageSampler.getInstanceOrCreate()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sis.type = 1</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Disable light cache so we get buckets straight away.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sgi = renderer.classes.SettingsGI.getInstanceOrCreate()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sgi.secondary_engine = 2</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd()</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using namespace VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using namespace VRay::Plugins;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void onBucketInit(VRayRenderer& renderer, int x, int y, int width, int height</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> , const char* host, ImagePassType pass, double instant, void* userData) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Starting bucket:\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("\ x: %d\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", x);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("\ y: %d\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", y);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("\ width: %d\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", width);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("\ height: %d\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", height);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("\ host: %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", host);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setRenderMode(VRayRenderer::RenderMode::RENDER_MODE_PRODUCTION);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnBucketInit(onBucketInit);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Set the sampler type to adaptive (buckets).</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> SettingsImageSampler sis = renderer.getInstanceOrCreate<SettingsImageSampler>();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sis.set_type(1);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Stop LC calculation, so we get buckets immediately.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> SettingsGI sgi = renderer.getInstanceOrCreate<SettingsGI>();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sgi.set_secondary_engine(2);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using VRay.Plugins;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.RenderMode = RenderMode.PRODUCTION;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.BucketInit += new EventHandler<BucketRegionEventArgs>((source, e) =></span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("Starting bucket:");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("\ x:" + e.X);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("\ y:" + e.Y);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("\ width:" + e.Width);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("\ height:" + e.Height);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("\ host:" + e.Host);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Set the sampler type to adaptive (buckets).</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> SettingsImageSampler sis = renderer.GetInstanceOrCreate<SettingsImageSampler>();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sis.SettingsImageSamplerType = 1;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Stop LC calculation, so we get buckets immediately.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> SettingsGI sgi = renderer.GetInstanceOrCreate<SettingsGI>();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sgi.SecondaryEngine = 2;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.renderMode = 'production';</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.on('bucketInit', function(region, passType, instant) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Starting bucket:');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('\ x:' + region.x);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('\ y:' + region.y);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('\ width:' + region.width);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('\ height:' + region.height);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('\ host:' + region.host);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('intro.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Set the sampler type to adaptive(buckets).</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var sis = renderer.classes.SettingsImageSampler.getInstanceOrCreate();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sis.type = 1;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Disable light cache so we get buckets straight away.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var sgi = renderer.classes.SettingsGI.getInstanceOrCreate();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sgi.secondary_engine = 2;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start(function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
Bucket Ready Event The bucket ready event is raised when the render host that has been assigned a bucket has finished rendering the part of the image and has sent its result to the main V-Ray thread. The returned callback data for the event contains the size and coordinates of the region, the render host name and the produced image.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">def onBucketReady(renderer, bucket, passType, instant):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Bucket ready:')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('\ x: ', bucket.x)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('\ y: ', bucket.y)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('\ width: ', bucket.width)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('\ height:', bucket.height)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('\ host:', bucket.host)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> fileName = 'intro-{0}-{1}.png'.format(bucket.x, bucket.y)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> bucket.save(fileName)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.renderMode = 'production'</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnBucketReady(onBucketReady)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('intro.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Set the sampler type to adaptive(buckets).</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sis = renderer.classes.SettingsImageSampler.getInstanceOrCreate()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sis.type = 1</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Disable light cache so we get buckets straight away.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sgi = renderer.classes.SettingsGI.getInstanceOrCreate()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sgi.secondary_engine = 2</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd()</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using namespace VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using namespace VRay::Plugins;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void onBucketReadyCallback(VRayRenderer& renderer, int x, int y, const char* host</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> , VRayImage* image, ImagePassType pass, double instant, void* userData) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Bucket ready:\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("\ x: %d\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", x);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("\ y: %d\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", y);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("\ width: %d\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", image->getWidth());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("\ height: %d\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", image->getHeight());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("\ host: %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", host);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> char fileName[64];</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sprintf(fileName, "intro-%d-%d.png", x, y);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image->saveToPng(fileName);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setRenderMode(VRayRenderer::RenderMode::RENDER_MODE_PRODUCTION);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnBucketReady(onBucketReadyCallback);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Set the sampler type to adaptive (buckets).</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> SettingsImageSampler sis = renderer.getInstanceOrCreate<SettingsImageSampler>();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sis.set_type(1);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Stop LC calculation, so we get buckets immediately.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> SettingsGI sgi = renderer.getInstanceOrCreate<SettingsGI>();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sgi.set_secondary_engine(2);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using VRay.Plugins;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.RenderMode = RenderMode.PRODUCTION;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.BucketReady += new EventHandler<BucketImageEventArgs>((source, e) =></span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("Bucket ready:");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("\ x:" + e.X);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("\ y:" + e.Y);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("\ width:" + e.Width);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("\ height:" + e.Height);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("\ host:" + e.Host);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayImage image = e.Image;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.SaveToPNG(string.Format("intro-{0}-{1}.png", e.X, e.Y));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.Dispose();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Set the sampler type to adaptive (buckets).</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> SettingsImageSampler sis = renderer.GetInstanceOrCreate<SettingsImageSampler>();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sis.SettingsImageSamplerType = 1;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Stop LC calculation, so we get buckets immediately.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> SettingsGI sgi = renderer.GetInstanceOrCreate<SettingsGI>();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sgi.SecondaryEngine = 2;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.renderMode = 'production';</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.on('bucketReady', function(bucket, passType, instant) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Bucket ready:');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('\ x:' + bucket.x);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('\ y:' + bucket.y);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('\ width:' + bucket.width);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('\ height:' + bucket.height);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('\ host:' + bucket.host);</span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var fileName = 'intro-' + bucket.x + '-' + bucket.y + '.png'</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> bucket.save(fileName, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> bucket.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('intro.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Set the sampler type to adaptive(buckets).</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var sis = renderer.classes.SettingsImageSampler.getInstanceOrCreate();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sis.type = 1;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Disable light cache so we get buckets straight away.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var sgi = renderer.classes.SettingsGI.getInstanceOrCreate();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sgi.secondary_engine = 2;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start(function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
VIII. Progressive Events When rendering in Interactive mode or in Production with the image sampler set for progressive sampling (instead of buckets), the whole image is sampled at once and the progressiveImageUpdated event is emitted for each sampling pass with a more refined image. The purpose of Interactive mode is to allow users to receive fast feedback for the scene they have configured. Noisy images are quickly available when the Interactive render process starts.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">counter = 0</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">def onImageUpdated(renderer, image, index, passType, instant):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> global counter</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> counter += 1</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> fileName = 'intro-{0}.jpeg'.format(counter)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.save(fileName)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnProgressiveImageUpdated(onImageUpdated)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('intro.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd()</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">int counter = 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void onImageUpdated(VRayRenderer& renderer, VRayImage* image</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> , unsigned long long index, ImagePassType passType, double instant, void* userData) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> char fileName[64];</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sprintf(fileName, "intro-%d.jpeg", ++counter);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image->saveToJpeg(fileName);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnProgressiveImageUpdated(onImageUpdated);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> int counter = 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.ProgressiveImageUpdated += new EventHandler<VRayImageEventArgs>((source, e) => </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> string fileName = string.Format("intro-{0}.jpeg", ++counter);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> e.Image.SaveToJPEG(fileName);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> e.Image.Dispose();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">var counter = 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.on('progressiveImageUpdated', function(image, index, passType, instant) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var fileName = 'intro-' + (++counter) + '.jpeg';</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.save(fileName, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('intro.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err; </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start(function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
IX. V-Ray Images The VRayImage class provides access to the images rendered by V-Ray. It is used by the VRayRenderer, as well as by some of the arguments of the callbacks invoked when an event occurs. The VRayImage class provides utility functions for manipulating the retrieved binary image data. The binary data is in full 32-bit float per channel format and can be accessed directly, but there are convenience methods that perform compression in several of the most popular 8-bit formats - BMP, JPEG, PNG. Saving EXR and other high dynamic range formats is also possible through another API: VRayRenderer.vfb.saveImage().
The methods that are exposed by the VRayImage class come in two flavors. The first group of methods directly returns the bytes of the compressed image, while the second group compresses the image and saves it to a file.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('intro.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image = renderer.getImage()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> data = image.compress(type='png')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> with open('intro_compressTo.png', 'wb') as outStream:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> outStream.write(data)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.save("intro_saveTo.png")</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">VRayRenderer renderer; </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.waitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">VRayImage* image = renderer.getImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">size_t imageSize;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">Png* png = image->compressToPng(imageSize);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">ofstream outputStream("intro_compressTo.png", ofstream::binary);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">outputStream.write((char*)png->getData(), imageSize);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">outputStream.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">delete png;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">bool res = image->saveToPng("intro_saveTo.png");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">delete image;</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> using (VRayImage image = renderer.GetImage())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> byte[] data = image.CompressToPNG();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> using (FileStream outStream = new FileStream("intro_compressTo.png", FileMode.Create, FileAccess.Write))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> outStream.Write(data, 0, data.Length);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.SaveToPNG("intro_saveTo.png");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var fs = require('fs');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('intro.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start(function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function () {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var image = renderer.getImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.compress('png', function (err, buffer) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> fs.writeFile('intro_compressTo.png', buffer, function () {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.save('intro_saveTo.png', function () {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
All instances of the VRayImage class must be closed so that memory resources held by the instance are released. It is recommended to always free the resources (close the image) when you have finished working with the image. The platforms that support a garbage collection mechanism will take care of freeing the internally held resources in the event that the user does not close the retrieved image.
Downscaling In addition to the utility methods for compression, the VRayImage class supports downscale operations that resize the retrieved image to a smaller one. The result of the downscale operations is another VRayImage instance which has all the utility methods of the class.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('intro.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image = renderer.getImage()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> downscaled = image.getDownscaled(260, 180)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> downscaled.save('intro.png')</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">VRayRenderer renderer; </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.waitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// LocalVRayImage is a variation of VRayImage to be created on the stack, so that the image gets auto-deleted</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">LocalVRayImage image = renderer.getImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">LocalVRayImage downscaled = image->getDownscaled(260, 180);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">downscaled->saveToPng("intro.png");</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> using (VRayImage image = renderer.GetImage())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> using (VRayImage downscaled = image.GetDownscaled(260, 180))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> downscaled.SaveToPNG("intro.png");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('intro.vrscene', function (err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start(function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err; </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function () {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var image = renderer.getImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.getDownscaled(260, 180, function(downscaled) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> downscaled.save('intro.png', function() { </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> downscaled.close(); // Not mandatory, can be left to the garbage collector</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.close(); // Not mandatory, can be left to the garbage collector</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
Changing the Image Size The size of the rendered image can be controlled through the size property of the VRayRenderer class. When a ".vrscene" file is loaded the size defined in this scene file is used unless the VRayRenderer size is set after loading the file to override it.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('intro.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.size = (640, 360)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image = renderer.getImage()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.save('intro.png')</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">VRayRenderer renderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.setImageSize(640, 360);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.waitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">LocalVRayImage image = renderer.getImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">image->saveToPng("intro.png");</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("intro.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.SetImageSize(640, 360);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> using (VRayImage image = renderer.GetImage())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.SaveToPNG("intro.png");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('intro.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.size = {width: 640, height: 360};</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start(function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var image = renderer.getImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.save('intro.png', function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
X. Render Elements V-Ray Render Elements (also known as Render Channels or Arbitrary Output Variables, AOVs) are images containing various types of render data encoded as 3-element color, single floats or integers. Some of them are Z-depth, surface normal, UV coordinates, velocity, lighting, reflections etc. Each V-Ray scene may contain an arbitrary number of render elements (also called channels). Each channel is enabled by a unique plugin, except for the RGB and Alpha channels, which are always enabled.
To access the render elements in the current scene, use the VRayRenderer instance where the scene is loaded. Each render element's data can be taken either as a VRayImage, or as raw data (as byte, integer, or float buffers). Optionally, provide a sub-region of interest to the APIs to get that part of the data.
If the scene does not contain render element plugins, they could be added, as shown in the examples.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line"># Compatibility with Python 2.7.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">from __future__ import print_function</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"># The directory containing the vray shared object should be present in the PYTHONPATH environment variable.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"># Try to import the vray module from VRAY_SDK/python, if it is not in PYTHONPATH</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">import sys, os</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">VRAY_SDK = os.environ.get('VRAY_SDK')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">if VRAY_SDK:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sys.path.append(os.path.join(VRAY_SDK, 'python'))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">import vray</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">SCENE_PATH = os.path.join(os.environ.get('VRAY_SDK'), 'scenes')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"># Change process working directory to SCENE_PATH in order to be able to load relative scene resources.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">os.chdir(SCENE_PATH)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">def addExampleRenderElements(renderer):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager = renderer.renderElements</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # In Python and JS we use strings:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('All render element (channel) identifiers:')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print(reManager.getAvailableTypes())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # The RGB channel is always present. It is often referred to as "Beauty" by compositors</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Alpha is also always included</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # --- BEAUTY ELEMENTS ---</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # "Beauty" elements are the components that make up the main RGB channel,</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # such as direct and indirect lighting, specular and diffuse contributions and so on.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Light bounced from diffuse materials (layers)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('diffuse')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Light from glossy reflections</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('reflection')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Refracted light</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('refraction')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Light from perfect mirror reflections</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('specular')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Subsurface scattered light</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('sss')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Light from self-illuimnating materials</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('self_illumination')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Global illumination, indirect lighting</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('gi')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Direct lighting</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('lighting')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Sum of all lighting</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('total_light')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Shadows, combined with diffuse. Shadowed areas are brighter</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('shadow')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Reflected light if surfaces were fully reflective</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('raw_reflection')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Refracted light if surfaces were fully refractive</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('raw_refraction')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Attenuation factor for reflections. Refl = ReflFilter * RawRefl</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('reflection_filter')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Attenuation factor for refractions. Refr = RefrFilter * RawRefr</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('refraction_filter')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Intensity of GI before multiplication with the diffuse filter</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('raw_gi')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Direct lighting without diffuse color</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('raw_light')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Sum light without diffuse color</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('raw_total_light')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Shadows without the diffuse factor</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('raw_shadow')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Grayscale material glossiness values</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('reflection_glossiness')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Glossiness for highlights only</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('reflection_hilight_glossiness')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # --- MATTE ELEMENTS ---</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Matte elements are used for masking out parts of the frame when compositing.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Color is based on material ID, see MtlMaterialID plugin</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('material_id')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Color is based on the objectID of each Node</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('node_id')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # --- GEOMETRIC ELEMENTS ---</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Geometric data such as normals and depth has various applications</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # in compositing and post-processing.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # The pure geometric normals, encoded as R=X, G=Y, B=Z</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('normals')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Normals after bump mapping</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('bump_normals')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Normalized grayscale depth buffer</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('z_depth')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # The per-frame velocity of moving objects</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('velocity')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"># Create an instance of VRayRenderer for production render mode. The renderer is automatically closed after the `with` block.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.renderMode = 'production'</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Load scene from a file.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load(os.path.join(SCENE_PATH, 'cornell_new.vrscene'))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # This will add the necessary channel plugins to the scene</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> addExampleRenderElements(renderer)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # This will save all the channels with suffixed file names</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('>>> Saving all channels')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.vfb.saveImage('cornell_RE.png')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> diffuseRE = renderer.renderElements.get('diffuse')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # If the diffuse render element is missing it will evaluate to false</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if diffuseRE:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> diffusePlugin = diffuseRE.plugin</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('>>> Saving inverted JPG from plugin {0} {1}'.format(diffusePlugin.getType(), diffusePlugin.getName()))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image = diffuseRE.getImage()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if image:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.makeNegative()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.save('cornell_inv_diffuse_VRayImage.jpg')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"># The renderer object is unusable after closing since its resources are freed. </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"># It should be released for garbage collection.</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#include "vraysdk.hpp"</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">#include "vrayplugins.hpp"</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using namespace VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using namespace VRay::Plugins;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using namespace std;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">const char *BASE_PATH = getenv("VRAY_SDK");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">string SCENE_PATH = (BASE_PATH ? string(BASE_PATH) : string(".")) + PATH_DELIMITER + "scenes";</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void addExampleRenderElements(VRayRenderer &renderer) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> RenderElements reManager = renderer.getRenderElements();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The RGB channel is always present. It is often referred to as "Beauty" by compositors</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Alpha is also always included</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Beauty elements</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Light bounced from diffuse materials (layers)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::DIFFUSE, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Light from glossy reflections</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::REFLECT, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Refracted light</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::REFRACT, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Light from perfect mirror reflections</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::SPECULAR, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Subsurface scattered light</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::SSS, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Light from self-illuimnating materials</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::SELFILLUM, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Global illumination, indirect lighting</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::GI, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Direct lighting</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::LIGHTING, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Sum of all lighting</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::TOTALLIGHT, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Shadows, combined with diffuse. Shadowed areas are brighter</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::SHADOW, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Reflected light if surfaces were fully reflective</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::RAW_REFLECTION, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Refracted light if surfaces were fully refractive</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::RAW_REFRACTION, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Attenuation factor for reflections. Refl = ReflFilter * RawRefl</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::REFLECTION_FILTER, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Attenuation factor for refractions. Refr = RefrFilter * RawRefr</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::REFRACTION_FILTER, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Intensity of GI before multiplication with the diffuse filter</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::RAWGI, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Direct lighting without diffuse color</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::RAWLIGHT, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Sum light without diffuse color</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::RAWTOTALLIGHT, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Shadows without the diffuse factor</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::RAWSHADOW, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Grayscale material glossiness values</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::VRMTL_REFLECTGLOSS, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Glossiness for highlights only</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::VRMTL_REFLECTHIGLOSS, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Matte elements</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Color is based on material ID, see MtlMaterialID plugin</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::MTLID, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Color is based on the objectID of each Node</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::NODEID, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Geometric elements</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The pure geometric normals, encoded as R=X, G=Y, B=Z</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::NORMALS, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Normals after bump mapping</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::BUMPNORMALS, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Normalized grayscale depth buffer</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::ZDEPTH, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The per-frame velocity of moving objects</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add(RenderElement::VELOCITY, NULL, NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Change process working directory to SCENE_PATH in order to be able to load relative scene resources.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> changeCurrentDir(SCENE_PATH.c_str());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setRenderMode(VRayRenderer::RENDER_MODE_PRODUCTION);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Load scene from a file.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // This will add the necessary channel plugins to the scene</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> addExampleRenderElements(renderer);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // This will save all the channels with suffixed file names</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf(">>> Saving all channels\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.vfb.saveImage("cornell_RE.png");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> RenderElement diffuseRE = renderer.getRenderElements().get(RenderElement::DIFFUSE);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // If the diffuse render element is missing it will evaluate to false</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (diffuseRE) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Plugin diffusePlugin = diffuseRE.getPlugin();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf(">>> Saving inverted JPG from plugin %s %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", diffusePlugin.getType(), diffusePlugin.getName());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayImage *image = diffuseRE.getImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (image) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image->makeNegative();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image->saveToJpeg("cornell_inv_diffuse_VRayImage.jpg");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> delete image;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using System;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using System.IO;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using VRay.Plugins;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">namespace _render_elements</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> class Program</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> private static void addExampleRenderElements(VRayRenderer renderer)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> RenderElements reManager = renderer.RenderElements;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> /// --- "BEAUTY" ELEMENTS --- ///</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> /// "Beauty" elements are the components that make up the main RGB channel,</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> /// such as direct and indirect lighting, specular and diffuse contributions and so on.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The RGB channel is always present. It is often referred to as "Beauty" by compositors</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Alpha is also always included</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Light bounced from diffuse materials (layers)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.DIFFUSE, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Light from glossy reflections</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.REFLECT, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Refracted light</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.REFRACT, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Light from perfect mirror reflections</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.SPECULAR, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Subsurface scattered light</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.SSS, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Light from self-illuimnating materials</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.SELFILLUM, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Global illumination, indirect lighting</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.GI, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Direct lighting</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.LIGHTING, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Sum of all lighting</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.TOTALLIGHT, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Shadows, combined with diffuse. Shadowed areas are brighter</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.SHADOW, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Reflected light if surfaces were fully reflective</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.RAW_REFLECTION, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Refracted light if surfaces were fully refractive</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.RAW_REFRACTION, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Attenuation factor for reflections. Refl = ReflFilter * RawRefl</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.REFLECTION_FILTER, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Attenuation factor for refractions. Refr = RefrFilter * RawRefr</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.REFRACTION_FILTER, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Intensity of GI before multiplication with the diffuse filter</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.RAWGI, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Direct lighting without diffuse color</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.RAWLIGHT, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Sum light without diffuse color</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.RAWTOTALLIGHT, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Shadows without the diffuse factor</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.RAWSHADOW, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Grayscale material glossiness values</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.VRMTL_REFLECTGLOSS, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Glossiness for highlights only</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.VRMTL_REFLECTHIGLOSS, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> /// --- MATTE ELEMENTS --- ///</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> /// Matte elements are used for masking out parts of the frame when compositing.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Color is based on material ID, see MtlMaterialID plugin</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.MTLID, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Color is based on the objectID of each Node</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.NODEID, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> /// --- GEOMETRIC ELEMENTS --- ///</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> /// Geometric data such as normals and depth has various applications in compositing and post-processing.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The pure geometric normals, encoded as R=X, G=Y, B=Z</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.NORMALS, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Normals after bump mapping</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.BUMPNORMALS, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Normalized grayscale depth buffer</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.ZDEPTH, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The per-frame velocity of moving objects</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.Add(RenderElementType.VELOCITY, "", "");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> static void Main(string[] args)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> string SCENE_PATH = Path.Combine(Environment.GetEnvironmentVariable("VRAY_SDK"), "scenes");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Change process working directory to SCENE_PATH in order to be able to load relative scene resources.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Directory.SetCurrentDirectory(SCENE_PATH);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Create an instance of VRayRenderer with default options. The renderer is automatically closed after the `using` block.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.RenderMode = RenderMode.PRODUCTION;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Load scene from a file.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // This will add the necessary channel plugins to the scene</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> addExampleRenderElements(renderer);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.StartSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // This will save all the channels with suffixed file names</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine(">>> Saving all channels");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Vfb.SaveImage("cornell_RE.png");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> RenderElement diffuseRE = renderer.RenderElements.Get(RenderElementType.DIFFUSE);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Plugin diffusePlugin = diffuseRE.Plugin;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine(String.Format(">>> Saving inverted JPG from plugin {0} {1}\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", diffusePlugin.Gettype(), diffusePlugin.GetName()));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayImage image = diffuseRE.GetImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.MakeNegative();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.SaveToJPEG("cornell_inv_diffuse_VRayImage.jpg");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The renderer object is unusable after closing since its resources are freed. </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // It should be released for garbage collection.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var path = require('path');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">var vray = require(path.join(process.env.VRAY_SDK, 'node', 'vray'));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">var SCENE_PATH = path.join(process.env.VRAY_SDK, 'scenes');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Change process working directory to SCENE_PATH in order to be able to load relative scene resources.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">process.chdir(SCENE_PATH);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">var addExampleRenderElements = function(renderer) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var reManager = renderer.renderElements;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // In Python and JS we use strings:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('All render element (channel) identifiers:');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log(reManager.getAvailableTypes());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The RGB channel is always present. It is often referred to as "Beauty" by compositors</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Alpha is also always included</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // --- BEAUTY ELEMENTS ---</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // "Beauty" elements are the components that make up the main RGB channel,</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // such as direct and indirect lighting, specular and diffuse contributions and so on.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Light bounced from diffuse materials (layers);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('diffuse');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Light from glossy reflections</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('reflection');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Refracted light</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('refraction');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Light from perfect mirror reflections</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('specular');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Subsurface scattered light</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('sss');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Light from self-illuimnating materials</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('self_illumination');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Global illumination, indirect lighting</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('gi');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Direct lighting</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('lighting');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Sum of all lighting</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('total_light');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Shadows, combined with diffuse. Shadowed areas are brighter</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('shadow');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Reflected light if surfaces were fully reflective</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('raw_reflection');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Refracted light if surfaces were fully refractive</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('raw_refraction');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Attenuation factor for reflections. Refl = ReflFilter * RawRefl</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('reflection_filter');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Attenuation factor for refractions. Refr = RefrFilter * RawRefr</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('refraction_filter');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Intensity of GI before multiplication with the diffuse filter</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('raw_gi');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Direct lighting without diffuse color</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('raw_light');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Sum light without diffuse color</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('raw_total_light');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Shadows without the diffuse factor</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('raw_shadow');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Grayscale material glossiness values</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('reflection_glossiness');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Glossiness for highlights only</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('reflection_hilight_glossiness');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // --- MATTE ELEMENTS ---</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Matte elements are used for masking out parts of the frame when compositing.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Color is based on material ID, see MtlMaterialID plugin</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('material_id');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Color is based on the objectID of each Node</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('node_id');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // --- GEOMETRIC ELEMENTS ---</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Geometric data such as normals and depth has various applications</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // in compositing and post-processing.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The pure geometric normals, encoded as R=X, G=Y, B=Z</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('normals');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Normals after bump mapping</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('bump_normals');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Normalized grayscale depth buffer</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('z_depth');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The per-frame velocity of moving objects</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> reManager.add('velocity');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Create an instance of VRayRenderer for production render mode.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.renderMode = 'production';</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Load scene from a file asynchronously.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('cornell_new.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // This will add the necessary channel plugins to the scene</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> addExampleRenderElements(renderer);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // This will save all the channels with suffixed file names</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('>>> Saving all channels');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.vfb.saveImageSync('cornell_RE.png');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var diffuseRE = renderer.renderElements.get('diffuse');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // If the diffuse render element is missing it will evaluate to false</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (diffuseRE) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var diffusePlugin = diffuseRE.plugin;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('>>> Saving inverted JPG from plugin ' + diffusePlugin.getType() + ' ' + diffusePlugin.getName());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image = diffuseRE.getImage();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (image) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.makeNegative();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> image.save('cornell_inv_diffuse_VRayImage.jpg');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Closes the renderer.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // This call is mandatory in order to free up the event loop.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The renderer object is unusable after closing since its resources</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // are freed. It should be released for garbage collection.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
XI. Plugins Plugins are the objects that specify the lights, geometry, materials or settings that constitute the 3D scene. Each V-Ray scene consists of a set of plugins instances. The V-Ray Application SDK exposes methods in the main VRayRenderer class that can be used to create plugin instances or list and modify (or delete) the existing ones in the scene.
Plugin objects can be retrieved by instance name. Once the user has obtained a plugin instance its property (a.k.a. parameter ) values can be viewed or set to affect the rendered image. The properties of the plugin are accessed by name. In Interactive mode the changes to plugin property values are usually applied immediately during rendering and changes become visible almost instantly, but for each change the image sampling is reset and you get some noisy images initially. In Production mode changes to plugin property values take effect if they are applied before the rendering process is started. The following example demonstrates how the transform for the render view (camera) in a scene can be changed with the App SDK.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('cornell_new.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # find the RenderView plugin in the scene</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderView = renderer.plugins.renderView</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # change the transform value</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> newTransform = renderView.transform</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> newTransform = newTransform.replaceOffset(newTransform.offset + vray.Vector(-170, 120, newTransform.offset.z))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderView.transform = newTransform</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#include "vraysdk.hpp"</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// The vrayplugins header provides specialized classes for concrete types of plugins, deriving from the generic Plugin base class. </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// It is optional and the generic Plugin API can be used instead.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">#include "vrayplugins.hpp"</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // find the RenderView plugin in the scene</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> RenderView renderView = renderer.getPlugin<RenderView>("renderView");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // change the transform value</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Transform newTransform = renderView.getTransform("transform");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> newTransform.offset += Vector(-170, 120, newTransform.offset.z);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderView.set_transform(newTransform);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using VRay.Plugins;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // find the RenderView plugin in the scene</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> RenderView renderView = renderer.GetPlugin<RenderView>("renderView");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // change the transform value</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Transform newTransform = renderView.Transform;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderView.Transform = newTransform.ReplaceOffset(newTransform.Offset + new Vector(-170, 120, newTransform.Offset.Z));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.StartSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer(); </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('cornell_new.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // find the RenderView plugin in the scene</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var renderView = renderer.plugins.renderView;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // change the transform value</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var newTransform = renderView.transform;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> newTransform = newTransform.replaceOffset(newTransform.offset.add(vray.Vector(-170, 120, newTransform.offset.z)));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderView.transform = newTransform;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Start rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start(function (err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
The call to a method that retrieves the value for a plugin property always returns a copy of the internal value stored in the local V-Ray engine. In order to change the plugin property value so that it affects the rendered image the setter method from the plugin class should be called. Simply modifying the value returned by a getter will not lead to changes in the scene as it is a copy, not a reference.
Adding and removing plugins Plugin instances can be created and removed dynamically with the App SDK. The next example demonstrates how a new light can be added to the scene.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('cornell_new.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # create a new light plugin</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni = renderer.classes.LightOmni('lightOmniBlue')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.color = vray.AColor(0, 0, 1)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.intensity = 60000.0</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.decay = 2.0</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.shadowRadius = 40.0</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.transform = vray.Transform(</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vray.Matrix(vray.Vector(1.0, 0.0, 0.0), vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, -1.0, 0.0)), </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vray.Vector(-50, 50, 50))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#include "vraysdk.hpp"</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">#include "vrayplugins.hpp"</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true); </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // create a new light plugin</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> LightOmni lightOmni = renderer.newPlugin<LightOmni>("lightOmniBlue");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.set_color(AColor(0.f, 0.f, 1.f));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.set_intensity(60000.f);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.set_decay(2.0f);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.set_shadowRadius(40.0f);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.set_transform(Transform(</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Matrix(Vector(1.0, 0.0, 0.0), Vector(0.0, 0.0, 1.0), Vector(0.0, -1.0, 0.0)), </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Vector(-50, 50, 50)));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using VRay.Plugins;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // create a new light plugin</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> LightOmni lightOmni = renderer.NewPlugin<LightOmni>("lightOmniBlue");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.Color = new AColor(0, 0, 1);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.Intensity = 60000.0f;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.Decay = 2.0f;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.ShadowRadius = 40.0f;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.Transform = new Transform(</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> new Matrix(new Vector(1.0, 0.0, 0.0), new Vector(0.0, 0.0, 1.0), new Vector(0.0, -1.0, 0.0)),</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> new Vector(-50, 50, 50);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.StartSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('cornell_new.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // create a new light plugin</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var lightOmni = renderer.classes.LightOmni('lightOmniBlue');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.color = vray.AColor(0, 0, 1);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.intensity = 60000.0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.decay = 2.0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.shadowRadius = 40.0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.transform = vray.Transform(</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vray.Matrix(vray.Vector(1.0, 0.0, 0.0), vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, -1.0, 0.0)), </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vray.Vector(-50, 50, 50));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
In the following example we remove a sphere plugin by name:
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('cornell_new.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> del renderer.plugins['Sphere0Shape4@node']</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">Plugin sphere = renderer.getPlugin("Sphere0Shape4@node");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.deletePlugin(sphere);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.waitForRenderEnd(6000);</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Plugin sphere = renderer.GetPlugin("Sphere0Shape4@node");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.DeletePlugin(sphere);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.StartSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('./cornell_new.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> delete renderer.plugins['Sphere0Shape4@node'];</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
Automatic commit of property changes All changes made to plugin properties should be done before the rendering starts when rendering in Production mode. Any changes after that do not affect the current rendering, but they are not lost. In Interactive mode the changes made after the rendering starts are applied immediately to the scene by default. Alternatively, the user can decide to make a batch of changes to be applied together, usually for better performance. This is done using the autoCommit property of the VRayRenderer class. In the following example we demonstrate how a group of changes are batched and commit is called explicitly to apply them.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.autoCommit = False</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('cornell_new.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # This change won't be applied immediately</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni = renderer.classes.LightOmni()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.color = vray.AColor(0, 0, 1)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.intensity = 60000.0</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.decay = 2.0</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.shadowRadius = 40.0</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.transform = vray.Transform(vray.Matrix(vray.Vector(1.0, 0.0, 0.0),</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, -1.0, 0.0)), vray.Vector(-50, 50, 50))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(2000)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Make a group of changes 2 seconds after the render starts</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.plugins.renderView.fov = 1.5</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> del renderer.plugins['Sphere0Shape4@node'] </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Commit applies all 3 changes</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.commit()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(4000)</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#include "vraysdk.hpp"</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">#include "vrayplugins.hpp"</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setAutoCommit(false);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // This change won't be applied immediately</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> LightOmni lightOmni = renderer.newPlugin<LightOmni>();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.set_color(Color(0.f, 0.f, 1.f));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.set_intensity(60000.0f);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.set_decay(2.0f);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.set_shadowRadius(40.0f);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.set_transform(Transform(Matrix(Vector(1.0, 0.0, 0.0), Vector(0.0, 0.0, 1.0), Vector(0.0, -1.0, 0.0)), Vector(-50, 50, 50)));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync(); </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(2000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Make a group of changes 2 seconds after the render starts</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Plugin sphere = renderer.getPlugin("Sphere0Shape4@node");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.deletePlugin(sphere);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> RenderView renderView = renderer.getPlugin<RenderView>("renderView");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderView.set_fov(1.5f);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Commit applies all 3 changes</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.commit();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(4000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using VRay.Plugins;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.AutoCommit = false;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // This change won't be applied immediately</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> LightOmni lightOmni = renderer.NewPlugin<LightOmni>();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.Color = new Color(0, 0, 1);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.Intensity = 60000.0f;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.Decay = 2.0f;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.ShadowRadius = 40.0f;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.Transform = new Transform(</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> new Matrix(new Vector(1.0, 0.0, 0.0), new Vector(0.0, 0.0, 1.0), new Vector(0.0, -1.0, 0.0)),</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> new Vector(-50, 50, 50)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> ));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.StartSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(2000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Make a group of changes 2 seconds after the render starts</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Plugin sphere = renderer.GetPlugin("Sphere0Shape4@node");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.DeletePlugin(sphere);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> RenderView renderView = renderer.GetPlugin<RenderView>("renderView");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderView.Fov = 1.5f;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Commit applies all 3 changes</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Commit();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(4000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.autoCommit = false;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('cornell_new.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // This change won't be applied immediately</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> var lightOmni = renderer.classes.LightOmni();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.color = vray.AColor(0, 0, 1);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.intensity = 60000.0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.decay = 2.0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.shadowRadius = 40.0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> lightOmni.transform = vray.Transform(vray.Matrix(vray.Vector(1.0, 0.0, 0.0), vray.Vector(0.0, 0.0, 1.0), vray.Vector(0.0, -1.0, 0.0)), vray.Vector(-50, 50, 50));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Make a group of changes 2 seconds after the render starts</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(2000, function () {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.plugins.renderView.fov = 1.5;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> delete renderer.plugins['Sphere0Shape4@node'];</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Commit applies all 3 changes</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.commit();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function () {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
XII. Property Types The following are the types recognized for property types:
Basic types: int, bool, float, Color (3 float RGB), AColor (4 float ARGB), Vector (3 float), string (UTF-8), Matrix (3 Vectors), Transform (a Matrix and a Vector for translation) Objects: references to other plugin instances Typed lists: The typed lists in App SDK are IntList, FloatList, ColorList and VectorList. Generic heterogenous lists: The App SDK uses a generic type class called Value for items in a generic list. Note that generic lists can be nested. Output parameters: These are additional values generated by a given plugin which may be used as input by others. The PluginRef type represents a Plugin with specific output parameter. Detailed documentation about working with each type can be found in the API reference guides as they have some language nuances. All types are in the VRay namespace.
XIII. Animations V-Ray App SDK supports rendering of animated scenes . Animated scenes contain animated plugin properties. A plugin property is considered animated if it has a sequence of values - each for a specific time or frame number. This defines key frames and in the process of sampling, interpolation is done between the values.
One can obtain the current frame number from the frame property of the VRayRenderer. The renderer gets into the IDLE_FRAME_DONE intermediate state when a frame is done and there are more frames after it. After the final frame it becomes IDLE_DONE.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">def onStateChanged(renderer, oldState, newState, instant):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if oldState == vray.RENDERER_STATE_IDLE_INITIALIZED and newState == vray.RENDERER_STATE_PREPARING:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Sequence started.')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if newState == vray.RENDERER_STATE_IDLE_FRAME_DONE or newState == vray.RENDERER_STATE_IDLE_DONE:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Image Ready, frame ' + str(renderer.frame) + ' (sequenceEnd = ' + str(renderer.sequenceEnded) + ')') </span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if newState == vray.RENDERER_STATE_IDLE_FRAME_DONE:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # If the sequence has NOT finished - continue with next frame.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.continueSequence()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> else:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Sequence done. Closing renderer...')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Add a listener for the renderer state change event.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # We will use it to detect when a frame is completed and allow the next one to start.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnStateChanged(onStateChanged)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Load scene from a file.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('animation.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Maximum paths per pixel for interactive mode. Set a low sample level to complete rendering faster.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # The default value is unlimited. We have to call this *after* loading the scene.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setInteractiveSampleLevel(1)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Start rendering a sequence of frames (animation).</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.renderSequence()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Wait until the entire sequence has finished rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForSequenceEnd()</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void onStateChanged(VRayRenderer &renderer, RendererState oldState, RendererState newState, double instant, void* userData) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (oldState == IDLE_INITIALIZED && newState == PREPARING) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Sequence started.\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (newState == IDLE_FRAME_DONE || newState == IDLE_DONE) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Image Ready, frame %d (sequenceEnded = %d)\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", renderer.getCurrentFrame(), renderer.isSequenceEnded());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (newState == IDLE_FRAME_DONE) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // If the sequence has NOT finished - continue with next frame.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.continueSequence();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> } else {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Sequence done. Closing renderer...\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Add a listener for the renderer state change event.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // We will use it to detect when a frame is completed and allow the next one to start.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setOnStateChanged(onStateChanged);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Load scene from a file.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load("animation.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Maximum paths per pixel for interactive mode. Set a low sample level to complete rendering faster.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The default value is unlimited. We have to call this *after* loading the scene.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setInteractiveSampleLevel(1);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Start rendering a sequence of frames (animation).</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.renderSequence();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Wait until the entire sequence has finished rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForSequenceEnd();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Add a listener for state changes.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // It is invoked when the renderer prepares for rendering, renders, finishes or fails.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.StateChanged += new EventHandler<StateChangedEventArgs>((source, e) =></span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (e.OldState == VRayRenderer.RendererState.IDLE_INITIALIZED</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> && e.NewState == VRayRenderer.RendererState.PREPARING)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("Sequence started.");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (e.NewState == VRayRenderer.RendererState.IDLE_FRAME_DONE)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("Image Ready, frame " + renderer.Frame + " (sequenceEnded = " + renderer.IsSequenceEnded + ")");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // If the sequence has NOT finished - continue with next frame.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.ContinueSequence();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (e.NewState == VRayRenderer.RendererState.IDLE_DONE)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("Sequence done. (sequenceEnded = " +</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.IsSequenceEnded + ") Closing renderer...");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Load scene from a file.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("animation.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Maximum paths per pixel for interactive mode. Set a low sample level to complete rendering faster.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The default value is unlimited. We have to call this *after* loading the scene.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.SetInteractiveSampleLevel(1);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Start rendering a sequence of frames (animation).</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.RenderSequence();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Wait until the entire sequence has finished rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForSequenceEnd();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Add a listener for the renderer state change event.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// We will use it to detect when a frame is completed and allow the next one to start.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.on('stateChanged', function(oldState, newState, instant) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (newState == 'idleFrameDone' || newState == 'idleDone') {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Image Ready, frame ' + renderer.frame + ' (sequenceEnd = ' + renderer.sequenceEnded + ')');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Check if the sequence has finished rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (newState == 'idleDone') {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Closes the renderer. This call is mandatory in order to free up the event loop.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The renderer object is unusable after closing since its resources are freed. It should be released for garbage collection.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> } else {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // If the sequence has NOT finished - continue with next frame.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.continueSequence();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> } else if (newState.startsWith('idle')) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Unexpected end of render sequence: ', newState);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Load scene from a file asynchronously.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('animation.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Maximum paths per pixel for interactive mode. Set a low sample level to complete rendering faster.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The default value is unlimited. We have to call this *after* loading the scene.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setInteractiveSampleLevel(1);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Start rendering a sequence of frames (animation).</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.renderSequence();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Prevent garbage collection and exiting nodejs until the renderer is closed.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.keepAlive();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
XIV. V-Ray Server A V-Ray Server is used as a remote render host during the rendering of a scene. The server is a process that listens for render requests on a specific network port and clients such as instances of the VRayRenderer class can connect to the server to delegate part of the image rendering. V-Ray Standalone render servers can also be used. The server cannot be used on its own to start a rendering process but plays an essential role when completing distributed tasks initiated by clients. In order to take advantage of the distributed rendering capabilities of V-Ray, such servers need to be run and be available for requests.
The V-Ray Application SDK allows for easily creating V-Ray server processes that can be used in distributed rendering. The API includes the VRayServer class that exposes methods for starting and stopping server processes. In addition the VRayServer class enables users to subscribe to V-Ray server specific events so that custom logic can be executed upon their occurrence.
Server events occur when:
The server process starts and is ready to accept render requests A render client connects to the server to request a distributed rendering task A render client disconnects from the server A server text message is produced due to a change in the server status or to track the progress of the current job The next code snippet demonstrates how VRayServer can be instantiated and used to start a server process.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">from __future__ import print_function</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"># The directory containing the vray shared object should be present in the PYTHONPATH environment variable.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"># Try to import the vray module from VRAY_SDK/python, if it is not in PYTHONPATH</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">import sys, os</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">VRAY_SDK = os.environ.get('VRAY_SDK')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">if VRAY_SDK:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> sys.path.append(os.path.join(VRAY_SDK, 'python'))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">import vray</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">try:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Compatibility with Python 2.7.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> input = raw_input</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">except NameError:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> pass</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">def printStarted(server, instant):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Server started. Press Enter to continue...')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">def printRendererConnect(server, host, instant):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Host {0} connected to server.'.format(host))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">def printRendererDisconnect(server, host, instant):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Host {0} disconnected from server.'.format(host))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"># Listening port for VRay server. The default value is 20207</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">options = { 'portNumber': 20207 }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"># Create an instance of VRayServer with custom options.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"># The server is automatically closed after the `with` block.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">with vray.VRayServer(**options) as server:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Add a listener for server start event. It is invoked when the image has finished rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.setOnStart(printStarted)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Add a listener for connect event. It is invoked when a renderer connects to the server.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.setOnConnect(printRendererConnect)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Add a listener for disconnect event. It is invoked when a renderer disconnects from the server.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.setOnDisconnect(printRendererDisconnect)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Start listening for connections on the specified port.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.start()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Press a key to exit.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> input('')</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">#include "vraysrv.hpp"</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using namespace VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using namespace std;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void printStarted(VRayServer &server, double instant, void* userData) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Server started.\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void printRendererConnect(VRayServer &server, const char* host, double instant, void* userData) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Host %s connected to server.\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", host);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">void printRendererDisconnect(VRayServer &server, const char* host, double instant, void* userData) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Host %s disconnected to server.\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", host);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayServerInit init(NULL);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> ServerOptions options;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Listening port for VRay server. The default value is 20207.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> options.portNumber = 20207;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Create an instance of VRayServer with custom options.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // The server is automatically closed at the end of the current scope.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayServer server(options);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Add a listener for server start event. It is invoked when the image has finished rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.setOnServerStart(printStarted);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Add a listener for connect event. It is invoked when a renderer connects to the server.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.setOnConnect(printRendererConnect);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Add a listener for disconnect event. It is invoked when a renderer disconnects from the server.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.setOnDisconnect(printRendererDisconnect);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Start listening for connections on the specified port.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.run();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">using VRay;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">ServerOptions options = new ServerOptions();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Listening port for VRay server. The default value is 20207.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">options.PortNumber = 20207;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Create an instance of VRayServer with custom options.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// The server is automatically closed after the `using` block.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">using (VRayServer server = new VRayServer(options))</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Add a listener for server start event. It is invoked when the image has finished rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.Started += new EventHandler((source, e) =></span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("Server started. Press Enter to continue...");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Add a listener for connect event. It is invoked when a renderer connects to the server.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.HostConnected += new EventHandler<HostEventArgs>((source, e) =></span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine(String.Format("Host {0} connected to server.", e.Host));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Add a listener for disconnect event. It is invoked when a renderer disconnects from the server.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.HostDisconnected += new EventHandler<HostEventArgs>((source, e) =></span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine(String.Format("Host {0} disconnected to server.", e.Host));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Start listening for connections on the specified port.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.Start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Press a key to exit.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.ReadKey();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">var vray = require(path.join(process.env.VRAY_SDK, 'node', 'vray'));</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Listening port for VRay server. The default value is 20207.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">options = { 'portNumber': 20207 };</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Create an instance of VRayServer with custom options.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">var server = vray.VRayServer(options);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Add a listener for server start event. It is invoked when the image has finished rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">server.on('start', function(instant) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Server is ready');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Press a key to exit');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Add a listener for connect event. It is invoked when a renderer connects to the server.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">server.on('connect', function(host, instant) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Host ' + host + ' connected to server.');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Add a listener for disconnect event. It is invoked when a renderer disconnects from the server.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">server.on('disconnect', function(host, instant) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Host ' + host + ' disconnected from server.');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Start listening for connections on the specified port.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">server.start();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">process.on('exit', function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> server.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Press any key to exit.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">process.stdin.setRawMode(true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">process.stdin.resume();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">process.stdin.on('data', process.exit.bind(process, 0));</span></code>
XV. Distributed Rendering The V-Ray Application SDK allows third party integrators to make full use of the V-Ray distributed rendering engine. Distributed rendering allows you to render parts of the image in parallel on multiple render hosts. The client process which initiates the rendering synchronizes the results produced by the render servers. All render modes support distributed rendering.
Render hosts can be dynamically added and removed at any point in time during the rendering process. The render hosts should have a V-Ray server running on them when the render client tries to add them to its list of active hosts because the client verifies whether a connection can be established for a distributed task at that time.
Each render host is identified by an address:port pair specifying the IP or DNS address of the machine with the V-Ray server and the port on which this server is listening for render requests. The VRayRenderer class exposes methods for dynamic addition and removal of hosts. Regardless of the progress made by the main render process in the client, remote machines can successfully begin to participate in the rendering as long as the they have running V-Ray servers.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">def printDRStatus(renderer):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Active hosts: ', renderer.getActiveHosts())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Inactive hosts: ', renderer.getInactiveHosts())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('All hosts: ', renderer.getAllHosts())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Load scene from a file.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('cornell_new.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # We have to explicitly enable DR first</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setDREnabled(True)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Start rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Attach several hosts after a few seconds</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # If port is omitted it defaults to 20207.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # NOTE: Replace this address with the address of a host running VRayServer.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.addHosts('10.0.0.132:20207;10.0.0.132:20208')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('=== After adding hosts ===')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printDRStatus(renderer)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Wait until rendering has finished or 6s have elapsed.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void printDRStatus(VRayRenderer &renderer) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Active hosts: %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", renderer.getActiveHosts().c_str());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Inactive hosts: %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", renderer.getInactiveHosts().c_str());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("All hosts: %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", renderer.getAllHosts().c_str());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Load scene from a file.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // We have to explicitly enable DR first</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setDREnabled(true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Start rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Attach several hosts after a few seconds</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // If port is omitted it defaults to 20207.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // NOTE: Replace this address with the address of a host running VRayServer.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.addHosts("10.0.0.132:20207;10.0.0.132:20208");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("=== After adding hosts ===\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printDRStatus(renderer);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Wait until rendering has finished or 6s have elapsed.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">static void PrintDRStatus(VRayRenderer renderer)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("Active hosts: ", renderer.ActiveHosts);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("Inactive hosts: ", renderer.InactiveHosts);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("All hosts: ", renderer.AllHosts);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">static void Main(string[] args)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Load scene from a file.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // We have to explicitly enable DR first</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.SetDREnabled(true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Start rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.StartSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Attach several hosts after a few seconds</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // If port is omitted it defaults to 20207.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // NOTE: Replace this address with the address of a host running VRayServer.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.AddHosts("10.0.0.132:20207;10.0.0.132:20208");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("=== After adding hosts ===");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> PrintDRStatus(renderer);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Wait until rendering has finished or 6s have elapsed.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">function printDRStatus(renderer) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Active hosts: ', renderer.getActiveHostsSync());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Inactive hosts: ', renderer.getInactiveHostsSync());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('All hosts: ', renderer.getAllHostsSync());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Load scene from a file asynchronously.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('cornell_new.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // We have to explicitly enable DR first</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setDREnabled(true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Start rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start(function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Attach several hosts after a few seconds</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // If port is omitted it defaults to 20207.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // NOTE: Replace this address with the address of a host running VRayServer.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.addHosts('10.0.0.132:20207;10.0.0.132:20208', function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('=== After adding hosts ===');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printDRStatus(renderer);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Wait until rendering has finished or 6s have elapsed.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>
Removal of render hosts is just as easy as adding them. Even if all remote render hosts disconnect or are deleted from the rendering host list the rendering process will continue on the client machine which has initiated it.
Python <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">def printDRStatus(renderer):</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Active hosts: ', renderer.getActiveHosts())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('Inactive hosts: ', renderer.getInactiveHosts())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('All hosts: ', renderer.getAllHosts())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">with vray.VRayRenderer() as renderer:</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Load scene from a file.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load('cornell_new.vrscene')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # We have to explicitly enable DR first</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setDREnabled(True)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Start rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync()</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Attach several hosts after a few seconds</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # If port is omitted it defaults to 20207.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # NOTE: Replace this address with the address of a host running VRayServer.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.addHosts('10.0.0.132:20207;10.0.0.132:20208')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('=== After adding hosts ===')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printDRStatus(renderer)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Wait until rendering has finished or 6s have elapsed.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # Remove a remote host from distributed rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> # NOTE: Replace this address with the address of a host already added for distributed rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.removeHosts('10.0.0.132:20208)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> print('=== After removing a host ===')</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printDRStatus(renderer)</span></code>
C++ <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">void printDRStatus(VRayRenderer &renderer) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Active hosts: %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", renderer.getActiveHosts().c_str());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("Inactive hosts: %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", renderer.getInactiveHosts().c_str());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("All hosts: %s\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">", renderer.getAllHosts().c_str());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">int main() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayInit init(NULL, true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> VRayRenderer renderer;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Load scene from a file.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // We have to explicitly enable DR first</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setDREnabled(true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Start rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.startSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Attach several hosts after a few seconds</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // If port is omitted it defaults to 20207.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // NOTE: Replace this address with the address of a host running VRayServer.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.addHosts("10.0.0.132:20207;10.0.0.132:20208");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("=== After adding hosts ===\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printDRStatus(renderer);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Wait until rendering has finished or 6s have elapsed.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Remove a remote host from distributed rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // NOTE: Replace this address with the address of a host already added for distributed rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.removeHosts("10.0.0.132:20208");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printf("=== After removing a host ===\</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printDRStatus(renderer);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> return 0;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
CSharp <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">static void PrintDRStatus(VRayRenderer renderer)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("Active hosts: ", renderer.ActiveHosts);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("Inactive hosts: ", renderer.InactiveHosts);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("All hosts: ", renderer.AllHosts);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">static void Main(string[] args)</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">{</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> using (VRayRenderer renderer = new VRayRenderer())</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Load scene from a file.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.Load("cornell_new.vrscene");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // We have to explicitly enable DR first</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.SetDREnabled(true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Start rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.StartSync();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Attach several hosts after a few seconds</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // If port is omitted it defaults to 20207.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // NOTE: Replace this address with the address of a host running VRayServer.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.AddHosts("10.0.0.132:20207;10.0.0.132:20208");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("=== After adding hosts ===");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> PrintDRStatus(renderer);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Wait until rendering has finished or 6s have elapsed.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.WaitForRenderEnd(6000);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Remove a remote host from distributed rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // NOTE: Replace this address with the address of a host already added for distributed rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.RemoveHosts("10.0.0.132:20208");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> Console.WriteLine("=== After removing a host ===");</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> PrintDRStatus(renderer);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> }</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span></code>
JavaScript <code data-v-c2b1f83f=""><span data-v-c2b1f83f="" class="line">function printDRStatus(renderer) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Active hosts: ', renderer.getActiveHostsSync());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('Inactive hosts: ', renderer.getInactiveHostsSync());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('All hosts: ', renderer.getAllHostsSync());</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">}</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">var renderer = vray.VRayRenderer();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">// Load scene from a file asynchronously.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">renderer.load('cornell_new.vrscene', function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // We have to explicitly enable DR first</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.setDREnabled(true);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Start rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.start(function(err) {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> if (err) throw err;</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Attach several hosts after a few seconds</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // If port is omitted it defaults to 20207.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // NOTE: Replace this address with the address of a host running VRayServer.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.addHosts('10.0.0.132:20207;10.0.0.132:20208', function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('=== After adding hosts ===');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printDRStatus(renderer);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Wait until rendering has finished or 6s have elapsed.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.waitForRenderEnd(6000, function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // Remove a remote host from distributed rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> // NOTE: Replace this address with the address of a host already added for distributed rendering.</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.removeHosts('10.0.0.132:20208', function() {</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> console.log('=== After removing a host ===');</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> printDRStatus(renderer);</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> renderer.close();</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line"> });</span><span data-v-c2b1f83f="" class="line"></span><span data-v-c2b1f83f="" class="line">});</span></code>