Understanding Transparency Render Settings

In theory, all clear* refractive surfaces should have their shadow calculated using a refractive caustics calculation in-order to render the refractive lensing** effect correctly, have their transparency color calculated as volumetric absorption of light through the medium in-order to render the color correctly for areas of different thickness, and have not only external reflections, but also internal reflections calculated, in-order to render the interaction between light and the transparent body correctly.
However, for thin surfaces of even thickness, like window glazing and car windshields, these optical effects can be rendered in much cheaper (non physical) methods, with very little compromise on final image quality or look, and even have an easier setup in most cases.
For this reason most popular render engines have object (mesh) and material (shader) parameters that allow configuration of the way these transparency effects will be rendered.
In this short article we’ll cover the different methods for rendering transparency effects, the reasoning behind them and the way to configure these settings in different render-engines.

In the comparison images below (rendered with Cycles), the images on the left were rendered with physically correct glass settings, 8192 samples + denoising,
And the images on the right were rendered with “flat” transparency settings and 1024 samples + denoising.
> See the shader settings below
Note that while for the monkey statue, the fast flat transparency settings produce an unrealistic result, the window glazing model loses very little of its look with the flat fast settings:

Transparency_Settings

Lensing, caustics and transparent shadows:

3D-Rendering-of-glassware

It’s a common intuitive mistake, that transparent objects don’t cast shadows, but they actually do. they don’t block light, they change its direction. light is refracted through them, gets focused in some areas of their surroundings (caustics) but can’t pass through them directly, so a shadow is created.
A good example of this would be a glass ball, acting like a lens, focusing the light into a tiny area, and otherwise having a regular elliptical shadow. if we tell the render-engine to just let direct light pass through the object we won’t get a correct realistic result, even if the light gets colored by the object’s transparency color.
There is however one case where letting the direct light simply pass through the object can both look correct and save a lot of calculations, and that is when the object is a thin surface with consistent thickness like window glazing.
So in many popular render-engines, when rendering an irregular thick solid transparent body like a glass statue or a glass filled with liquid, we have to counter-intuitively set the object or material to be opaque for direct light and let the indirect refracted light (caustics) create the correct lensing effect (focused light patterns in the shadow area)
> physically, light passing through a material medium is always refracted, i.e. indirect light. but for thin surfaces with even thickness like glazing, the lensing effect is insignificant, and can be completely disregarded by letting light pass directly through the object and be rendered as ‘transparent shadow’.
So the general rule regarding calculating caustics (lensing) vs casting transparent shadows (non physical), is that if the transparent object is a solid irregular shape with varying thickness like a statue or a bottle of liquid it should be rendered as opaque for direct light but with fully calculated caustics i.e. refracted indirect light.

Transparency color:

Cola_Test_ODED_ERELL_3D_Crop_signed

Physically, the color of transparency*** is always created by volumetric absorption of light traveling within the material medium. as light travels further through a material, more and more of it’s energy gets absorbed in the medium**** (converted to heat), therefore the thicker the object, less light will reach its other side, and it will appear darker. this volumetric absorption of light isn’t consistent for all wave lengths (colors) of light so the object appears to have a color.
For example, common glass, absorbs the red and blue light at a higher rate than green light, and therefore objects seen through it will appear greenish. when we look at the thin side of a common glazing surface we see a darker green color because we see light that has traveled through more glass (through a thicker volume of glass) because of refraction bending the light into the length of the surface. tea, in a glass, generally looks dark orange-brown, but if spilled on the floor it will ‘lose’ its color, and look clear like water because spilled on the floor, it’s too thin to absorb a significant amount of light and appear to have a color.
Most render engines allow setting the transparency (“refraction”/”transmission”) color of the material both as a ‘flat’ non physical filter color, and as a physical RGB light absorption rate (sometimes referred to as ‘fog’ color), that can in some cases be more accurately tuned by additional multiplier or depth parameters.
Setting an object’s transparency color using physical absorption (fog) usually requires more tweaking because in this method, the final rendered color is dependent not only on the color we set at the material/shader, but also on the model’s actual real world thickness.*****
In general, the transparency color of thick, solid, irregularly shaped objects (with varying thickness) must be set as a physical absorption rate color, and not as a simple filter color, otherwise the resulting color will not be affected by the material thickness, and look wrong.
For thin surfaces with consistent thickness, like window glazing, however, it’s more efficient to setup the transparency color as a ‘flat’ filter color, because it’s more convenient and predictable to setup, and produced a correct looking result.
For example, if we need to render an Architectural glazing surface that will filter exactly 50 percent of the light passing through it, it’s much simpler to set it up using a simple 50% grey transparency filter color, because this method disregards the glass model’s thickness. This approach isn’t physical, but for an evenly thick glazing surface, the result has no apparent difference from a physical volumetric absorption approach to the same task.

