In this chapter we'll cover another area light - mesh light. It can turn a geometry plugin into a light source and can be textured.
Parameters
Along with the common light parameters, the LightMesh plugin has the following specific ones:
- noDecay - If set to true, light intensity will not fall off with distance. By default the inverse square law applies.
- doubleSided - Whether to emit light from the back sides of the triangles.
- geometry - A geometry plugin that will define the shape of the light. Note that complex geometries may make mesh lights slower and noisier.
- tex - A texture plugin to map onto the geometry for light color. This requires that the geometry plugin has valid UV data.
- use_tex - You also have to set this to true to actually use the tex parameter.
- tex_resolution - The texture is actually resampled at this resolution. The default is 256, so even if you have a high resolution image, it may look pixelated if you don't increase this. This will consume more memory.
Example
Here's an example how to assign a geometry to a MeshLight:
# Compatibility with Python 2.7. from __future__ import print_function # The directory containing the vray shared object should be present in the PYTHONPATH environment variable. # Try to import the vray module from VRAY_SDK/python, if it is not in PYTHONPATH import sys, os VRAY_SDK = os.environ.get('VRAY_SDK') if VRAY_SDK: sys.path.append(os.path.join(VRAY_SDK, 'python')) import vray SCENE_PATH = os.path.join(os.environ.get('VRAY_SDK'), 'scenes') # Change process working directory to SCENE_PATH in order to be able to load relative scene resources. os.chdir(SCENE_PATH) # The renderer is automatically closed after the `with` block. with vray.VRayRenderer() as renderer: # Register a simple log callback. Always useful for debugging. def dumpMsg(renderer, message, level, instant): if level == vray.LOGLEVEL_ERROR: print("[ERROR]", message) elif level == vray.LOGLEVEL_WARNING: print("[Warning]", message) elif level == vray.LOGLEVEL_INFO: print("[info]", message) # Uncomment for testing, but you might want to ignore these in real code #else: print("[debug]", message) renderer.setOnLogMessage(dumpMsg) # Load scene from a file. renderer.load(os.path.join(SCENE_PATH, 'lighting.vrscene')) # Remove original light source from the scene. del renderer.plugins["VRayLightDomeShape1"] geometry = renderer.plugins['SphereAShape@mesh12'] # LightMesh is a light source plugin that can be used to create lights that take their shapes and sizes from a mesh object. light = renderer.classes.LightMesh() # Specify the geometry that will be used for light emission. light.geometry = geometry # Specify the light intensity based on the 'units' parameter. light.intensity = 80 # Specify the color of the light in RGB float values and alpha(1.0f) light.color = vray.AColor(0.628, 1, 0.8283096) # Specify the light position, rotation and scale. light.transform = vray.Transform( vray.Matrix( vray.Vector(1, 0, 0), vray.Vector(0, 1, 0), vray.Vector(0, 0, 1)), vray.Vector(0, 0, 0)) # Specify shadow offset from the surface. Helps to prevent polygonal shadow artifacts on low-poly surfaces. light.shadowBias = 0.02 # Specify that the bumped normal should be used to check if the light direction is below the surface. light.bumped_below_surface_check = True # Start rendering. renderer.startSync() # Wait for rendering to end. renderer.waitForRenderEnd()
#define VRAY_RUNTIME_LOAD_PRIMARY #include "vraysdk.hpp" #include "vrayplugins.hpp" #include "utils.h" using namespace VRay; using namespace VRay::Plugins; using namespace std; const char *BASE_PATH = getenv("VRAY_SDK"); string SCENE_PATH = (BASE_PATH ? string(BASE_PATH) : string(".")) + PATH_DELIMITER + "scenes"; int main() { // Change process working directory to SCENE_PATH in order to be able to load relative scene resources. changeCurrentDir(SCENE_PATH.c_str()); // Load V-Ray SDK library. VRayInit init(NULL, true); // Create an instance of VRayRenderer with default options. // The renderer is automatically closed at the end of the current scope. VRayRenderer renderer; // It's recommended to always have a console log renderer.setOnLogMessage(logMessage); // Load scene from a file. renderer.load("lighting.vrscene"); // Remove original light source from the scene. renderer.deletePlugin("VRayLightDomeShape1"); Plugin geometry = renderer.getPlugin("SphereAShape@mesh12"); // LightMesh is a light source plugin that can be used to create lights that take their shapes and sizes from a mesh object. LightMesh light = renderer.newPlugin<LightMesh>(); // Specify the geometry that will be used for light emission. light.set_geometry(geometry); // Specify the light intensity based on the 'units' parameter. light.set_intensity(80); // Specify the color of the light in RGB float values and alpha(1.0f) light.set_color(AColor(0.628, 1, 0.8283096)); // Specify the light position, rotation and scale. light.set_transform(Transform( Matrix( Vector(1.0, 0.0, 0.0), Vector(0.0, 1.0, 0.0), Vector(0.0, 0.0, 1.0)), Vector(0.0, 0.0, 0.0))); // Specify shadow offset from the surface. Helps to prevent polygonal shadow artifacts on low-poly surfaces. light.set_shadowBias(0.02f); // Specify that the bumped normal should be used to check if the light direction is below the surface. light.set_bumped_below_surface_check(true); // Start rendering. renderer.startSync(); // Wait for rendering to end. renderer.waitForRenderEnd(); return 0; }
using System; using System.IO; using VRay; using VRay.Plugins; namespace _03_geometric { class Program { static void Main(string[] args) { string SCENE_PATH = Path.Combine(Environment.GetEnvironmentVariable("VRAY_SDK"), "scenes"); // Change process working directory to SCENE_PATH in order to be able to load relative scene resources. Directory.SetCurrentDirectory(SCENE_PATH); // Create an instance of VRayRenderer with default options. The renderer is automatically closed after the `using` block. using (VRayRenderer renderer = new VRayRenderer()) { // Add a listener for any type of log message. renderer.LogMessage += new EventHandler<MessageEventArgs>((source, e) => { // You can remove the if for testing, but you might want to ignore Debug in real code if (e.LogLevel != LogLevelType.Debug) { Console.WriteLine(String.Format("[{0}] {1}", e.LogLevel.ToString(), e.Message)); } }); // Load scene from a file. renderer.Load("lighting.vrscene"); // Remove original light source from the scene. renderer.DeletePlugin("VRayLightDomeShape1"); Plugin geometry = renderer.GetPlugin("SphereAShape@mesh12"); // LightMesh is a light source plugin that can be used to create lights that take their shapes and sizes from a mesh object. LightMesh light = renderer.NewPlugin<LightMesh>(); // Specify the geometry that will be used for light emission. light.Geometry = geometry; // Specify the light intensity based on the 'units' parameter. light.Intensity = 80; // Specify the color of the light in RGB float values and alpha = 1. light.Color = new AColor(0.628, 1, 0.8283096); // Specify the light position, rotation and scale. light.Transform = new Transform( new Matrix( new Vector(1, 0, 0), new Vector(0, 1, 0), new Vector(0, 0, 1)), new Vector(0, 0, 0)); // Specify shadow offset from the surface. Helps to prevent polygonal shadow artifacts on low-poly surfaces. light.ShadowBias = 0.02F; // Specify that the bumped normal should be used to check if the light direction is below the surface. light.BumpedBelowSurfaceCheck = true; // Specify the number of parameter samples for motion blur. light.Nsamples = 1; // Start rendering. renderer.StartSync(); // Wait for rendering to end. renderer.WaitForRenderEnd(); } } } }
var path = require('path'); var vray = require(path.join(process.env.VRAY_SDK, 'node', 'vray')); var SCENE_PATH = path.join(process.env.VRAY_SDK, 'scenes'); // Change process working directory to SCENE_PATH in order to be able to load relative scene resources. process.chdir(SCENE_PATH); // Create an instance of VRayRenderer with default options. var renderer = vray.VRayRenderer(); // It's recommended to always have a console log callback renderer.on("logMessage", function(message, level, instant) { if (level == vray.LOGLEVEL_ERROR) console.log("[ERROR] ", message); else if (level == vray.LOGLEVEL_WARNING) console.log("[Warning] ", message); else if (level == vray.LOGLEVEL_INFO) console.log("[info] ", message); // Uncomment for testing, but you might want to ignore these in real code //else console.log("[debug] ", message); }); // Load scene from a file asynchronously. renderer.load("lighting.vrscene", function(err) { if (err) throw err; // Remove original light source from the scene. delete renderer.plugins["VRayLightDomeShape1"]; var geometry = renderer.plugins["SphereAShape@mesh12"]; // LightMesh is a light source plugin that can be used to create lights that take their shapes and sizes from a mesh object. var light = renderer.classes.LightMesh(); // Specify the geometry that will be used for light emission. light.geometry = geometry; // Specify the light intensity based on the 'units' parameter. light.intensity = 80; // Specify the color of the light in RGB float values and alpha(1.0f) light.color = vray.AColor(0.628, 1, 0.8283096); // Specify the light position, rotation and scale. light.transform = vray.Transform( vray.Matrix( vray.Vector(1, 0, 0), vray.Vector(0, 1, 0), vray.Vector(0, 0, 1)), vray.Vector(0, 0, 0)); // Specify shadow offset from the surface. Helps to prevent polygonal shadow artifacts on low-poly surfaces. light.shadowBias = 0.02; // Specify that the bumped normal should be used to check if the light direction is below the surface. light.bumped_below_surface_check = true; // Start rendering. renderer.start(function(err) { if (err) throw err; // Wait for rendering to end. renderer.waitForRenderEnd(function() { renderer.close(); }); }); });
Result
The scene used for this render is called "Lighting_Mesh.vrscene" and can be found in the scene bundle (comments to the different parameters available inside).