Difference between revisions of "PBR Materials"

From Second Life Wiki
Jump to navigation Jump to search
m (Removed reference to PBRLowEndGraphicsSettingText.png until we can update it with the latest version in the release viewer.)
 
(94 intermediate revisions by 6 users not shown)
Line 1: Line 1:
Physically Based Rendering [Work in Progress]
{{multi-lang|1=PBR_Materials|2=/en}}
'''Physically Based Rendering'''
 
{{note|1=This page is being actively updated with new content and links as GLTF PBR Materials and related new features are being released. Contributions to this page may be from Second Life residents and staff members alike.}}
 
[[Category:glTF]]


== What is it and Why is it used? ==
== What is it and Why is it used? ==


The term “Physically Based Rendering” or “PBR” is a technical term that may need some defining for most people since its use is unique to composing images in computer software.  The term itself is an abbreviation for a collection of mathematics that attempts to accurately represent the ways that light reflects off of objects in the real world. In the real world, it is the behavior of light on a piece of metal that allows us, the observer, to recognize “that object is made of metal” without actually reaching out and touching it.  The way a metal reflects light differs from that of a polished plastic or some other material, and these differences have been quantified by science.  By mimicking real-world physics principles in the virtual world it allows for the creation of more immersive recognizable realistic spaces, but also it helps us relate to fantastical worlds a little better too.  While we may not be familiar with what a newly imagined creation is, a metal's inherent metal-ness and aged wood's inherent wood-ness remain constant, making it easier to intuitively understand what we are interacting with in a virtual environment.
The term “Physically Based Rendering” or “PBR” is a technical term that may need some defining for most people since its use is unique to composing images in computer software.  The term itself is an abbreviation for a collection of complex mathematical algorithms that attempt to accurately represent the ways that light reflects off and interacts with objects in the real world. In the real world, it is the behavior of light on a piece of metal that allows us, the observer, to recognize “that object is made of metal” without actually reaching out and touching it.  The way a metal reflects light differs from that of a polished plastic or some other material, and these differences have been quantified by science.  By mimicking real-world physics principles in the virtual world it allows for the creation of more immersive recognizable realistic spaces, but also it helps us relate to fantastical worlds a little better too.  While we may not be familiar with what a newly imagined creation is, a metal's inherent metal-ness and aged wood's inherent wood-ness remain constant, making it easier to intuitively understand what we are interacting with in a virtual environment.


Because tying the mathematics to simulate materials in virtual spaces to how they behave in the real-world makes things more immediately recognizable, PBR has become the foundation for creating imagined worlds over the last decade.  The metallic shine of exoskeletal armor in superhero movies is driven by PBR mathematics, as is the plastic sheen of toys or the glint of frozen ice in animated classics.  Now we are moving to bring this standardized quality to your home in Second Life.
Because tying the mathematics to simulate materials in virtual spaces to how they behave in the real-world makes things more immediately recognizable, PBR has become the foundation for creating imagined worlds over the last decade.  The metallic shine of exoskeletal armor in superhero movies is driven by a PBR workflow, as is the plastic sheen of toys or the glint of frozen ice in animated classics.  Now we are moving to bring this standardized quality to your home in Second Life.


Bringing PBR to Second Life means updating the basic mathematics of how light is represented in the world of Second Life.  This includes the sun, the sky, lights, and the camera.  Changes to these systems will slowly be developed and rolled out over time, but the goal is to change these things while minimally changing how everything that presently exists in Second Life that was designed before PBR looks and feels.  While the preservation of creative intent and the aesthetic appeal of items users have enjoyed for over two decades of Second Life is always a priority, Second Life is an ever-evolving platform, and to continue to do so, some changes are inevitable.
Bringing PBR to Second Life means updating the basic calculations of how light is represented and interacts with the world of Second Life.  The goal is to integrate these changes while minimally changing how everything that presently exists in Second Life (designed prior to the introduction of PBR) looks.  While the preservation of creative intent and the aesthetic appeal of items users have enjoyed for over two decades of Second Life is always a priority, Second Life is an ever-evolving platform, and to continue to do so, some changes are inevitable.