Internal reflections:

Diamond-close-up-inspection

It’s not intuitive to think that the air surface itself has reflections when seen through a transparent material volume like water or glass.
Viewed from under water, the air surface above, acts like a mirror for certain angles, reflecting objects that are under water. a glass ball lit by a lamp has a very distinct highlight, which is the reflected image of the light source itself (specular reflection), but it also has an internal highlight appearing on inside where the glass volume meets the air volume. we can easily ‘miss’ this internal highlight because in many cases it’s appearance converges with the bright focused light behind the ball, caused lensing (refractive caustics). the distinctly shiny appearance of diamonds, for example, is very much dependent on bright internal reflections, diamond cutting patterns are specifically designed to reflect a large percentage of light back to the viewer and look shiny, and if we wish to create a realistic rendering of diamonds, we will not only have to setup the correct refractive index for the material, but also model the geometric shape of the diamond correctly, and of course, set the material to render both external (“regular”******) reflections and internal reflections.
Your probably already guessing what I’m about to say next..
For thin surfaces with even thickness, the internal reflection is barely noticeable, because it converges with the main surface reflection, an for this reason, when rendering window glazing, car windshields, and the like, we can usually turn the internal reflections calculation off to save render time.

Underwater_31.12.18

Render Settings:

Simplified settings summary table:

Flat (Glazing) Physical (irregular volume)
Shadow Transparent Caustics
Color Filter Volumetric Absorption
Reflections External only External and Internal

Example Cycles (Blender) shaders:
> The Flat glazing shader is actually more complex to define since it involves defining different types of calculations per different type of rays being traced (cheating).
In general, for Shadow and Diffuse rays that shader is calculated as a simple Transparent shader and nor a refraction shader, and when back-facing, the shader is calculated as pure white transparent instead of glossy to remove the internal reflections.
> While the flat glazing shader is only connected to the Surface input of the material output, the physical glass shader has also a Volume Absorption BSDf node connected to the Volume input of the material output node.
> Note that a simple Principled BSDF material will have flat transparency and physical shadow (caustics) by default.
> For caustics to be calculated, the Refractive Caustics option has to be enabled in the Light Path > Caustics settings in the Cycles render settings.

Cycles

Example V-Ray Next for 3ds max material settings:
>
In V-Ray for 3ds max (and Maya) the Affect Shadows parameter in the VrayMtl Refraction settings determines weather the shadows will be fake transparent shadows suitable for glazing or (on) or opaque (off) which is the suitable setting for caustics.
> The caustics calculation is either GI Caustics which is activated by default in the main GI settings or a dedicated Caustics calculation that can be activated, also in the GI settings.
> For flat glazing the color is defined as Refraction Color and for physical glass the Refraction color is pure white and the glass color is set as Fog color.

V-Ray_Glass

Example Arnold for Maya settings:
> In Arnold 5 for Maya the Opaque setting in the shape node Arnold attributes must be unchecked for transparent shadows, and checked for opaque shadows suitable for caustics.
> For rendering refractive caustics in Arnold for Maya more settings are needed.
> When the Transmission Depth attribute is set to 0 the Transmission Color will be rendered as flat filter color, and when the Transmission Depth attribute is a value higher than 0 the transparency color will be calculated as volumetric absorption reaching the Transmission Color at the specified depth.

ArnoldMaya

General notes:

> in Brute Force Path Tracers like Cycles and Arnold the Caustics calculation is actually a Diffuse indirect light path. this seems un-intuitive, but the light pattern appearing on a table surface in the shadow of a transparent glass is actually part of the table surface’s diffuse reflection phenomenon.

> what we refer to as ‘Diffuse Color’ in dielectric (non-metals) is actually a simplification of absorption of light scattered inside the object volume (SSS).

* Optically all dielectric materials (non-metals) are refractive, but not all of them are also clear, the is, most of them actually have micro particles or structures within their volume, that scatter and absorb light that travels through them, creating the effects we’re used to refer to as “Subsurface Scattering” (SSS) and in the higher densities “Diffuse reflection”.