Lastly, while we are attempting to mimic real-world reflections and material properties, Second Life has to run on a wide variety of devices, so some shortcuts have to be made.  Reflections are not mirror-perfect, as has often been a long-standing hope and request from Residents.  While the addition of a reflection system does bring dreams of distortion-free mirrors for our avatars in Second Life closer to reality, unfortunately, due to the calculation requirements of doing perfect reflections, mirrors are sadly still, for the moment, not practical.
Lastly, while we are attempting to mimic real-world reflections and material properties, Second Life has to run on a wide variety of devices, so some shortcuts have to be made.  Reflections are not mirror-perfect, as has often been a long-standing hope and request from Residents.  While the addition of a reflection system does bring dreams of distortion free mirrors for our avatars in Second Life closer to reality, unfortunately, due to the calculation requirements of doing perfect reflections, mirrors are sadly still, for the moment, not practical. Please see the note in the [[#Understanding_and_Assisting_the_New_Reflections_System|section below]] for more info.


== What does this mean for Residents? ==
== What does this mean for Residents? ==
[[File:ReflectionSettings_ToArticle.jpg | thumb | right | None of the objects depicted in the scene have “PBR” materials.  These things are using pre-PBR specular material settings and the “Shiny” parameter that has existed since 2008.
[[File:PrePostPBR.png | thumb | right | The lamp in this screenshot uses [[PBR_Materials#Nomenclature_changes|Blinn-Phong]] (Classic SL Materials), and was created before PBR's integration into SL; and demonstrates some of the visual differences to existing content. The environment used for the screenshot is the viewer's default Midday preset (Note that the PBR viewer has a new Midday preset).
<br />Statue >> Glossiness 74 // Environment 170
<br />Large Red Sphere >> 255 Glossiness // 0 Environment
<br />Cone >> Medium Shiny
<br />Small Sphere >> High Shiny
]]
]]
=== Changes to Existing Content: ===
=== Changes to Existing Content ===
The largest change by far is the addition of an environmental reflection system to Second Life.  For most existing items, this change shouldn’t have a drastic, immediately observable impact.  A few things in your inventory that you already own may appear more reflective with the new graphics configuration, and those reflections should feel more realistic and immersive with your current environment.  As a general rule, the “shinier” an object was before, the more environment reflections it will pick up, and the more visual difference there will be. You can remove these extra reflections by simply changing to “Reflection: Disabled” in your Advanced Graphics Settings.\
The largest change by far is the addition of an environmental reflection system to Second Life.  For most existing items, this change shouldn’t have a drastic immediately observable impact.  A few things in your inventory that you already own may appear more reflective with the new graphics configuration and those reflections should feel more realistic and immersive with your current environment.  As a general rule: the “shinier” an object was before, the more environment reflections it will pick up and the more visual difference there will be.
 
Another notable change is the addition of [https://en.wikipedia.org/wiki/Tone_mapping tonemapping] to the viewer. Tonemapping is a way of representing an image with a higher native dynamic range than the display can support. Tonemapping is a de-facto requirement of PBR pipelines. This means that colors in Second Life will generally appear more saturated with less detail being lost in shadows and highlights. [https://modelviewer.dev/examples/color.html Click here for some additional reading on the subject.]
 
The tonemapping method used is called '''Academy Color Encoding System ('''aka '''"ACES")''', and can be read about [https://www.oscars.org/science-technology/sci-tech-projects/aces here] and [https://docs.nvidia.com/gameworks/index.html#devices/shield-hdr-dev-guide/hdr-dev-guide-nvidia-shield.htm here].
 
[[PBR_Materials#Nomenclature_changes|Blinn-Phong]] content making use of the Specular parameters may look different if the items were never viewed under local lights, as the PBR viewer allows for the environment (sun ''and'' sky) to contribute to specular reflections. As such, if the object receives blue specular reflections from the sky, these reflections are tinted, and may look odd. This effect is the same as prior viewers, as if the object was lit by a blue local light.


=== Removal of Advanced Lighting Model ( ALM ) Graphics Option ===
There have been changes to the '''Graphics > Advanced Settings...''' Preferences. The most notable of which is the removal of the “Atmospheric Shaders”, "Local lights" and “Advanced Lighting Model” options.


=== Removal of Advanced Lighting Model ( ALM ) Graphics Option: ===
For those users on lower-end hardware who depended heavily upon those options to navigate Second Life with an acceptable framerate, we recommend the following settings:
There have been changes to the [Advanced Settings] Graphics Options as well, the most notable of which is the removal of the “Atmospheric Shaders” and “Advanced Lighting Model” options.  For those users who depended heavily upon these options to navigate Second Life on computers without dedicated graphics cards, we recommend they instead set Shadows: None, Reflections: Disabled while disabling “Transparent Water” and “Ambient Occlusion”, as the resources that are used to calculate reflections and shadows are the primary cause of poor viewer performance on devices with limited graphics capabilities.
*{{code|Transparent Water: Disabled}}
*{{code|Screen Space Ambient Occlusion: Disabled}}
*{{code|Shadows: None}}
*{{code|Screen Space Reflections: Disabled}}
*{{code|Reflection Detail: Static Only}}
*{{code|Reflection Coverage: Manual only}}


[[File:ALM_Disable.jpg | thumb | none| Limited Advanced Graphics Options. ]]
The {{code|Local Lights}} setting has been superceded by updates made to the '''World > Improve graphics speed...''' "Quality & Speed" slider options. Users on low-end hardware should ensure that their "Quality & Speed" slider is set at an appropriate level for their hardware.


== What does this mean for Creators? ==
== What does this mean for Creators? ==
=== Nomenclature changes ===
The PBR project represents a large step towards integrating standard rendering techniques used in the games industry. As such, the nomenclature of some items has changed, notably, what was once called '''[[:Category:Materials|Materials]]''' is now referred to as '''Blinn-Phong'''. This does not represent any changes to the underlying rendering techniques (beyond those mentioned above); and as such Blinn-Phong ''is not'' the same as PBR Spec/Gloss workflows, seen in some game engines such as Unity.
=== Importing PBR Materials from External Software: ===
=== Importing PBR Materials from External Software: ===
For creators who work with external tools such as Blender, Adobe Substance Painter, Cinema4D, 3D-Coat, or have used Unity or Unreal Engine, the use of PBR-based texture sets should already be familiar.  In fact, experienced creators have been using tools that use PBR mathematics to create content for Second Life and then have been forced to sacrifice visual quality to convert that information into Second Life’s existing Blinn/Phong materials system.  Second Life is adopting the “Metallic / Roughness” PBR model, and in its ongoing commitment to using Open Source standards whenever it is practical to do so, the GLTF 2.0 file format has been chosen as the upload format for PBR Material assets.  One of the primary goals of implementing PBR Materials is to have more continuity from content creation applications towards Second Life, and have more consistent content behavior, once it’s ready to be placed in the world.
For creators who work with external tools such as Blender, Adobe Substance Painter, Cinema4D, 3D-Coat, or have used the Unreal or Godot game engines, the use of PBR texture sets should already be familiar.  In fact, some creators have been using tools that use PBR workflows to create content for Second Life and have then been forced to sacrifice visual quality to convert that information into Second Life’s existing Blinn-Phong materials system.   
 
Second Life is adopting the “Metallic/Roughness” PBR model, and in its ongoing commitment to using Open Source standards whenever it is practical to do so, the glTF 2.0 file format has been chosen as the upload format for PBR Material assets.  One of the primary goals of implementing PBR Materials is to have more continuity from content creation applications towards Second Life, and have more consistent content behavior once it’s inworld.


=== Using Imported Materials in Second Life ===
=== Using Imported Materials in Second Life ===
For people who build exclusively within Second Life, the addition of PBR also means that there will be a new inventory object type called a “Material”.  These Material objects are also purchasable on Marketplace and exchangeable like any other texture in Second Life.
[[File:Editing_Material.jpg|thumb|right|Material Editing]]
For people who build exclusively within Second Life, the addition of PBR also means that there will be a new [[LlGetInventoryType|Inventory Type]] called “Material”.  These new Materials can be purchased on the Marketplace and are shareable like any other permitted object in Second Life.


PBR materials come as a bundle of textures and primitive parameters, such as face tint and specular color.  These all travel as a single unit and are applied all at once.  If you wish to change tint, transparency or other similar parameters that used to be readily available, you’ll need to modify the Material object itself.
PBR materials come as a bundle of textures.  These all travel as a single unit and are applied all at once.  If you wish to change tint, transparency, or other similar parameters of the Material you’ll need to modify the Material from the "Editing Material" floater.


Applying existing materials works similarly to existing textures; you have two means of doing so:
{{KBcaution|Meshes uploaded after the PBR release will look slightly different (and more accurate to your editor of choice) due to a change in the way Second Life handles mesh assets (Previously, some data required for accurate tangent generation was discarded at upload time - this is no longer the case). This will mean that a PBR material applied to a mesh uploaded before PBR launched (28th November 2023) might look incorrect; a simple reupload of the mesh will solve this. '''This is not required, but recommended.'''}}


=== Drag and Drop: ===
Applying existing materials works similarly to existing textures. You have two means of doing so:
Simply drag and drop onto the face of a prim or a mesh.  For example, if you have a tiled floor material, and you place it on a prim cube, that cube face will now look like a tile floor and reflect light like a tiled floor would as well; as if the flat face of the cube had all the bumps of a tiled surface.
 
==== Drag and Drop ====
Simply drag and drop onto the face of a prim or a mesh.  For example, if you have a tiled floor material and you place it on a selected prim cube face that face will now look like a tile floor and reflect light like a tiled floor would with all the material qualities contained in the material.
[[File:DragAndDrop_Mat_Wiki.png | thumb | none | Drag and Drop Functionality.]]
[[File:DragAndDrop_Mat_Wiki.png | thumb | none | Drag and Drop Functionality.]]


=== Switch to PBR and select from Inventory: ===
==== Switch to PBR and select from Inventory ====
Alternatively, select a face on the prim or mesh you want to apply your material to and choose the “Material” drop-down and change it to “PBR”, then select “Choose an item from your inventory” and apply.
Alternatively, select a face on the prim or mesh you want to apply your material to and choose the “Blinn-Phong” drop-down and change it to “PBR Metallic Roughness”, then select “Choose an item from your inventory” and apply.
[[File:PBRSelector.png | thumb | none | Menu drop-down demonstration.]]
[[File:PBRSelectorV3.png |left| thumb | none | Menu drop-down demonstration.]][[File:Material_Dropdown.jpg|thumb|none|Dropdown as of v7.0.1.689]]
 
<br clear=all>
 
==== Texture Transforms ====
With PBR materials, texture transforms work in a slightly different way to Blinn-Phong transforms. Blinn-Phong (and OpenGL) has the texture origin in the lower left corner of the texture, whereas glTF materials (and Vulkan) has the texture origin in the <b>upper left</b> corner.
 
This means that PBR materials will react differently (namely, they are inverted in the Y (glTF v) axis) to Blinn-Phong materials.
For a simple solution to convert a Blinn-Phong texture transform to a PBR texture transform, please see [https://community.secondlife.com/forums/topic/507448-lsl-math-for-gltf-transformation/?do=findComment&comment=2678959 this forum thread].
 
For more information, [https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#images see here] and [https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_texture_transform here].
 
=== Media-on-a-Prim ===
Media on a prim will continue to work largely as it has done prior to PBR's launch.
 
When using MOAP on a face with a PBR texture, it will function as if the media texture has an override to the '''Base Color''' and '''Emissive''' maps. Note that the emissive map is overridden, however the emissive tint is not (so, to disable the emissive map you can set the emissive tint to black <0,0,0>).
 
== Tools & Tutorials ==
As the PBR system is new, it is expected that existing users may be confused at first on how everything works. As such, Linden Lab and some third parties have provided some tutorials and informational videos:
 
*'''[https://www.youtube.com/watch?v=JtjGf06B8ZA Second Life University - PBR Materials]'''
*'''[https://www.youtube.com/watch?v=BJ1eRTlWDYk Second Life University - How to create PBR Materials]'''
*'''[https://substance3d.adobe.com/tutorials/courses/pbrguide Allegorithmic (Adobe) PBR Guide]'''


== PBR Stand-In Textures and Outdated Viewers: ==
The above tutorials require knowledge and access to Adobe's Substance Painter (subscription based software on Adobe website, or sold as perpetual license with one year of updates on Steam). Below are some open source tools and links found Googling 'Blender', 'glTF' (requiring Blender 3.3)
*'''[https://www.khronos.org/blog/art-pipeline-for-gltf Khronos Art Pipeline tutorial]'''
*'''[https://materialmaker.org Material Maker software]'''
*'''[https://aiaicapta.in/gltf-packer/ glTF Packer software]'''
*'''[https://armorpaint.org Armorpaint software]'''
*'''[https://armorlab.org Armorlab software]'''
*'''[https://youtu.be/KTPdNUGwIGc glTF Blender Tutorial]'''
*'''[https://youtu.be/p7OPRoT6FkY Exporting glTF Alpha Textures tutorial]'''
 
== PBR Stand-In Textures and Outdated Viewers ==
It is worth mentioning that during the adoption period of a new system, a substantial portion of Second Life Residents view the world through third party viewers and mobile viewer solutions that will not have updated to be able to see the new content.  Anyone viewing a PBR Material on a viewer that cannot display it will see the “underlying” non-PBR texture.  By default, this is a pine box or a completely blank texture.  Those who wish their content to be viewable by as many people as possible, might consider creating a Diffuse texture ( with baked lighting, the kind that is easily generated with tools like Substance Painter's “Baked Lighting Filter” ) and applying it as a regular texture to the object they’re placing the PBR material on, prior to applying the PBR material.  While this is an extra step in content creation, and complicates things somewhat, if you wish for your content to be appreciated by all, it’s worth considering adding this extra step to your workflow.  People designing PBR materials for distribution and sale might also consider offering a “Diffuse Only fallback” texture to accompany the PBR material specifically for people who cannot see the PBR content.
It is worth mentioning that during the adoption period of a new system, a substantial portion of Second Life Residents view the world through third party viewers and mobile viewer solutions that will not have updated to be able to see the new content.  Anyone viewing a PBR Material on a viewer that cannot display it will see the “underlying” non-PBR texture.  By default, this is a pine box or a completely blank texture.  Those who wish their content to be viewable by as many people as possible, might consider creating a Diffuse texture ( with baked lighting, the kind that is easily generated with tools like Substance Painter's “Baked Lighting Filter” ) and applying it as a regular texture to the object they’re placing the PBR material on, prior to applying the PBR material.  While this is an extra step in content creation, and complicates things somewhat, if you wish for your content to be appreciated by all, it’s worth considering adding this extra step to your workflow.  People designing PBR materials for distribution and sale might also consider offering a “Diffuse Only fallback” texture to accompany the PBR material specifically for people who cannot see the PBR content.
{{KBcaution|Once a PBR Material is applied, the Blinn-Phong textures cannot be updated. To remedy this, remove the PBR Material, then make changes to the Blinn-Phong textures and then reapply the PBR Material.}}


== Understanding and Assisting the New Reflections System ==
== Understanding and Assisting the New Reflections System ==
Those creators that work at house-scale, or produce items that can be walked through, can gain additional control over the lighting in their creations by taking the time to fully understand the new toolkit that influences environmental reflections. There is a new type of volume that can be created and appended to object linksets specifically for scenes with these kinds of spaces.  These volumes define a custom area where reflections are calculated, overriding the default solution.  So-called “Reflection Probes” should be placed in a manner such that ''the fewest number of probes fills the largest amount of space possible with minimal overlap''.  One probe per room is a good reference point for a general living space like a house.  If multiple probes exist in a given area they can cause visual artifacts and negatively impact performance  (also known as viewer lag).  '''''Do not affix reflection probes to small creations such as furniture or decor.'''''  Small items such as tables, chairs, musical instruments, candle sticks etc should use the reflection sample volume in the space in which they are placed.  They should not have one appended.  It is '''strongly''' recommended that any object that contains a reflection sample probe be left as “modify”, so the positioning of the probe can be adjusted or even removed by the owner of the object should they wish.
Those creators that work at house-scale, or produce items that can be walked through, can gain additional control over the lighting in their creations by taking the time to fully understand the new toolkit that influences environmental reflections. There is a new type of volume that can be created and appended to object linksets specifically for scenes with these kinds of spaces.  These volumes define a custom area where reflections are calculated, overriding the default solution.  So-called “Reflection Probes” should be placed in a manner such that ''the fewest number of probes fills the largest amount of space possible with minimal overlap''.  One probe per room is a good reference point for a general living space like a house.  If multiple probes exist in a given area they can cause visual artifacts and negatively impact performance  (also known as viewer lag).  '''''Do not affix reflection probes to small creations such as furniture or decor.'''''  Small items such as tables, chairs, musical instruments, candle sticks etc should use the reflection sample volume in the space in which they are placed.  They should not have one appended.  It is '''strongly''' recommended that any object that contains a reflection sample probe be left as “modify”, so the positioning of the probe can be adjusted or even removed by the owner of the item should they wish.
 
{{Enote|Reflection probes '''are not''' intended for use with planar mirrors, and will look incorrect when being used to do so. Planar mirrors have been flagged for future work, but are not directly in the scope of the PBR project.}}
<!-- This image has been removed from public view as it is factually incorrect; as it references the blue tint on the floor as originating from the ocean, and not the sky. Note that the public project viewer currently also has a bug wherein the sky contribution on objects is too powerful; this has since been fixed however a public build containing the fix is yet to be released. [[File:ProblePlacementDemo_v.png | right | A visual demonstration of how manual probes interact with the surrounding environment and enhance it.]] -->


[[File:ProblePlacementDemo_v.png | right | A visual demonstration of how manual probes interact with the surrounding environment and enhance it.]]
== When is it Recommended to Create a Reflection Probe? ==
== When is it Recommended to Create a Reflection Probe? ==
Manually placed probes are good for cleaning up undesirable noise and lighting from automatically placed probes that may be visually disruptive or confusing.  If you look in the image below, on the left hand side of it, you can see a blue tinge on the floor, which is the reflected blue light from the ocean.  The probe filling half the room blocks this and when it is extended to completely fill the room and just slightly beyond the thickness of the walls, (right hand image) the problem is solved.  The probe does not need to be a part of the link-set for the rest of the room in order to function; however, once you have them placed it’s possible to add them into link-sets like any other prim.
Manually placed probes are good for cleaning up undesirable noise and lighting from automatically placed probes that may be visually disruptive or confusing.  If you look in the image of the room in a house, on the left hand side of it, you can see a blue tint on the floor, which is the reflected blue light from the sky.  The probe filling half the room blocks this, and when it is extended to completely fill the room and just slightly beyond the thickness of the walls, (lower copy of the image) the problem is solved.  The probe does not need to be a part of the linkset for the rest of the room in order to function; however, once you have them placed it’s possible to add them into linksets like any other prim.
 
=== Constructing a Reflection Sample Volume ( aka Reflection Probe ) ===
Start off in the Build Menu ''(Ctrl+3)'' by rezzing a basic prim. Under the <code>Features</code> tab, at the bottom check the box labelled <code>Reflection Probe</code>.
[[File:ProbeUI.jpg | thumb | none | Manual Probe Creation UI.]]
 
* <code>Reflection Probe</code>:  Enabling this creates a Reflection Sampling Volume within the bounding box of the prim.
* <code>Box / Sphere Drop-down</code>: Choose whether you want this sample to project reflections within a box shaped volume or a spherical one.
* <code>Dynamic</code>: Allow skinned objects (e.g. Avatars, animesh, etc.) to be captured in the reflection.
* <code>Ambiance</code>: Affects how much objects within the volume are lit as if they have bounced light hitting them from faked indirect illumination. ''See [[PBR_Materials#Fine-Tuning_Reflection_Sample_Volumes|"Fine-Tuning Reflection Sample Volumes"]] for more info.
* <code>Near Clip</code>: Sometimes, there will be a large obstruction in the center of the volume you wish to use as a reflection probe. For example, suppose that there is a large architectural supporting structure in the middle of the room, such as a column. If the probe gets placed internally inside this, it will reflect the internal surface of the column instead of the room in which it is placed.  Increasing Near Clip will make the sampling volume exclude objects n meters from the center so they don’t get included in the reflection. ''See [[PBR_Materials#Fine-Tuning_Reflection_Sample_Volumes|"Fine-Tuning Reflection Sample Volumes"]] for more info.
 
Select an appropriate probe shape for your scene. For example, if you want to create a reflection probe that covers a room, select a <code>Box</code> shape, or for other objects a <code>Sphere</code> shape is recommended.
 
Move the reflection probe and resize it as necessary to fit your desired purpose. For the room example, resize the box so the probe just touches the walls, ceiling and floor of the room.


=== Constructing a Reflection Sample Volume ( AKA Reflection Probe ) ===
It is recommended to start with a basic prim. For the sake of “readability,'' it is also recommended that you use the prim type of the sample volume you wish to create.  IE: A box prim for a box probe and a sphere prim for a sphere probe.
Make the prim transparent by setting transparency to 100% using the build menu.  The use of transparent textures/materials is not recommended.
Naming your probes is also recommended, so other people ( or yourself later on ) will remember why there’s a large transparent prim in the middle of your build.
Naming your probes is also recommended, so other people ( or yourself later on ) will remember why there’s a large transparent prim in the middle of your build.


Using the Build Menu ( Ctrl + 3 ), navigate to the “Features'' Sub-Tab.  At the bottom, below settings for Prim Point Light, you will find a set of buttons that look like this :
If you wish to come back and edit the reflection probe later on, enable both <code>Show Reflection Probe Volumes</code> and <code>Select Reflection Probes</code> under <code>Build > Options</code>.
[[File:ProbeUI.jpg | thumb | none | Manual Probe Creation UI.]]


* Reflection Probe:  Enabling this creates a Reflection Sampling Volume within the bounding box of the prim.
=== Fine-Tuning Reflection Sample Volumes ===
* Box / Sphere Drop-down: Choose whether you want this sampler to project reflections within a box shaped volume or a spherical one.
{{KBwarning|Sample volumes do not react to prim parameter changesOptions such as “Hollow” or “Taper” or “Shear” do not change how the sampling area behaves.}}
* Dynamic: Forces the reflection sampler to update this one more frequentlyAlso adds the ability to capture avatars in the reflection.
* Ambiance: Affects how much objects within the volume are lit as if they have bounced light hitting them from faked indirect illumination.
* Near Clip: Sometimes, there will be a large obstruction in the center of the volume you wish to use as a reflection probe. For example, suppose that there is a large architectural supporting structure in the middle of the room, such as a column; if the probe gets placed internally inside this, it will reflect the internal surface of the column instead of the room in which it is placed.  Increasing Near Clip will make the sampling volume exclude objects N meters from the center so they don’t get included in the reflection.


== Adjusting Reflection Sample Volumes ==
That said, it may be helpful to visualize <code>Near Clip</code> as the hollowing out of your reflection sample volume, but the hollow and near-clip are not in any way linked and doing so is purely a convenience.  Reflection probe sample volumes only respond to changes in scale and position; however, different probe volumes behave differently when resized.
Sample volumes do not react to prim parameter changes.  Options such as “Hollow” or “Taper” or “Shear” do not change how the sampling area behaves. It may, however, be helpful to visualize “Near Clip” as the hollowing out of your reflection sample volume, but the hollow and near-clip are not in any way linked and doing so is purely a convenience.  Reflection probe sample volumes only respond to changes in scale and position; however, different probe volumes behave differently when resized.
* <code>Box</code> Probes: These are affected by position and non-uniform scale.
* Box Probes: These are affected by position and non-uniform scale.
Example: If I create a box reflection probe and scale it to 10m,30m,10m size, the full volume will be affected by the probe.
Example: If I create a box reflection probe and scale it to 10m,30m,10m size, the full volume will be affected by the probe.
* Sphere Probes: These are affected by position and uniform scale only, otherwise the smallest dimension is used.
* <code>Sphere</code> Probes: These are affected by position and '''uniform''' scale only, otherwise the smallest dimension is used.
Example: If I create a spherical probe and scale it to 10m,30m, and 10m size , the probe will sample a 10 meter diameter spherical volume at the center of the probe.  However, a 30m,30m,30m sphere will create a sampling volume of a 30 meter diameter sphere.
Example: If I create a spherical probe and scale it to 10m,30m, and 10m size , the probe will sample a 10 meter diameter spherical volume at the center of the probe.  However, a 30m,30m,30m sphere will create a sampling volume of a 30 meter diameter sphere.
[[File:SphereProbeErrror.jpg | thumb | none | A diagram of how spherical probes function while non-uniformly-scaled.]]
[[File:SphereProbeErrror.jpg | thumb | none | A diagram of how spherical probes function (or, don't function as you may expect) while non-uniformly-scaled.]]
 
<code>Reflection Probe Ambiance</code> controls how ambient light (Found in your [[Environmental_Enhancement_Project#EEP_Settings_Objects|environment preset]]) affects, or does not affect, the contents of the reflection probe, and the intensity of indirect lighting (aka Irradiance).
This value is influenced by the <code>Reflection Probe Ambiance</code> value found in the user's [[Environmental_Enhancement_Project#EEP_Settings_Objects|environment preset]], wherein if the Ambiance value given in the [[Environmental_Enhancement_Project#EEP_Settings_Objects|environment preset]] is higher than the value defined by the probe itself, it inherits the ambiance value of the [[Environmental_Enhancement_Project#EEP_Settings_Objects|environment preset]], or alternately if the ambiance value defined by the probe is higher, the probe's value is used.
 
There are 3 operation modes that are set with the <code>Reflection Probe Ambiance</code> value, in tandem with above:
* '''0''' will allow the Environment Ambient color to be applied at full intensity.
* ''' Greater than 0 and less than 1''' will blend the Environment Ambient color and probe irradiance (indirect lighting) in a ratio corresponding to the defined value (e.g. 0.5 is a 50/50 split).
* '''1 or above''' will block the Environment Ambient color from being applied within the probe volume and irradiance is applied at full intensity (or with a multiplier for values above 1).
** '''4 or above''' works the same as above, however only indirect lighting received from the sky will be multiplied to a value above 4. Local lights are clamped at 4.0.
 
=== Complex Reflection Probe placement ===
 
At times, you may wish to place a reflection probe in an area where the reflection probe types (Sphere or Box) do not conform to the shape of the area. For example, a Box probe in a loft room has a triangular shape, which results in "probe bleed" wherein the influence volume affects an area larger than what is needed, and thus bleeds out onto the exterior roof, which is undesirable.
 
In these cases, you may need to place multiple probes in order to blend together the sample volumes to achieve the desired result. In the loft room example, it's best to start with 3 box probes, which cover the floor, and each side of the roof. Then, use an additional box probe as "fill" to cover the gap inbetween the 3 probes. The main fill probe may need to be rotated at an angle to get the most coverage possible. If it is not possible to fill the gap between the 3 probes with this fill probe, you may wish to add more box probes to act as "secondary fill".
 
[TODO: Put photo examples of the above here!]


== PBR Material Composition: ==
Alternately, Sphere probes may be used to achieve the same result. Sphere probes have considerably softer blending than box probes, so this may give you the best results in severe bleed conditions.
 
=== Unsupported use-cases ===
{{KBwarning|Do not attempt to do anything listed below. These uses are liable to either intentionally be disabled, or stop working in future updates.}}
You may be tempted to use reflection probes in the following ways, however these use-cases are either intentionally disabled or result in undefined behavior, and may work now but may not in future. '''You have been warned.'''
 
'''Under any circumstances, you should NOT:'''
* Wear a reflection probe. This intentionally does not work. (Reflection probes are a property of the scene, not an individual object / avatar)
* Attach a reflection probe to a physics-enabled object, e.g. vehicles. This intentionally does not work. (As above, the reflection probes are part of the scene; not part of an individual object. Reflection probes by design do not update in real-time, thus the object would always have incorrect reflections anyway.)
 
== PBR Material Composition ==
PBR-defined values are measured by optical sensors and other capture tools and recorded in databases.  These parameters are then put into commercial software to be used by content creators.  Using software designed to create PBR content is always recommended; however, understanding how PBR materials are assembled can assist with editing and compiling them.  Having a direct understanding of what each individual color channel contributes is essential for editing PBR textures without relying upon some of the more advanced toolkits available.
PBR-defined values are measured by optical sensors and other capture tools and recorded in databases.  These parameters are then put into commercial software to be used by content creators.  Using software designed to create PBR content is always recommended; however, understanding how PBR materials are assembled can assist with editing and compiling them.  Having a direct understanding of what each individual color channel contributes is essential for editing PBR textures without relying upon some of the more advanced toolkits available.


Line 84: Line 174:
PBR Materials are composed of a set of four specifically designed textures; they are as follows:
PBR Materials are composed of a set of four specifically designed textures; they are as follows:


===Base Color [ RGB ] + Transparency [ A ] :===
===Base Color [ RGB ] + Transparency [ A ]===
[RBG]: This is the unlit color of the surface.  This differs from the “Diffuse” texture that Second Life uses.  Diffuse textures often include faked reflection and specular information as well as added Ambient Occlusion shadows.  Base Color textures do not get any of this added information.  For metals ( as defined by the metalness value ), Base Color also determines specular reflection color, whereas, in non-PBR systems, this is defined by the Specular Color texture.  In certain PBR texturing applications, Base Color is sometimes also referred to as “Albedo”.
[RGB]: This is the unlit color of the surface.  This differs from the “Diffuse” texture that Second Life uses.  Diffuse textures often include faked reflection and specular information as well as added Ambient Occlusion shadows.  Base Color textures do not get any of this added information.  For metals ( as defined by the metalness value ), Base Color also determines specular reflection color, whereas, in non-PBR systems, this is defined by the Specular texture and tint.  In certain PBR texturing applications, Base Color is sometimes also referred to as “Albedo”.
<br />[ A ]: Transparency dictates the transparency of the entire material overall.
<br />[ A ]: Alpha Channel, dictates the transparency of the entire material overall.
 
The Base color texture should be devoid of lighting information.


===Occlusion [R] / Roughness [G] / Metalness [B] :===
===Occlusion [R] / Roughness [G] / Metalness [B]===
This texture is composed of 3 unrelated grayscale images stored in 3 different color channels of an RGB texture.
This texture is composed of 3 unrelated grayscale images stored in 3 different color channels of an RGB texture.
<br />[R]: Ambient Occlusion shadow data used to be added as a multiply mask onto Diffuse textures, but for PBR textures, it gets its own channel in the O/R/M map.
<br />[R]: (Ambient) Occlusion is lighting data, '''removing''' the need to bake down shadows on to the Base Color map. Note that ''white'' (<1,1,1>) means no occlusion is applied, and ''black'' (<0,0,0>) applies full occlusion.
<br />[G]: Roughness data ranges from 0 to 1.0, but the actual range of physical surfaces ranges from approximately 0.05 to 0.985.  No surface is perfectly smooth or completely rough.  The rougher a surface is the less mirror-like it behaves.   
<br />[G]: Roughness data ranges from 0 to 1.0, but the actual range of physical surfaces ranges from approximately 0.05 to 0.985.  No surface is perfectly smooth or completely rough.  The rougher a surface is the less mirror-like it behaves.   
<br />[B]: Metalness values are mostly black or white.  Either the material is a conductive metal like copper, or it’s a non-metal like fabric.  0.0 is Non-Metallic, 1.0 is Metallic.  There are almost no materials with gray metalness values.
<br />[B]: Metalness values are mostly black or white.  Either the material is a conductive metal like copper, or it’s a non-metal like fabric.  0.0 is Non-Metallic, 1.0 is Metallic.  There are almost no materials with gray metalness values.
<br />The alpha channel is ignored, as per the [https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#additional-textures glTF 2.0 specification].
{{Enote|The Occlusion map '''is not''' controlled by the "Screen Space Ambient Occlusion" toggle in the Advanced Graphics Settings. '''The Occlusion map is ''always'' enabled.'''}}


===Emissive [ RGB ]:===
===Emissive [ RGB ]===
This determines the amount and the color of glow that your material generates if you choose to enable it.  Glow is ( and always has been ) a source of visual lag, so be mindful of using this channel only where and when you need to. Leaving the Emissive slot empty is recommended when it’s unused.
This determines the amount and the color of unlit (ignores ambient light conditions) areas of your material. When giving an object a white emissive map, the object will act as if the Blinn-Phong "Fullbright" option was checked. This map is useful for items which are expected to emit light, e.g. a table lamp, where the lamp shade would appear to glow when the lamp is turned on. If you wish to toggle the lamp on and off, it's recommended to change the Emissive Tint value to black (functionally disabling the emissive map, thus turning the lamp off), and then changing the tint back to your desired color to turn the lamp back on. Leaving the Emissive slot empty is recommended when it’s unused.


===Normal [ RGB ] :===
Note that glow (The postprocessing effect), is controlled by a separate parameter in the build floater and is intentionally not part of the PBR material window. Glow is modulated by the emissive map, so black areas of an object's emissive map will not glow, similar to how Blinn-Phong emissive maps and glow work.
 
As per the [https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#additional-textures glTF 2.0 specification], the alpha channel is ignored.
 
===Normal [ RGB ]===
The normal maps generated by your baking application / normal map generation toolkit should be compatible with Second Life in most cases.  The most common pitfall is using normal maps generated with “inverted” Green channels, such as those that are used for Direct3D and Unreal Engine.  Normal texture data redirects light in a different direction based on the vectors indicated by the color, so if the green channel is backward, it’ll seem to be “pointing the wrong way”.  To phrase the problem a different way, all the things that should be bumps look like dents, and vice versa.  If this occurs, double check that your settings aren’t for Direct3D and try re-generating it.  Also, taking it into image editing software and inverting the green channel only sometimes is a sufficient fix.
The normal maps generated by your baking application / normal map generation toolkit should be compatible with Second Life in most cases.  The most common pitfall is using normal maps generated with “inverted” Green channels, such as those that are used for Direct3D and Unreal Engine.  Normal texture data redirects light in a different direction based on the vectors indicated by the color, so if the green channel is backward, it’ll seem to be “pointing the wrong way”.  To phrase the problem a different way, all the things that should be bumps look like dents, and vice versa.  If this occurs, double check that your settings aren’t for Direct3D and try re-generating it.  Also, taking it into image editing software and inverting the green channel only sometimes is a sufficient fix.


Normal map tangent spaces are an extremely technical subject that most users need not be concerned with as most modern applications default to the correct setting.  However, if your normal maps look drastically different inside Second Life, compared to your source application, and you’ve already confirmed it’s not an inverted green channel, then checking which tangent space settings are being used is the next step.  PBR Normals use Mikkelsen Tangent Space. (Often abbreviated MIKKT)  If you are unsure what this means, use similar workflows and settings for Second Life PBR as those that are generally recommended for Unity Engine.
Normal map tangent spaces are an extremely technical subject that most users need not be concerned with as most modern applications default to the correct setting.  However, if your normal maps look drastically different inside Second Life, compared to your source application, and you’ve already confirmed it’s not an inverted green channel, then checking which tangent space settings are being used is the next step.  PBR Normals use Mikkelsen Tangent Space. (Often abbreviated MikkT)  If you are unsure what this means, use similar workflows and settings for Second Life PBR as those that are generally recommended for the Godot 4 game engine.


== Uploading Materials: ==
As per the [https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#additional-textures glTF 2.0 specification], the blue channel of a normal map is only allowed to contain values above 0.5 to a max of 1 (255).
 
As per the [https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#additional-textures glTF 2.0 specification], the alpha channel is ignored.
 
== Material Reference Libraries ==
As PBR is ''Physically Based'', you may wish to know how to recreate a real-life material in PBR form. What color should you use? What metalness value should it have?
 
Fortunately, reference libraries exist which can tell you how to recreate a given material in a PBR workflow.
 
=== List of Reference Color Palettes & libraries ===
*'''[https://physicallybased.info/ Physically Based]'''
** Select the ''Godot'' Engine, with the Color Space as ''sRGB Linear'' and Color Representation as ''0-1'' (Depending on what you are doing, you may need to convert the value into gamma-corrected sRGB space, which can be done [https://davengrace.com/dave/cspace/ here.] Enter the value on the 3rd row.)
*'''[https://www.youtube.com/watch?v=TcTh-1X2FsQ Grzegorz Baran Library]'''
**Available on [https://www.youtube.com/watch?v=TcTh-1X2FsQ YouTube (video format, older)], or [https://gbar.gumroad.com/l/cbwkvo PDF (most up-to-date)].
*'''[https://seblagarde.wordpress.com/2014/04/14/dontnod-physically-based-rendering-chart-for-unreal-engine-4/ Dontnod Entertainment Library]'''
** A very small library, but useful nonetheless.
*'''[https://docs.studio-397.com/developers-guide/general-reference/pbr-an-introduction-authoring-guide Studio 397]'''
** A small collection of various materials.
*'''[http://wiki.polycount.com/wiki/PBR Polycount Wiki]'''
** Not so much a library in itself, but links out to other libraries. '''See the Color Charts section'''.
 
=== List of PBR asset libraries ===
*'''[https://ambientcg.com/ ambientCG]'''
** Provides CC0 licensed HDRi, Metal-Rough materials and .sbar (Substance Painter material) files.
*'''[https://polyhaven.com/ Poly Haven]'''
** Provides CC0 licensed HDRi, Metal-Rough materials and models.
 
== Uploading Materials ==
There are two different methods of creating PBR material assets:
There are two different methods of creating PBR material assets:
[[File:PBRMatMenu.jpg | thumb | right | The layout of the PBR material creation and editing interface.]]


=== Method 1 : Direct Upload a GLTF File ===
=== Method 1 : Direct Upload a glTF File ===
The most convenient method to create an entirely new material is to directly upload a GLTF file from your computer.
The most convenient method to create an entirely new material is to directly upload a glTF file from your computer.


This is accessible via Build>>Upload>>Material…
This is accessible via <code>Build > Upload > Material...</code>  
[[File:PBRBuildMenu.jpg | thumb | none | PBR Upload in main build menu. ]]
[[File:PBRBuildMenu.jpg | thumb | none | PBR Upload in main build menu. ]]


Select a .GLB or a .GLTF file from your computer and Open it:
Select a .GLB or a .GLTF file from your computer and Open it:
This will give the following window:
This will give the following window:
[[File:PBRMatMenu.jpg | thumb | none| The layout of the PBR material creation and editing interface.]]
All of the editable material properties that most creators are familiar with are integrated into the Material's vertically sizable window on upload. 
Clicking “Save” pays the upload fees and creates the Material assets using the local filename. Using "Save As..." provides a window to name all the assets to unique inworld names. There is a 63 char limit for names of inventory assets but the naming floater on this Materials upload <b>has no length restrictions</b>.


Textures will be uploaded to the inventory's default Textures folder (NoMod, NoCopy, Transfer) with an appended "type" added to the given name. (ie. asset name (Base Color), asset name (Normal), asset name (Metallic Roughness). In naming the asset keep in mind that the bracketed appendix is included in the name's 63 character limit. The PBR object is uploaded (Mod, NoCopy, Transfer) to the inventory's Material folder with the appended text (Material). Presently, naming the glTF asset from Save As... will NOT append (Material) to the inventory's name. Saving from the locally named file will.


Because it is the goal of a material to be an easily applicable exchangeable unit, all of the primitive properties that most users are familiar with have now become integrated into the material UI itself.  This includes Color Tint, Transparency and Emissive ( Glow ) behavior.  PBR materials cannot be set to be “Full Bright”, since that setting overrides all lighting that the surface receives. Once you have adjusted these settings to desired values click “Save” to pay your upload fee and create your Material asset.
{{KBcaution|Each individual texture used to compose the Material object is charged a separate upload fee. (ie. If you have 4 textures (Base Color, Metallic Roughness, Emissive, Normal) you are charged 4 times. If you only have a Normal and Metallic-Roughness texture you will be charged for 2, etc.)}}


=== Method 2 : Edit a Blank. Create PBR Materials without a GLTF File ===
=== Method 2 : Edit a Blank. Create PBR Materials without a glTF File ===
If you have PBR materials as textures but do not have a GLTF file you will need to build a Material from inventory.  Make sure your textures are in the correct format, with the correct data in the proper channels.  This requires some understanding of how PBR materials work.  Once you have that, upload your textures as you normally would.
If you have the necessary textures to compose a PBR material but do not have a glTF file you will need to build a Material from inventory.  Make sure your textures are in the correct format, with the correct data in the proper channels.  This requires some understanding of how [[PBR_Materials#PBR_Material_Composition:|PBR materials work]].  Once you have that, upload your textures as you normally would.


[[File:PBRMenuUI.jpg | thumb | none | The PBR Materials UI in the Build Floater.]]
[[File:PBRMenuUI.jpg | thumb | none | The PBR Materials UI in the Build Floater.]]


* Create a test cube and select a face, switch it to be a PBR material.
* Find the "Materials" folder in your inventory, right click, and select "New Material" from the context menu.
* Name your new material something appropriate (E.g. "Red Bricks" for a red brick wall, etc.)
* Right click on your new material, and select "Open" from the context menu.
* Upload your PBR textures using the standard texture workflow (Usually, under <code>Build > Upload > Image</code>).
* In the material window, select the appropriate maps that you just uploaded in their respective slots.
{{KBwarning|While there may be a temptation to try and place a Blinn-Phong “Diffuse” texture into the “Base Color” slot and a Blinn-Phong “Specular" into the “Metallic/Roughness” slot, doing so will not produce desirable results.  However, trying this won’t generate any warnings as there is no way to check that you’ve put the right texture type into the inputs, and the material will save and be applicable to objects.  '''Unfortunately, what will be created is not a functional PBR material.  Please do not do this.'''}}
* Once done, verify the material parameters are correct (E.g. Base color tint, M/R factor, Emissive tint, etc.)
* Save your new material.
* EITHER: [[PBR Materials#Drag_and_Drop|Drag and drop the material onto a rezzed prim]], OR edit the prim, click the "Blinn-Phong" drop-down, select "PBR Metallic-Roughness", and click "Choose from Inventory", and select your new material.
 
<!-- * Create a test cube and select a face, switch it to be a PBR material.
* Select “Choose from Inventory”
* Select “Choose from Inventory”
* Instead of choosing something from your inventory, choose “Blank” and click “Ok”
* Instead of choosing something from your inventory, choose “Blank” and click “Ok”
* Choose “Edit Selected”,  this will open up the material creation UI.
* Choose “Edit Selected”,  this will open up the material creation UI.
* Choose your appropriate maps from your texture inventory and slot them into their matching locations.
* Choose your appropriate maps from your texture inventory and slot them into their matching locations.
** Note: While there may be a temptation to try and place a pre-PBR “Diffuse” texture into the “Base Color” slot and a pre-PBR “Specular'' into the “Metallic/Roughness” slot, doing so will not produce desirable results.  However, trying this won’t generate any warnings as there is no way to check that you’ve put the right texture type into the inputs, and the material will save and be applicable to objects.  Unfortunately what will be created is not a functional PBR material.  Please do not do this.
{{KBwarning|While there may be a temptation to try and place a pre-PBR “Diffuse” texture into the “Base Color” slot and a pre-PBR “Specular" into the “Metallic/Roughness” slot, doing so will not produce desirable results.  However, trying this won’t generate any warnings as there is no way to check that you’ve put the right texture type into the inputs, and the material will save and be applicable to objects.  '''Unfortunately, what will be created is not a functional PBR material.  Please do not do this.'''}}
* Click “Save to Inventory”, this will bring up a prompt to name your new PBR material.
* Click “Save to Inventory”, this will bring up a prompt to name your new PBR material. -->


== Creating Color Variants ==
=== Creating Color Variants ===
After you’ve uploaded your first Material for your project, if you’re a store owner who would like to release more than one color palate for your creation, as many clothing and furniture designers find it useful to do, it’s important to not upload a new GLTF file for every single variant of your Material.  Most variant materials, only the base color will change.  The Occlusion, Roughness, Metalness, Emissive and Normal map texture slots will remain the same.  Since these maps have already been uploaded once, if we upload a second GLTF File, they will be duplicated.  Having different copies of the same texture, with differing UUID’s means that they will clog up download bandwidth and video card memory (not to mention your inventory as well).  This is very bad for Second Life.  So, for this reason, it’s recommended that when you create texture variants, you upload the additional copies of the base-color texture separately.  Then open your newly uploaded material in edit mode, choose the Base Color texture, and change it out for one of your newly uploaded Base Color textures, and click “Save”.  This will create a second copy of your material that uses all the correct texture maps without needlessly duplicating them and causing additional lag.
After you’ve uploaded your first Material for your project, if you’re a store owner who would like to release more than one color palette for your creation, as many clothing and furniture designers find it useful to do, '''it’s important to not upload a new glTF file for every single variant of your Material'''.  Most variant materials, only the base color will change.  The Occlusion, Roughness, Metalness, Emissive and Normal map texture slots will remain the same.  Since these maps have already been uploaded once, if we upload a second glTF File, they will be duplicated.  Having different copies of the same texture, with differing UUID’s means that they will clog up download bandwidth and video card memory (not to mention your inventory as well).  This is very bad for Second Life.  So, for this reason, it’s recommended that when you create texture variants, you upload the additional copies of the base-color texture separately.  Then open your newly uploaded material in edit mode, choose the Base Color texture, and change it out for one of your newly uploaded Base Color textures, and click “Save As”.  This will create a second copy of your material that uses all the correct texture maps without needlessly duplicating them and causing additional lag.
 
{{KBtip| You can also avoid uploading additional textures altogether by uploading a white color variant, then making use of the Base Color Tint parameter!}}


== Double Sided Parameter : Uses and Dangers ==
== Double Sided Parameter : Uses and Dangers ==
“Double Sided” is a new property unique to Materials.  When “Double Sided” is checked, the surface upon which this material is placed will be drawn twice; once for the outward-facing portion of the surface, and a second time for the inward-facing side of the surface that is normally invisible without a double-sided material.  This option should only be used for very specific meshes that were designed to be used with double-sided materials, since placing materials with this parameter checked on normal objects will simply cause the viewer to draw it twice ( and thereby create additional viewer lag ) for no observable change.  It is '''very strongly recommended''' that this option be unchecked for any material that is to be distributed for general use.  Even more so if the “Modify” permission is revoked.  If you wish to distribute a version of a material that has “Double Sided” checked, please include a second copy of the material that has “Double Sided” unchecked as well, with an accompanying explanation to the next user as to why this was done.
“Double Sided” is a new property unique to Materials.  When “Double Sided” is checked, the surface upon which this material is placed will be drawn twice; once for the outward-facing portion of the surface, and a second time for the inward-facing side of the surface that is normally invisible without a double-sided material.  This option should only be used for very specific meshes that were designed to be used with double-sided materials, since placing materials with this parameter checked on normal objects will simply cause the viewer to draw it twice ( and thereby create additional viewer lag ) for no observable change.  It is '''very strongly recommended''' that this option be unchecked for any material that is to be distributed for general use.  Even more so if the “Modify” permission is revoked.  If you wish to distribute a version of a material that has “Double Sided” checked, please include a second copy of the material that has “Double Sided” unchecked as well, with an accompanying explanation to the next user as to why this was done.


Example::  
Example:
LeafTextures_DoubleSided
*LeafTextures_DoubleSided
LeafTextures_SingleSided
*LeafTextures_SingleSided


When designing mesh content for use with the double-sided material parameter, it is also ''very strongly recommended that you separate the triangles you intend to use the double-sided material upon into a separate mesh “face”'', so as to not unintentionally render the portions of the mesh that already have triangles designed to represent the internal portion of the object a second time.
When designing mesh content for use with the double-sided material parameter, it is also ''very strongly recommended that you separate the triangles you intend to use the double-sided material upon into a separate mesh “face”'', so as to not unintentionally render the portions of the mesh that already have triangles designed to represent the internal portion of the object a second time.
== LSL Scripting ==
Documentation for the LSL interface with glTF materials can be found on the following pages:
*[[GLTF Overrides]]
*[https://wiki.secondlife.com/wiki/Category:LSL_Material Category:LSL Material]
== Recommended Application Settings ==
The glTF file format is widely adopted and many applications have export functionality for this type of file.
Below is a non-comprehensive list of some of the more popular applications that export glTF files.
{{KBtip|'''The recommended HDRi for use in Second Life content creation is available at [https://github.com/Jenna-Huntsman/Second-Life-Resources/tree/main/PBR/HDRi this Github repository].''' This HDRi will closely match the lighting of objects under the PBR "Midday" environment preset.}}
{{KBcaution|While every effort has been made to ensure the recommended HDRi matches SL as close as possible, you may need to adjust the "Environment Exposure" parameter in your editing program to get 1:1 results with SL.}}
<br>
----
===[https://www.blender.org/ Blender]===
{{KBwarning|Older Blender versions have bugs in their glTF export tools which make their output incompatible with Second Life. '''Use of Blender versions of 3.3 and above are highly recommended to avoid issues.'''}}
<br>
{{KBcaution|Please ensure that you correctly set up an HDRi in your viewport, as otherwise the rendering in Blender and in SL will not match. Please see [[PBR Materials#Recommended_Application_Settings|here for a reference HDRi]]. '''Please see [https://www.polygonartists.com/hdri-environment-maps-in-blender/ this tutorial].'''}}
Upon starting your project:
Under: <code>Scene > Render Properties > Color Management</code>:
*{{code|View Transform: Standard}}
*{{code|Sequencer: Linear ACEScg}}




== Recommended Application Settings : ==
Create your materials within Blender using Principled BSDF Shader Nodes and the glTF Settings node.  Export them according to the official '''[https://docs.blender.org/manual/en/3.6/addons/import_export/scene_gltf2.html Blender Documentation.]'''
The GLTF file format is widely adopted and many applications have export functionality for this type of file.
Below is a non-comprehensive list of some of the more popular applications that export GLTF files.


===Blender===
{{KBcaution|Second Life does not support BSDF Clearcoat, Subsurface, Anisotropy or Transmission parameters at this time.}}
Create your materials within Blender using Principled BSDF Shader Nodes.  Export them according to the official '''[https://docs.blender.org/manual/en/2.80/addons/io_scene_gltf2.html] Blender Documentation.'''
Note: Second Life does not support BSDF Clearcoat, Subsurface, Anisotropy or Transmission parameters at this time.


=== Adobe Substance Painter ===
For materials creation, 2 example .blend files are provided, one using separate Occlusion, Roughness and Metallic textures ("Long Form"), and one that handles a pre-packed ORM map ("Short Form")
Start your project with the Unity HD Render Pipeline Metallic Standard
Document Resolution: 1024 ( 2048 is also fine, you can export to 1024 )
Normal Map Format: OpenGL
Compute Tangent Space Per Fragment: Off


Once you have finished your project you’ll want to choose a file folder and use the following Export Settings:
The below files are intended for use with Blender versions 3.3 and above.
Output Template: glTF PBR Metal Roughness
Size: 1024


This will create both individual uploadable textures ( Useful for uploading ONLY base color for color variants ) as well as a .glb file that you can use to upload directly.
* '''[https://github.com/Jenna-Huntsman/Second-Life-Resources/blob/main/glTF%20Node%20Tree%20-%20Long%20Form.blend glTF Node Tree - Long Form.blend]'''
* '''[https://github.com/Jenna-Huntsman/Second-Life-Resources/blob/main/glTF%20Node%20Tree%20-%20Short%20Form.blend glTF Node Tree - Short Form.blend]'''
<br>
----
=== [https://www.adobe.com/products/substance3d-painter.html Adobe Substance 3D Painter] ===
{{KBcaution|While Substance Painter is generally considered to be stable, in some (rare) situations Substance may output a malformed glTF which will be rejected by the viewer. If this happens, import your materials into Blender, then export a glTF from Blender - this should be fixed in a future version of Substance.}}
<br>
{{KBcaution|Please ensure that you correctly set up an HDRi in your viewport, as otherwise the rendering in Substance and in SL will not match. Please see [[PBR Materials#Recommended_Application_Settings|here for a reference HDRi]]. Please see [http://y2u.be/6goXJ2CJzaM this tutorial].}}
When starting your project:
 
*{{code|Template: PBR - Metallic Roughness Alpha-test (starter_assets)}}
 
OR
 
*{{code|Template: PBR - Metallic Roughness Alpha-blend (starter_assets)}}
 
Verify the following settings:
*{{code|Document Resolution: [Set as desired]}}
*{{code|Normal Map Format: OpenGL (Y+)}}
*{{code|Compute Tangents Per Fragment: YES}}
 
Under "Color Management":
{{KBtip| For a more in-depth explanation of the below settings, and issues that you may encounter, visit [https://mrlixm.github.io/blog/substance-painter-color-management/#aces-workflow this page].}}
*{{code|Color Management: OpenColorIO}}
*{{code|OpenColorIO Configuration: ACES 1.0.3}}
*{{code|Standard sRGB color space: Utility - sRGB - Texture}}
*{{code|8 bit images: Utility - sRGB - Texture}}
*{{code|16 bit images: Utility - sRGB - Texture}}
*{{code|Material color space default: Utility - sRGB - Texture}}
 
When exporting:
*{{code|Output Template: glTF PBR Metal Roughness}}
*{{code|Size: Based on each Texture Set's size}}
*{{code|Padding: Dilation + default background color - 8 bit}}
<br>
----
=== [https://www.adobe.com/products/substance3d-designer.html Adobe Substance 3D Designer] ===
{{KBcaution|Substance Designer ''does not support glTF output'', unlike Substance Painter.}}
 
Under preferences, verify the following '''Project''' settings:
*{{code|Color Management: OpenColorIO}}
*{{code|OpenColorIO Configuration: ACES 1.0.3}}
*{{code|8 bit images: Utility - sRGB - Texture}}
*{{code|16 bit images: Utility - sRGB - Texture}}
*{{code|Floating point images: ACES - ACEScg}}
*{{code|2D and 3D View Display Default: sRGB}}
 
When exporting (Export Outputs):
*{{code|basecolor: Utility - sRGB - Texture}}
*{{code|normal: Utility - Raw}}
*{{code|roughness: Utility - Raw}}
*{{code|metallic: Utility - Raw}}
*{{code|ambientocclusion: Utility - Raw}}
 
If you use a custom node to output a [[PBR_Materials#Occlusion_.5BR.5D_.2F_Roughness_.5BG.5D_.2F_Metalness_.5BB.5D|pre-compiled ORM map]], this should also be set to Raw.
<br>
----
=== [https://www.maxon.net/en/cinema-4d Cinema 4D] ===
Please follow the documentation provided in this [https://www.bakedpixels.nl/blog/export-to-gltf-with-cinema-4d blog post].
<br>
----
===[https://3dcoat.com/ 3DCoat]===
{{KBwarning|As of version "2022-58", 3DCoat is unable to produce a spec-compliant glTF file, and thus should not be used for Second Life. '''Use at your own risk - you ''will'' have issues!}}
 
glTF export has been implemented since 3DCoat version 2020 and is found in the <code>File >Export > Export to glTF > glTF Separate (gltf + .bin + textures)</code>
<br>
----
=== [https://quixel.com/mixer Quixel Mixer] ===
Quixel Mixer has no glTF output, however, it does generate the functional textures, though they do need to be edited and combined in photo editing software.
Export them by going to <code>Export Target > Custom</code>


=== Cinema 4D ===
Use of the PBR material within C4D is recommended, as it automatically uses the Reflectivity parameter instead of the Color parameter for objects.  C4D by default uses openGL style normal maps so compatibility should not be an issue.  The rest of the export process is very well documented in this '''[https://www.bakedpixels.nl/blog/export-to-gltf-with-cinema-4d] blog post.'''
3DCoat
GLTF export has been implemented since 3DCoat version 2020 and is found in the File>>Export>Export to GLTF >> Gltf Separate (gltf + .bin + textures)
=== Quixel Mixer ===
Quixel Mixer has no GLTF output, however, it does generate the functional textures, though they do need to be edited and combined in photo editing software.
Export them by going to Export Target > Custom
Texture Preset: Metalness Maps
Texture Preset: Metalness Maps
Select:  
Select:  
Albedo , Roughness, Normal, AO , Metalness  and ( if need be ) Emissive.
Albedo , Roughness, Normal, AO , Metalness  and ( if need be ) Emissive.
Click “Export to Disk” and open the folder that the files were placed into.
Click “Export to Disk” and open the folder that the files were placed into.
Albedo is the Base Color texture in this case.
Albedo is the Base Color texture in this case.
AO , Roughness , Metalness get combined into the ORM map as per [[PBR_Materials#PBR_Material_Composition|this explanation.]]
AO , Roughness , Metalness get combined into the ORM map as per [[PBR_Materials#PBR_Material_Composition|this explanation.]]
Normal Map : Quixel generates Direct3D Normal Maps. The green channel needs to be inverted as [[PBR_Materials#Normal_.5B_RGB_.5D_|per here.]]
Normal Map : Quixel generates Direct3D Normal Maps. The green channel needs to be inverted as [[PBR_Materials#Normal_.5B_RGB_.5D_|per here.]]


Upload to Second Life using [[PBR_Materials#Method_2_:_Edit_a_Blank._Create_PBR_Materials_without_a_GLTF_File|Method 2.]]
Upload to Second Life using [[PBR_Materials#Method_2_:_Edit_a_Blank._Create_PBR_Materials_without_a_GLTF_File|Method 2.]]
<br>
----
=== [https://www.autodesk.eu/products/3ds-max/overview Autodesk 3DS Max 2023] ===
Autodesk just added the ability to create glTF files using their new glTF Material and glTF Export functionalities as outlined in '''[https://help.autodesk.com/view/3DSMAX/2023/ENU/?guid=GUID-EFBB037D-C4EB-42D2-9CE1-30FCAD483C31 Autodesk's official documentation]'''.  All prior versions of Autodesk software do not have this functionality.
<br>
----
=== [https://www.materialmaker.org/ Material Maker] ===
While [https://www.materialmaker.org/ Material Maker] does not currently export directly to glTF ([https://github.com/RodZill4/material-maker/issues/479 This may be added in future]), materials created with this program are compatible with Second Life.
Export your materials using the '''Godot 4 ORM''' export preset.
Upload to Second Life using [[PBR_Materials#Method_2_:_Edit_a_Blank._Create_PBR_Materials_without_a_GLTF_File|Method 2.]]
<br>
----
=== Adobe Photoshop ===
'''While Photoshop is not officially a PBR authoring tool''', the changes to Alpha Blending (changing into Linear space from sRGB) may require you to change your PS settings to get consistent results. Please see [http://www.kiransprojects.com/blog/2014/photoshop-blending-is-broken/ this article] for more information. (See the section titled "A Partial Solution"). Alternatively, [https://www.reddit.com/r/photoshop/comments/61clf8/how_to_fix_photoshops_incorrect_and_ugly_color/ this Reddit post] also gives a few options on how to achieve blending in the correct manner.
<br>
----
=== GIMP ===
'''While GIMP is not officially a PBR authoring tool''', the changes to Alpha Blending (changing into Linear space from sRGB) in Second Life will make textures created in GIMP display their alphas correctly (GIMP defaults to linear alpha calculation).
== Troubleshooting content ==
If you upload a piece of PBR content which does not match your editor, the advice from Linden Lab is to '''STOP: File a JIRA. Do not attempt to "fix" the content.'''
That said, there are some troubleshooting steps which you can do yourself:
* Check that you are using the PBR Linden Midday preset (called "Midday") ''not "Midday (Legacy)"''. Other environments may not match the reference HDRi, causing some visual differences. (This is intended behaviour, and content should be able to be viewed under any light correctly, but for troubleshooting purposes this may be required).
** At present, there is a bug with the PBR Linden Midday preset which results in an excessive blue sheen, due to the use of an over-saturated (unrealistic) sky color, among some other issues. This has been fixed in the upcoming glTF Maintenance viewer.
* Are you using a reflection probe? If not, does the problem reproduce if a manual reflection probe is placed over the object?
** This is because a common source of the "blue sheen" in interior scenes is the use of an auto-probe. Auto-probes sample their surroundings, and combined with the approximate (and often incorrect) placement this will mean the sky is sampled on all sides, thus meaning the reflected light from the surroundings (which counters the blue light from the sky) is absent, leading to a larger-than-expected level of sky contribution on the object. Auto-probe placement can be worse in skyboxes or sky platforms
* Triple-check the settings used for your editor match the ones given [[PBR_Materials#Recommended_Application_Settings|here]], including the reference HDRi. '''Any''' deviation from these settings may cause visual differences between your editor and in-world.
* Check your content against a glTF reference viewer; such as:
** [https://modelviewer.dev/editor/ Modelviewer.dev]
** [https://github.khronos.org/glTF-Sample-Viewer-Release/ Khronos Sample Viewer]
If the above steps fail, then please '''[https://jira.secondlife.com/ file a JIRA.]'''


=== Autodesk 3DS Max 2023 ===
A good JIRA will include:
Autodesk just added the ability to create GLTF files using their new GLTF Material and GLTF Export functionalities as outlined in Autodesk's official documentation '''[https://help.autodesk.com/view/3DSMAX/2023/ENU/?guid=GUID-EFBB037D-C4EB-42D2-9CE1-30FCAD483C31] here.'''.  All prior versions of Autodesk software do not have this functionality.
* An LM to a location where the problem can be examined in-world.
* A copy of the glTF content, attached to the JIRA.
* Screenshots of the representation in-world, in a reference viewer, and in-editor.
** You should include screenshots of the object inside a manually placed reflection probe, and outside.

Latest revision as of 16:22, 12 July 2024

Physically Based Rendering

NOTE: This page is being actively updated with new content and links as GLTF PBR Materials and related new features are being released. Contributions to this page may be from Second Life residents and staff members alike.

What is it and Why is it used?

The term “Physically Based Rendering” or “PBR” is a technical term that may need some defining for most people since its use is unique to composing images in computer software. The term itself is an abbreviation for a collection of complex mathematical algorithms that attempt to accurately represent the ways that light reflects off and interacts with objects in the real world. In the real world, it is the behavior of light on a piece of metal that allows us, the observer, to recognize “that object is made of metal” without actually reaching out and touching it. The way a metal reflects light differs from that of a polished plastic or some other material, and these differences have been quantified by science. By mimicking real-world physics principles in the virtual world it allows for the creation of more immersive recognizable realistic spaces, but also it helps us relate to fantastical worlds a little better too. While we may not be familiar with what a newly imagined creation is, a metal's inherent metal-ness and aged wood's inherent wood-ness remain constant, making it easier to intuitively understand what we are interacting with in a virtual environment.

Because tying the mathematics to simulate materials in virtual spaces to how they behave in the real-world makes things more immediately recognizable, PBR has become the foundation for creating imagined worlds over the last decade. The metallic shine of exoskeletal armor in superhero movies is driven by a PBR workflow, as is the plastic sheen of toys or the glint of frozen ice in animated classics. Now we are moving to bring this standardized quality to your home in Second Life.

Bringing PBR to Second Life means updating the basic calculations of how light is represented and interacts with the world of Second Life. The goal is to integrate these changes while minimally changing how everything that presently exists in Second Life (designed prior to the introduction of PBR) looks. While the preservation of creative intent and the aesthetic appeal of items users have enjoyed for over two decades of Second Life is always a priority, Second Life is an ever-evolving platform, and to continue to do so, some changes are inevitable.

Lastly, while we are attempting to mimic real-world reflections and material properties, Second Life has to run on a wide variety of devices, so some shortcuts have to be made. Reflections are not mirror-perfect, as has often been a long-standing hope and request from Residents. While the addition of a reflection system does bring dreams of distortion free mirrors for our avatars in Second Life closer to reality, unfortunately, due to the calculation requirements of doing perfect reflections, mirrors are sadly still, for the moment, not practical. Please see the note in the section below for more info.

What does this mean for Residents?

The lamp in this screenshot uses Blinn-Phong (Classic SL Materials), and was created before PBR's integration into SL; and demonstrates some of the visual differences to existing content. The environment used for the screenshot is the viewer's default Midday preset (Note that the PBR viewer has a new Midday preset).

Changes to Existing Content

The largest change by far is the addition of an environmental reflection system to Second Life. For most existing items, this change shouldn’t have a drastic immediately observable impact. A few things in your inventory that you already own may appear more reflective with the new graphics configuration and those reflections should feel more realistic and immersive with your current environment. As a general rule: the “shinier” an object was before, the more environment reflections it will pick up and the more visual difference there will be.

Another notable change is the addition of tonemapping to the viewer. Tonemapping is a way of representing an image with a higher native dynamic range than the display can support. Tonemapping is a de-facto requirement of PBR pipelines. This means that colors in Second Life will generally appear more saturated with less detail being lost in shadows and highlights. Click here for some additional reading on the subject.

The tonemapping method used is called Academy Color Encoding System (aka "ACES"), and can be read about here and here.

Blinn-Phong content making use of the Specular parameters may look different if the items were never viewed under local lights, as the PBR viewer allows for the environment (sun and sky) to contribute to specular reflections. As such, if the object receives blue specular reflections from the sky, these reflections are tinted, and may look odd. This effect is the same as prior viewers, as if the object was lit by a blue local light.

Removal of Advanced Lighting Model ( ALM ) Graphics Option

There have been changes to the Graphics > Advanced Settings... Preferences. The most notable of which is the removal of the “Atmospheric Shaders”, "Local lights" and “Advanced Lighting Model” options.

For those users on lower-end hardware who depended heavily upon those options to navigate Second Life with an acceptable framerate, we recommend the following settings:

  • Transparent Water: Disabled
  • Screen Space Ambient Occlusion: Disabled
  • Shadows: None
  • Screen Space Reflections: Disabled
  • Reflection Detail: Static Only
  • Reflection Coverage: Manual only

The Local Lights setting has been superceded by updates made to the World > Improve graphics speed... "Quality & Speed" slider options. Users on low-end hardware should ensure that their "Quality & Speed" slider is set at an appropriate level for their hardware.

What does this mean for Creators?

Nomenclature changes

The PBR project represents a large step towards integrating standard rendering techniques used in the games industry. As such, the nomenclature of some items has changed, notably, what was once called Materials is now referred to as Blinn-Phong. This does not represent any changes to the underlying rendering techniques (beyond those mentioned above); and as such Blinn-Phong is not the same as PBR Spec/Gloss workflows, seen in some game engines such as Unity.

Importing PBR Materials from External Software:

For creators who work with external tools such as Blender, Adobe Substance Painter, Cinema4D, 3D-Coat, or have used the Unreal or Godot game engines, the use of PBR texture sets should already be familiar. In fact, some creators have been using tools that use PBR workflows to create content for Second Life and have then been forced to sacrifice visual quality to convert that information into Second Life’s existing Blinn-Phong materials system.

Second Life is adopting the “Metallic/Roughness” PBR model, and in its ongoing commitment to using Open Source standards whenever it is practical to do so, the glTF 2.0 file format has been chosen as the upload format for PBR Material assets. One of the primary goals of implementing PBR Materials is to have more continuity from content creation applications towards Second Life, and have more consistent content behavior once it’s inworld.

Using Imported Materials in Second Life

Material Editing

For people who build exclusively within Second Life, the addition of PBR also means that there will be a new Inventory Type called “Material”. These new Materials can be purchased on the Marketplace and are shareable like any other permitted object in Second Life.

PBR materials come as a bundle of textures. These all travel as a single unit and are applied all at once. If you wish to change tint, transparency, or other similar parameters of the Material you’ll need to modify the Material from the "Editing Material" floater.

KBcaution.png Important: Meshes uploaded after the PBR release will look slightly different (and more accurate to your editor of choice) due to a change in the way Second Life handles mesh assets (Previously, some data required for accurate tangent generation was discarded at upload time - this is no longer the case). This will mean that a PBR material applied to a mesh uploaded before PBR launched (28th November 2023) might look incorrect; a simple reupload of the mesh will solve this. This is not required, but recommended.

Applying existing materials works similarly to existing textures. You have two means of doing so:

Drag and Drop

Simply drag and drop onto the face of a prim or a mesh. For example, if you have a tiled floor material and you place it on a selected prim cube face that face will now look like a tile floor and reflect light like a tiled floor would with all the material qualities contained in the material.

Drag and Drop Functionality.

Switch to PBR and select from Inventory

Alternatively, select a face on the prim or mesh you want to apply your material to and choose the “Blinn-Phong” drop-down and change it to “PBR Metallic Roughness”, then select “Choose an item from your inventory” and apply.

Menu drop-down demonstration.
Dropdown as of v7.0.1.689


Texture Transforms

With PBR materials, texture transforms work in a slightly different way to Blinn-Phong transforms. Blinn-Phong (and OpenGL) has the texture origin in the lower left corner of the texture, whereas glTF materials (and Vulkan) has the texture origin in the upper left corner.

This means that PBR materials will react differently (namely, they are inverted in the Y (glTF v) axis) to Blinn-Phong materials. For a simple solution to convert a Blinn-Phong texture transform to a PBR texture transform, please see this forum thread.

For more information, see here and here.

Media-on-a-Prim

Media on a prim will continue to work largely as it has done prior to PBR's launch.

When using MOAP on a face with a PBR texture, it will function as if the media texture has an override to the Base Color and Emissive maps. Note that the emissive map is overridden, however the emissive tint is not (so, to disable the emissive map you can set the emissive tint to black <0,0,0>).

Tools & Tutorials

As the PBR system is new, it is expected that existing users may be confused at first on how everything works. As such, Linden Lab and some third parties have provided some tutorials and informational videos:

The above tutorials require knowledge and access to Adobe's Substance Painter (subscription based software on Adobe website, or sold as perpetual license with one year of updates on Steam). Below are some open source tools and links found Googling 'Blender', 'glTF' (requiring Blender 3.3)

PBR Stand-In Textures and Outdated Viewers

It is worth mentioning that during the adoption period of a new system, a substantial portion of Second Life Residents view the world through third party viewers and mobile viewer solutions that will not have updated to be able to see the new content. Anyone viewing a PBR Material on a viewer that cannot display it will see the “underlying” non-PBR texture. By default, this is a pine box or a completely blank texture. Those who wish their content to be viewable by as many people as possible, might consider creating a Diffuse texture ( with baked lighting, the kind that is easily generated with tools like Substance Painter's “Baked Lighting Filter” ) and applying it as a regular texture to the object they’re placing the PBR material on, prior to applying the PBR material. While this is an extra step in content creation, and complicates things somewhat, if you wish for your content to be appreciated by all, it’s worth considering adding this extra step to your workflow. People designing PBR materials for distribution and sale might also consider offering a “Diffuse Only fallback” texture to accompany the PBR material specifically for people who cannot see the PBR content.

KBcaution.png Important: Once a PBR Material is applied, the Blinn-Phong textures cannot be updated. To remedy this, remove the PBR Material, then make changes to the Blinn-Phong textures and then reapply the PBR Material.

Understanding and Assisting the New Reflections System

Those creators that work at house-scale, or produce items that can be walked through, can gain additional control over the lighting in their creations by taking the time to fully understand the new toolkit that influences environmental reflections. There is a new type of volume that can be created and appended to object linksets specifically for scenes with these kinds of spaces. These volumes define a custom area where reflections are calculated, overriding the default solution. So-called “Reflection Probes” should be placed in a manner such that the fewest number of probes fills the largest amount of space possible with minimal overlap. One probe per room is a good reference point for a general living space like a house. If multiple probes exist in a given area they can cause visual artifacts and negatively impact performance (also known as viewer lag). Do not affix reflection probes to small creations such as furniture or decor. Small items such as tables, chairs, musical instruments, candle sticks etc should use the reflection sample volume in the space in which they are placed. They should not have one appended. It is strongly recommended that any object that contains a reflection sample probe be left as “modify”, so the positioning of the probe can be adjusted or even removed by the owner of the item should they wish.

Essay.png
Editor note: Reflection probes are not intended for use with planar mirrors, and will look incorrect when being used to do so. Planar mirrors have been flagged for future work, but are not directly in the scope of the PBR project.

When is it Recommended to Create a Reflection Probe?

Manually placed probes are good for cleaning up undesirable noise and lighting from automatically placed probes that may be visually disruptive or confusing. If you look in the image of the room in a house, on the left hand side of it, you can see a blue tint on the floor, which is the reflected blue light from the sky. The probe filling half the room blocks this, and when it is extended to completely fill the room and just slightly beyond the thickness of the walls, (lower copy of the image) the problem is solved. The probe does not need to be a part of the linkset for the rest of the room in order to function; however, once you have them placed it’s possible to add them into linksets like any other prim.

Constructing a Reflection Sample Volume ( aka Reflection Probe )

Start off in the Build Menu (Ctrl+3) by rezzing a basic prim. Under the Features tab, at the bottom check the box labelled Reflection Probe.

Manual Probe Creation UI.
  • Reflection Probe: Enabling this creates a Reflection Sampling Volume within the bounding box of the prim.
  • Box / Sphere Drop-down: Choose whether you want this sample to project reflections within a box shaped volume or a spherical one.
  • Dynamic: Allow skinned objects (e.g. Avatars, animesh, etc.) to be captured in the reflection.
  • Ambiance: Affects how much objects within the volume are lit as if they have bounced light hitting them from faked indirect illumination. See "Fine-Tuning Reflection Sample Volumes" for more info.
  • Near Clip: Sometimes, there will be a large obstruction in the center of the volume you wish to use as a reflection probe. For example, suppose that there is a large architectural supporting structure in the middle of the room, such as a column. If the probe gets placed internally inside this, it will reflect the internal surface of the column instead of the room in which it is placed. Increasing Near Clip will make the sampling volume exclude objects n meters from the center so they don’t get included in the reflection. See "Fine-Tuning Reflection Sample Volumes" for more info.

Select an appropriate probe shape for your scene. For example, if you want to create a reflection probe that covers a room, select a Box shape, or for other objects a Sphere shape is recommended.

Move the reflection probe and resize it as necessary to fit your desired purpose. For the room example, resize the box so the probe just touches the walls, ceiling and floor of the room.

Naming your probes is also recommended, so other people ( or yourself later on ) will remember why there’s a large transparent prim in the middle of your build.

If you wish to come back and edit the reflection probe later on, enable both Show Reflection Probe Volumes and Select Reflection Probes under Build > Options.

Fine-Tuning Reflection Sample Volumes

KBwarning.png Warning: Sample volumes do not react to prim parameter changes. Options such as “Hollow” or “Taper” or “Shear” do not change how the sampling area behaves.

That said, it may be helpful to visualize Near Clip as the hollowing out of your reflection sample volume, but the hollow and near-clip are not in any way linked and doing so is purely a convenience. Reflection probe sample volumes only respond to changes in scale and position; however, different probe volumes behave differently when resized.

  • Box Probes: These are affected by position and non-uniform scale.

Example: If I create a box reflection probe and scale it to 10m,30m,10m size, the full volume will be affected by the probe.

  • Sphere Probes: These are affected by position and uniform scale only, otherwise the smallest dimension is used.

Example: If I create a spherical probe and scale it to 10m,30m, and 10m size , the probe will sample a 10 meter diameter spherical volume at the center of the probe. However, a 30m,30m,30m sphere will create a sampling volume of a 30 meter diameter sphere.

A diagram of how spherical probes function (or, don't function as you may expect) while non-uniformly-scaled.

Reflection Probe Ambiance controls how ambient light (Found in your environment preset) affects, or does not affect, the contents of the reflection probe, and the intensity of indirect lighting (aka Irradiance). This value is influenced by the Reflection Probe Ambiance value found in the user's environment preset, wherein if the Ambiance value given in the environment preset is higher than the value defined by the probe itself, it inherits the ambiance value of the environment preset, or alternately if the ambiance value defined by the probe is higher, the probe's value is used.

There are 3 operation modes that are set with the Reflection Probe Ambiance value, in tandem with above:

  • 0 will allow the Environment Ambient color to be applied at full intensity.
  • Greater than 0 and less than 1 will blend the Environment Ambient color and probe irradiance (indirect lighting) in a ratio corresponding to the defined value (e.g. 0.5 is a 50/50 split).
  • 1 or above will block the Environment Ambient color from being applied within the probe volume and irradiance is applied at full intensity (or with a multiplier for values above 1).
    • 4 or above works the same as above, however only indirect lighting received from the sky will be multiplied to a value above 4. Local lights are clamped at 4.0.

Complex Reflection Probe placement

At times, you may wish to place a reflection probe in an area where the reflection probe types (Sphere or Box) do not conform to the shape of the area. For example, a Box probe in a loft room has a triangular shape, which results in "probe bleed" wherein the influence volume affects an area larger than what is needed, and thus bleeds out onto the exterior roof, which is undesirable.

In these cases, you may need to place multiple probes in order to blend together the sample volumes to achieve the desired result. In the loft room example, it's best to start with 3 box probes, which cover the floor, and each side of the roof. Then, use an additional box probe as "fill" to cover the gap inbetween the 3 probes. The main fill probe may need to be rotated at an angle to get the most coverage possible. If it is not possible to fill the gap between the 3 probes with this fill probe, you may wish to add more box probes to act as "secondary fill".

[TODO: Put photo examples of the above here!]

Alternately, Sphere probes may be used to achieve the same result. Sphere probes have considerably softer blending than box probes, so this may give you the best results in severe bleed conditions.

Unsupported use-cases

KBwarning.png Warning: Do not attempt to do anything listed below. These uses are liable to either intentionally be disabled, or stop working in future updates.

You may be tempted to use reflection probes in the following ways, however these use-cases are either intentionally disabled or result in undefined behavior, and may work now but may not in future. You have been warned.

Under any circumstances, you should NOT:

  • Wear a reflection probe. This intentionally does not work. (Reflection probes are a property of the scene, not an individual object / avatar)
  • Attach a reflection probe to a physics-enabled object, e.g. vehicles. This intentionally does not work. (As above, the reflection probes are part of the scene; not part of an individual object. Reflection probes by design do not update in real-time, thus the object would always have incorrect reflections anyway.)

PBR Material Composition

PBR-defined values are measured by optical sensors and other capture tools and recorded in databases. These parameters are then put into commercial software to be used by content creators. Using software designed to create PBR content is always recommended; however, understanding how PBR materials are assembled can assist with editing and compiling them. Having a direct understanding of what each individual color channel contributes is essential for editing PBR textures without relying upon some of the more advanced toolkits available.

All PBR Values are listed from 0 to 1.0, though in an actual image, the values range from 0 - 255. PBR Materials are composed of a set of four specifically designed textures; they are as follows:

Base Color [ RGB ] + Transparency [ A ]

[RGB]: This is the unlit color of the surface. This differs from the “Diffuse” texture that Second Life uses. Diffuse textures often include faked reflection and specular information as well as added Ambient Occlusion shadows. Base Color textures do not get any of this added information. For metals ( as defined by the metalness value ), Base Color also determines specular reflection color, whereas, in non-PBR systems, this is defined by the Specular texture and tint. In certain PBR texturing applications, Base Color is sometimes also referred to as “Albedo”.
[ A ]: Alpha Channel, dictates the transparency of the entire material overall.

The Base color texture should be devoid of lighting information.

Occlusion [R] / Roughness [G] / Metalness [B]

This texture is composed of 3 unrelated grayscale images stored in 3 different color channels of an RGB texture.
[R]: (Ambient) Occlusion is lighting data, removing the need to bake down shadows on to the Base Color map. Note that white (<1,1,1>) means no occlusion is applied, and black (<0,0,0>) applies full occlusion.
[G]: Roughness data ranges from 0 to 1.0, but the actual range of physical surfaces ranges from approximately 0.05 to 0.985. No surface is perfectly smooth or completely rough. The rougher a surface is the less mirror-like it behaves.
[B]: Metalness values are mostly black or white. Either the material is a conductive metal like copper, or it’s a non-metal like fabric. 0.0 is Non-Metallic, 1.0 is Metallic. There are almost no materials with gray metalness values.
The alpha channel is ignored, as per the glTF 2.0 specification.

Essay.png
Editor note: The Occlusion map is not controlled by the "Screen Space Ambient Occlusion" toggle in the Advanced Graphics Settings. The Occlusion map is always enabled.

Emissive [ RGB ]

This determines the amount and the color of unlit (ignores ambient light conditions) areas of your material. When giving an object a white emissive map, the object will act as if the Blinn-Phong "Fullbright" option was checked. This map is useful for items which are expected to emit light, e.g. a table lamp, where the lamp shade would appear to glow when the lamp is turned on. If you wish to toggle the lamp on and off, it's recommended to change the Emissive Tint value to black (functionally disabling the emissive map, thus turning the lamp off), and then changing the tint back to your desired color to turn the lamp back on. Leaving the Emissive slot empty is recommended when it’s unused.

Note that glow (The postprocessing effect), is controlled by a separate parameter in the build floater and is intentionally not part of the PBR material window. Glow is modulated by the emissive map, so black areas of an object's emissive map will not glow, similar to how Blinn-Phong emissive maps and glow work.

As per the glTF 2.0 specification, the alpha channel is ignored.

Normal [ RGB ]

The normal maps generated by your baking application / normal map generation toolkit should be compatible with Second Life in most cases. The most common pitfall is using normal maps generated with “inverted” Green channels, such as those that are used for Direct3D and Unreal Engine. Normal texture data redirects light in a different direction based on the vectors indicated by the color, so if the green channel is backward, it’ll seem to be “pointing the wrong way”. To phrase the problem a different way, all the things that should be bumps look like dents, and vice versa. If this occurs, double check that your settings aren’t for Direct3D and try re-generating it. Also, taking it into image editing software and inverting the green channel only sometimes is a sufficient fix.

Normal map tangent spaces are an extremely technical subject that most users need not be concerned with as most modern applications default to the correct setting. However, if your normal maps look drastically different inside Second Life, compared to your source application, and you’ve already confirmed it’s not an inverted green channel, then checking which tangent space settings are being used is the next step. PBR Normals use Mikkelsen Tangent Space. (Often abbreviated MikkT) If you are unsure what this means, use similar workflows and settings for Second Life PBR as those that are generally recommended for the Godot 4 game engine.

As per the glTF 2.0 specification, the blue channel of a normal map is only allowed to contain values above 0.5 to a max of 1 (255).

As per the glTF 2.0 specification, the alpha channel is ignored.

Material Reference Libraries

As PBR is Physically Based, you may wish to know how to recreate a real-life material in PBR form. What color should you use? What metalness value should it have?

Fortunately, reference libraries exist which can tell you how to recreate a given material in a PBR workflow.

List of Reference Color Palettes & libraries

List of PBR asset libraries

  • ambientCG
    • Provides CC0 licensed HDRi, Metal-Rough materials and .sbar (Substance Painter material) files.
  • Poly Haven
    • Provides CC0 licensed HDRi, Metal-Rough materials and models.

Uploading Materials

There are two different methods of creating PBR material assets:

Method 1 : Direct Upload a glTF File

The most convenient method to create an entirely new material is to directly upload a glTF file from your computer.

This is accessible via Build > Upload > Material...

PBR Upload in main build menu.

Select a .GLB or a .GLTF file from your computer and Open it: This will give the following window:

The layout of the PBR material creation and editing interface.

All of the editable material properties that most creators are familiar with are integrated into the Material's vertically sizable window on upload.

Clicking “Save” pays the upload fees and creates the Material assets using the local filename. Using "Save As..." provides a window to name all the assets to unique inworld names. There is a 63 char limit for names of inventory assets but the naming floater on this Materials upload has no length restrictions.

Textures will be uploaded to the inventory's default Textures folder (NoMod, NoCopy, Transfer) with an appended "type" added to the given name. (ie. asset name (Base Color), asset name (Normal), asset name (Metallic Roughness). In naming the asset keep in mind that the bracketed appendix is included in the name's 63 character limit. The PBR object is uploaded (Mod, NoCopy, Transfer) to the inventory's Material folder with the appended text (Material). Presently, naming the glTF asset from Save As... will NOT append (Material) to the inventory's name. Saving from the locally named file will.

KBcaution.png Important: Each individual texture used to compose the Material object is charged a separate upload fee. (ie. If you have 4 textures (Base Color, Metallic Roughness, Emissive, Normal) you are charged 4 times. If you only have a Normal and Metallic-Roughness texture you will be charged for 2, etc.)

Method 2 : Edit a Blank. Create PBR Materials without a glTF File

If you have the necessary textures to compose a PBR material but do not have a glTF file you will need to build a Material from inventory. Make sure your textures are in the correct format, with the correct data in the proper channels. This requires some understanding of how PBR materials work. Once you have that, upload your textures as you normally would.

The PBR Materials UI in the Build Floater.
  • Find the "Materials" folder in your inventory, right click, and select "New Material" from the context menu.
  • Name your new material something appropriate (E.g. "Red Bricks" for a red brick wall, etc.)
  • Right click on your new material, and select "Open" from the context menu.
  • Upload your PBR textures using the standard texture workflow (Usually, under Build > Upload > Image).
  • In the material window, select the appropriate maps that you just uploaded in their respective slots.
KBwarning.png Warning: While there may be a temptation to try and place a Blinn-Phong “Diffuse” texture into the “Base Color” slot and a Blinn-Phong “Specular" into the “Metallic/Roughness” slot, doing so will not produce desirable results. However, trying this won’t generate any warnings as there is no way to check that you’ve put the right texture type into the inputs, and the material will save and be applicable to objects. Unfortunately, what will be created is not a functional PBR material. Please do not do this.
  • Once done, verify the material parameters are correct (E.g. Base color tint, M/R factor, Emissive tint, etc.)
  • Save your new material.
  • EITHER: Drag and drop the material onto a rezzed prim, OR edit the prim, click the "Blinn-Phong" drop-down, select "PBR Metallic-Roughness", and click "Choose from Inventory", and select your new material.


Creating Color Variants

After you’ve uploaded your first Material for your project, if you’re a store owner who would like to release more than one color palette for your creation, as many clothing and furniture designers find it useful to do, it’s important to not upload a new glTF file for every single variant of your Material. Most variant materials, only the base color will change. The Occlusion, Roughness, Metalness, Emissive and Normal map texture slots will remain the same. Since these maps have already been uploaded once, if we upload a second glTF File, they will be duplicated. Having different copies of the same texture, with differing UUID’s means that they will clog up download bandwidth and video card memory (not to mention your inventory as well). This is very bad for Second Life. So, for this reason, it’s recommended that when you create texture variants, you upload the additional copies of the base-color texture separately. Then open your newly uploaded material in edit mode, choose the Base Color texture, and change it out for one of your newly uploaded Base Color textures, and click “Save As”. This will create a second copy of your material that uses all the correct texture maps without needlessly duplicating them and causing additional lag.

KBtip2.png Tip: You can also avoid uploading additional textures altogether by uploading a white color variant, then making use of the Base Color Tint parameter!

Double Sided Parameter : Uses and Dangers

“Double Sided” is a new property unique to Materials. When “Double Sided” is checked, the surface upon which this material is placed will be drawn twice; once for the outward-facing portion of the surface, and a second time for the inward-facing side of the surface that is normally invisible without a double-sided material. This option should only be used for very specific meshes that were designed to be used with double-sided materials, since placing materials with this parameter checked on normal objects will simply cause the viewer to draw it twice ( and thereby create additional viewer lag ) for no observable change. It is very strongly recommended that this option be unchecked for any material that is to be distributed for general use. Even more so if the “Modify” permission is revoked. If you wish to distribute a version of a material that has “Double Sided” checked, please include a second copy of the material that has “Double Sided” unchecked as well, with an accompanying explanation to the next user as to why this was done.

Example:

  • LeafTextures_DoubleSided
  • LeafTextures_SingleSided

When designing mesh content for use with the double-sided material parameter, it is also very strongly recommended that you separate the triangles you intend to use the double-sided material upon into a separate mesh “face”, so as to not unintentionally render the portions of the mesh that already have triangles designed to represent the internal portion of the object a second time.

LSL Scripting

Documentation for the LSL interface with glTF materials can be found on the following pages:

Recommended Application Settings

The glTF file format is widely adopted and many applications have export functionality for this type of file. Below is a non-comprehensive list of some of the more popular applications that export glTF files.

KBtip2.png Tip: The recommended HDRi for use in Second Life content creation is available at this Github repository. This HDRi will closely match the lighting of objects under the PBR "Midday" environment preset.
KBcaution.png Important: While every effort has been made to ensure the recommended HDRi matches SL as close as possible, you may need to adjust the "Environment Exposure" parameter in your editing program to get 1:1 results with SL.



Blender

KBwarning.png Warning: Older Blender versions have bugs in their glTF export tools which make their output incompatible with Second Life. Use of Blender versions of 3.3 and above are highly recommended to avoid issues.


KBcaution.png Important: Please ensure that you correctly set up an HDRi in your viewport, as otherwise the rendering in Blender and in SL will not match. Please see here for a reference HDRi. Please see this tutorial.

Upon starting your project:

Under: Scene > Render Properties > Color Management:

  • View Transform: Standard
  • Sequencer: Linear ACEScg


Create your materials within Blender using Principled BSDF Shader Nodes and the glTF Settings node. Export them according to the official Blender Documentation.

KBcaution.png Important: Second Life does not support BSDF Clearcoat, Subsurface, Anisotropy or Transmission parameters at this time.

For materials creation, 2 example .blend files are provided, one using separate Occlusion, Roughness and Metallic textures ("Long Form"), and one that handles a pre-packed ORM map ("Short Form")

The below files are intended for use with Blender versions 3.3 and above.



Adobe Substance 3D Painter

KBcaution.png Important: While Substance Painter is generally considered to be stable, in some (rare) situations Substance may output a malformed glTF which will be rejected by the viewer. If this happens, import your materials into Blender, then export a glTF from Blender - this should be fixed in a future version of Substance.


KBcaution.png Important: Please ensure that you correctly set up an HDRi in your viewport, as otherwise the rendering in Substance and in SL will not match. Please see here for a reference HDRi. Please see this tutorial.

When starting your project:

  • Template: PBR - Metallic Roughness Alpha-test (starter_assets)

OR

  • Template: PBR - Metallic Roughness Alpha-blend (starter_assets)

Verify the following settings:

  • Document Resolution: [Set as desired]
  • Normal Map Format: OpenGL (Y+)
  • Compute Tangents Per Fragment: YES

Under "Color Management":

KBtip2.png Tip: For a more in-depth explanation of the below settings, and issues that you may encounter, visit this page.
  • Color Management: OpenColorIO
  • OpenColorIO Configuration: ACES 1.0.3
  • Standard sRGB color space: Utility - sRGB - Texture
  • 8 bit images: Utility - sRGB - Texture
  • 16 bit images: Utility - sRGB - Texture
  • Material color space default: Utility - sRGB - Texture

When exporting:

  • Output Template: glTF PBR Metal Roughness
  • Size: Based on each Texture Set's size
  • Padding: Dilation + default background color - 8 bit



Adobe Substance 3D Designer

KBcaution.png Important: Substance Designer does not support glTF output, unlike Substance Painter.

Under preferences, verify the following Project settings:

  • Color Management: OpenColorIO
  • OpenColorIO Configuration: ACES 1.0.3
  • 8 bit images: Utility - sRGB - Texture
  • 16 bit images: Utility - sRGB - Texture
  • Floating point images: ACES - ACEScg
  • 2D and 3D View Display Default: sRGB

When exporting (Export Outputs):

  • basecolor: Utility - sRGB - Texture
  • normal: Utility - Raw
  • roughness: Utility - Raw
  • metallic: Utility - Raw
  • ambientocclusion: Utility - Raw

If you use a custom node to output a pre-compiled ORM map, this should also be set to Raw.


Cinema 4D

Please follow the documentation provided in this blog post.


3DCoat

KBwarning.png Warning: As of version "2022-58", 3DCoat is unable to produce a spec-compliant glTF file, and thus should not be used for Second Life. Use at your own risk - you will have issues!

glTF export has been implemented since 3DCoat version 2020 and is found in the File >Export > Export to glTF > glTF Separate (gltf + .bin + textures)


Quixel Mixer

Quixel Mixer has no glTF output, however, it does generate the functional textures, though they do need to be edited and combined in photo editing software. Export them by going to Export Target > Custom

Texture Preset: Metalness Maps

Select:

Albedo , Roughness, Normal, AO , Metalness and ( if need be ) Emissive.

Click “Export to Disk” and open the folder that the files were placed into.

Albedo is the Base Color texture in this case.

AO , Roughness , Metalness get combined into the ORM map as per this explanation.

Normal Map : Quixel generates Direct3D Normal Maps. The green channel needs to be inverted as per here.

Upload to Second Life using Method 2.


Autodesk 3DS Max 2023

Autodesk just added the ability to create glTF files using their new glTF Material and glTF Export functionalities as outlined in Autodesk's official documentation. All prior versions of Autodesk software do not have this functionality.


Material Maker

While Material Maker does not currently export directly to glTF (This may be added in future), materials created with this program are compatible with Second Life.

Export your materials using the Godot 4 ORM export preset.

Upload to Second Life using Method 2.


Adobe Photoshop

While Photoshop is not officially a PBR authoring tool, the changes to Alpha Blending (changing into Linear space from sRGB) may require you to change your PS settings to get consistent results. Please see this article for more information. (See the section titled "A Partial Solution"). Alternatively, this Reddit post also gives a few options on how to achieve blending in the correct manner.


GIMP

While GIMP is not officially a PBR authoring tool, the changes to Alpha Blending (changing into Linear space from sRGB) in Second Life will make textures created in GIMP display their alphas correctly (GIMP defaults to linear alpha calculation).

Troubleshooting content

If you upload a piece of PBR content which does not match your editor, the advice from Linden Lab is to STOP: File a JIRA. Do not attempt to "fix" the content.

That said, there are some troubleshooting steps which you can do yourself:

  • Check that you are using the PBR Linden Midday preset (called "Midday") not "Midday (Legacy)". Other environments may not match the reference HDRi, causing some visual differences. (This is intended behaviour, and content should be able to be viewed under any light correctly, but for troubleshooting purposes this may be required).
    • At present, there is a bug with the PBR Linden Midday preset which results in an excessive blue sheen, due to the use of an over-saturated (unrealistic) sky color, among some other issues. This has been fixed in the upcoming glTF Maintenance viewer.
  • Are you using a reflection probe? If not, does the problem reproduce if a manual reflection probe is placed over the object?
    • This is because a common source of the "blue sheen" in interior scenes is the use of an auto-probe. Auto-probes sample their surroundings, and combined with the approximate (and often incorrect) placement this will mean the sky is sampled on all sides, thus meaning the reflected light from the surroundings (which counters the blue light from the sky) is absent, leading to a larger-than-expected level of sky contribution on the object. Auto-probe placement can be worse in skyboxes or sky platforms
  • Triple-check the settings used for your editor match the ones given here, including the reference HDRi. Any deviation from these settings may cause visual differences between your editor and in-world.
  • Check your content against a glTF reference viewer; such as:

If the above steps fail, then please file a JIRA.

A good JIRA will include:

  • An LM to a location where the problem can be examined in-world.
  • A copy of the glTF content, attached to the JIRA.
  • Screenshots of the representation in-world, in a reference viewer, and in-editor.
    • You should include screenshots of the object inside a manually placed reflection probe, and outside.