** Lensing is a term used to describe the effect of a material medium bending light, focusing and dispersing it, and so acting as a lens.

*** Actually all color in dielectric (non metallic) materials is created by Volumetric Absorption.

**** Light isn’t only absorbed as it travels through medium, it’s also scattered.

***** Volumetric shading effects usually use the model original scale (the true mesh scale), so to avoid unexpected results it’s best that the object’s transform scale will be 1.0 (or 100% depending on program annotation)

Related Posts:
>
Cycles Nested Transparencies
>
Arnold for Maya Refractive Caustics
> Arnold for Maya Transmission Scattering
> Understanding Fresnel Reflections
> Advanced Architectural Glazing shader for Blender
> V-Ray Underwater Rendering

Advanced Procedural Wood for Blender & Cycles

Software:
Blender 2.8 | Cycles

CG-Lion Wood Presets Pack 1.0 is an advanced 3D procedural wood shader I developed for Blender and the Cycles render engine that produces consistent wood pattern on all sides of the model without requiring UV coordinates.
The shader has many tweak-able parameters for easy customization of the wood pattern, and also has built-in varnish coat and paint layers.
CG-Lion Wood Presets Pack 1.0 ships with a ready-to-use material preset library.

CG-Lion Wood Presets Pack 1.0 is available on Blender Market:
https://blendermarket.com/products/cg-lion-wood-presets-pack-1

CGL_Wood_Presets_Pack_1.0_Node_B.jpg

This slideshow requires JavaScript.

CGL_Wood_Presets_Pack_1.0_Previews_Natural

CGL_Wood_Presets_Pack_1.0_Previews_Matte_Varnished

CGL_Wood_Presets_Pack_1.0_Previews_Varnished

Related:
Realistic Spotlights for Blender & Cycles
Optimized Architectural Glazing Shader for Cycles
Customizable Photo-realistic Car-paint shader for Cycles

 

Cycles render – Using the Normal Blue channel for top side effects

Software:
Blender 2.8 | Cycles Render

1.jpg

The shading normal‘s Z component can be easily used as a ready-to-use procedural mask for ‘covering effects’ like dust, snow, and if baked, also as a base for particle effects like debris and vegetation.

This simple shading flow example the shading normal‘s Z component, that represents how much the surface is facing upwards is separated , mixed (multiplied) with a noise textured and than fed into a ColorRamp Converter node for fine tuning the resulting mask:

2

This is the full shading flow of the snow effect in the image above:

3.jpg

Complex Fresnel texture for Cycles

Software:
Blender 2.79 | Cycles Renderer

The most realistic way to create real world metal shaders is to use Complex Fresnel reflection.
Cycles has a general implementation of a Complex Fresnel reflection in its Principled shader (when Metallic is set to 1.0), but this implementation doesn’t allow using real world physical numeric Complex IOR values in order to accurately render physical metals.

You can use a Complex IOR OSL shader such as this one from Chaos Group,
But there are some limitations with it:
1) It isn’t supported in GPU rendering.
2) For some reason I don’t know I couldn’t get it to work with Cycles..

Seeing these limitations I decided to develop a Complex Fresnel/IOR texture for Cycles that will work on GPU, and your welcome to download it here on my studio’s website:
https://cg-lion.com/2018/07/08/free-complex-fresnel-texture-for-blender/

The blend file itself contains a text with some Complex IOR preset values for metals,
And you can get more physical IOR data from refractiveindex.info

Enjoy! 🙂

BlenderNation

Related:

  1. Fresnel Reflections
  2. Metallic shading in V-Ray Next
  3. Create rich metal in UE4 
  4. Customizable Photo-realistic Car-paint shader for Cycles

 

Cycles – Nested Refractive Volumes

Software:
Blender 2.79 | Cycles Renderer

When it comes to rendering nested refractive volumes, like a glass containing a beverage, the way to set it up in Cycles is common to many modern ray-tracers.
The touching bodies of refractive material like glass and liquid must overlap each other slightly so that rays being traced “meet” the right surface without having surfaces touching and causing “Z fighting” artifacts.

Transparencies_Air_Bubbles-01

When the render includes volumetric shading, like Volume Absorption (sometimes referred to as “fog”), the meshes must be set-up in a certain way for Cycles to interpret the volumes properly.

Intersecting volumes like a beverage glass and liquid must be separate objects to be rendered correctly. When joined into one mesh the renderer doesn’t treat the different volumes separately even though they have different shaders.
And the result is that the volume (depth) of the inner volume is calculated as just the depth on the intersection (the overlap) of the volumes.
In this example the wine can’t be rendered correctly when the glass and liquid meshes are joined.
The wine liquid doesn’t get it’s deep color because the renderer “thinks” it’s very thin.

Untitled-1.jpg

When the meshes are separated the renderer interprets the wines volume correctly and the Volume Absorption shader produces the right color:

Untitled-2

Setting up cavities within a volume like air bubbles, is similar to many other modern ray-tracers. You just have to create inner meshes that have flipped normals facing inwards, so air bubbles within the wine don’t need to have “air” material, they have the same wine shader, but have their faces flipped.

Note that in this case, it’s the other way around from the previous example.
If the bubble meshes are separate from the liquid mesh the renderer doesn’t interpret them as holes in the liquid volume, and produces an incorrect result:

Untitled-3

When the bubble meshes are joined to the liquid mesh, the volume is interpreted correctly:

Untitled-4.jpg

In short:
For these refractive volumetric effects to be rendered correctly in Cycles,
Surfaces of the same material volume must be joined to one mesh, and separated from meshes belonging to different material volumes.
* This may sound trivial, but it’s not. there are rendering systems in which only the surface shader determines volume interpretation and that has advantages like the convenience to aninate bubbles as separate objects from the liquid itself or the ability to join a glass bottle with the liquid into one mesh model.

 

Related:
> Understanding Transparency Render Settings

Cycles Tangent node & Anisotropic reflection

Software:
Blender 2.82

The Cycles Tangent node defines a Tangent-Space for a mesh by either using one of the object’s local axes (see image A) or by using an available UV layout.
This can be useful when designing an Anisotropic reflection shader like in the case of brushed, machined or lathed metals.
A grey-scale texture can be connected to the Rotation input of the shader to define changes in the Anisotropic direction on the surface (see image B).

Examples:

A. In this example the Tangent node is set to ‘Radial’ Direction mode, in which a object axis is chosen as the radial axis of the Anisotropic direction:
Annotation 2020-05-07 132452

B. In this example a Noise texture’s Factor output is connected to the Anisotropic shader’s Rotation input to create an irregular Anisotropic (metal brushing finish) direction:

Annotation 2020-05-07 133126

 

Related:

  1. Adding a texture to an Area Light
  2. Using the normal’s blue channel to create top-side effects
  3. Nested transparencies

Cycles Light (Shadow) Sampling

Software:
Blender 2.79

By default, in Path Tracing Integrator Mode, Cycles traces one ray randomly between all lights (per each camera – AA sample).
So if some lights in the scene are more important than others this will cause inefficient light sampling.
* Especially if there are a few important lights and many unimportant ones.

Light sampling can be set per light by switching the Integrator Mode to Branched Path Tracing, making sure Sample All Direct Lights is checked, and the setting the number of samples per light in the light parameters.
* The option to set the number of samples at the light parameters is only available in Branched Path Tracing Mode.

Untitled-2

In the example below there are 3 lights.
The light on the right has 64 a samples per AA sample, while the 2 other lights have just 1 sample.

Untitled-1.jpg

More on Cycles sampling:
https://docs.blender.org/manual/en/dev/render/cycles/settings/scene/render/integrator.html#sampling

Animating the sample settings in Cycles

Software:
Blender 2.79

A quick Cycles rendering tip:

There are situations in which we need to render an animation with changing lighting complexity, and as a result, parts of the animation need more samples than others to be effectively rendered.
For example when the camera starts it’s movement on the outside in an exterior scene, and moves into an interior space like house or a cave, or a vehicle, in many cases, the exterior part of the animation can be rendered with much less samples than the interior part.

In such cases, rendering the whole animation with the higher sample settings will demand unneeded render time in the simpler parts of the animation.

One possible solution would be to simply render the animation in two separated render jobs with different sampling settings, one for the less demanding part and another for the more complex part and than append the two parts in an editing / compositing software. but that requires more work on the shot, more management etc.

A simple solution is to animate the sample settings in Cycles.
Make tests at different times along the animation to determine how many samples are needed at each part, and key-frame the settings accordingly.

AnimateSamples

Cycles True Displacement (experimental)

Software:
Blender 2.79

These are the steps to activate Cycles Render new experimental MTD feature (Micro Triangle Displacement)

Cycles Render settings:
Set ‘Feature Set’ to Experimental.

MTD_A

Object:
Apply a Subdivision Surface modifier and set it to Adaptive mode.
* Adaptive Mode is only available if the modifier has no other modifiers below it.

Set the ‘Dicing Scale’ attribute in pixels to set the displacement accuracy
* Lower numbers will result in greater details and more memory usage

MTD_B

Material Cycles settings:
Set Displacement to ‘True’ or ‘Both’.
* Setting it to Both will automatically use the same height map texture data to drive surface normals (bump) and create a consistent effect

Displacement set to 'True'
Displacement set to ‘True’
Displacement set to 'Both'
Displacement set to ‘Both’

Cycles material node:
Connect a texture to the Displacement input.

White color will displaced to a height of 0.1 units (10cm) by default, manipulate the texture data using math nodes to achieved desired height and offset.

MTD_D.jpg

Cycles Geometry settings:
For more accuracy reduce the Subdivision pixel rates And increase the maximum subdivisions.

MTD_E.jpg

 

Notes:

  1. There is currently conflict between Adaptive Subdivision and Tangent Space Normal Maps that renders objects completely black.
    A solution that is proposed at various discussions is to simply use Object Space mode in the Normal Map node.
    I’m not sure how good is this workaround for non flat surfaces..
    https://developer.blender.org/T49159
  2. When using a procedural fractal texture as a Displacement map, Shaders that are dependent on surface angle may significantly change their appearance in different rendering resolutions because the texture provides more and more detail for the displacement and that changes the nature of the geometry.
  3. The base mesh for the Displacement should be well Subdivided prior to the adaptive Subdivision in order to avoid polygon edges appearing.

Cycles Area Light pleasant surprise

Software:
Blender 2.79

One of the features I would really like added to the Cycles Renderer is a photo-metric workflow.
That is the ability to set light sources intensity using real-world photo-metric units, load IES photo-metric data, have a physical daylight system, and set photographic camera exposure and white-balance for the output image.

While Cycles currently doesn’t have a fully functional photo-metric workflow,
It is equipped with some important basic ingredients needed for the development of such a workflow.

One Of these features is the Black-Body color conversion node that allows specifying color by Kelvin color temperature,
Another is the procedural Sky texture featuring Hosek / Wilkie and Preetham physical sky models, that can also be controlled according to global position, date and time with this addon.

Recently I’ve had a pleasant surprize finding out that Cycles actually has another important feature for a photometric workflow, and that is that Cycles Area Lights maintain a fixed general light output (‘Luminous Flux’) while area is changed and changes specular intensity correctly to so that the smaller the light source area, the greater its brightness (as it should physically be).
* This in difference to the way a mesh light with an emission shader behaves where the light output is per area and therefore increases or decreases when changing the shape and size of the surface.

This makes designing light sources with a fixed total output of light yet different shape, and therefore different specular reflection, shading, shadow softness possible,
And is in itself a valuable feature in realistic light source design.
* Especially coupled with setting the light color using Kelvin color temperature (Black-body node)
The only thing missing is the an ability to specify the total output of the light source in Lumens (lm) units.

I have encountered a mentioning of Cycles having a physical scale conversion ratio here:

http://www.3d-wolf.com/camera.html

Marco Pavanello, the developer of the Blender ‘Real Camera Addon‘ wrote:
“In Blender the Emission Node Strength is measured in W/m^2”
I haven’t had the time yet to seriously find out how that should be translated to intensity in lumens..
* It  should be noted that both the Cycles Area light and mesh light use the Emission shader as there source for intensity / color settings, but differently,
You can see in the demonstrations below that for a light source of the same surface area a significantly larger strength value is needed to produce roughly the same light output as the light mesh and this is probably due to the output being internally divided by surface area which is in fact the subject of this post.

Here are some renders to illustrate the point, and the diffrent behavior of light mesh (mesh with an Emission shader)
I’ve added a rough glare effect that depends on float color intensity to illustrate the way the specular highlight intensity increases as the area of the ligt source gets smaller while overall light output is the same:

AREA_Sizes
Cycles Area Light with different sizes but same strength
MESH_Sizes
Cycles Mesh Light using an Emission Shader with different sizes but same strength

MESH_Sizes_Compensation

Cycles Mesh Light using an Emission Shader with different sizes and strength changes to compensate