{"_id":"5bec8a15287d1b00426efde1","category":{"_id":"5bec8a15287d1b00426efdcc","project":"578c4badbd223d2000cc1441","version":"5bec8a15287d1b00426efe54","__v":0,"sync":{"url":"","isSync":false},"reference":false,"createdAt":"2018-05-24T22:56:57.395Z","from_sync":false,"order":5,"slug":"enhanced-scenes","title":"Enhanced Scenes"},"project":"578c4badbd223d2000cc1441","user":"579a69d53de0a217007eda56","parentDoc":null,"version":{"_id":"5bec8a15287d1b00426efe54","project":"578c4badbd223d2000cc1441","__v":0,"forked_from":"5ba2b5747091250003437507","createdAt":"2018-04-23T20:03:35.726Z","releaseDate":"2018-04-23T20:03:35.726Z","categories":["5bec8a15287d1b00426efdc6","5bec8a15287d1b00426efdc7","5bec8a15287d1b00426efdc8","5bec8a15287d1b00426efdc9","5bec8a15287d1b00426efdca","5bec8a15287d1b00426efdcb","5bec8a15287d1b00426efdcc","5bec8a15287d1b00426efdcd","5bec8a15287d1b00426efdce"],"is_deprecated":false,"is_hidden":false,"is_beta":false,"is_stable":true,"codename":"","version_clean":"2.12.0","version":"2.12.0"},"githubsync":"","__v":0,"updates":[],"next":{"pages":[],"description":""},"createdAt":"2018-02-26T23:31:19.410Z","link_external":false,"link_url":"","sync_unique":"","hidden":false,"api":{"results":{"codes":[]},"settings":"","auth":"required","params":[],"url":""},"isReference":false,"order":2,"body":"[block:api-header]\n{\n  \"title\": \"Overview\"\n}\n[/block]\nPhysically-based rendering, or PBR, is a collection of rendering techniques that produces more realistic lighting results for your scenes by incorporating an advanced model of real-world lights and materials. The theory behind PBR closely matches the physics of real-world lighting and surfaces (though not exactly, it is still an approximation).\n\nIn addition to looking better, PBR offers an [artist workflow](https://blog.viromedia.com/asset-pipeline-exporting-pbr-textured-3d-models-for-ar-vr-arkit-arcore-c570423c68aa) that's far more intuitive: lighting and surface materials are based on physical parameters, so things naturally \"look right\" without having to resort to random tweaks.\n\nViro fully supports physically-based rendering. This guide covers the three constructs you need for creating great PBR scenes -- materials, direct lighting, and image-based lighting -- and offers some sample code to get you started.\n[block:api-header]\n{\n  \"title\": \"Materials\"\n}\n[/block]\nThe first step to creating PBR scenes is to configure materials. There are four PBR properties in each Material.\n\n* __Diffuse texture__: The diffuse or albedo texture defines the base color of the material. \n\n* __Metalness__: The metalness value or texture defines how \"metallic\" the surface is, which influences the degree to which light refracts and reflects off the surface, the level of sharpness in the reflections, and more. This can be set through a material's ```metalnessTexture``` property, or, if a uniform value is preferred, the ```metalness``` property.\n\n* __Roughness__: The roughness value or texture defines the roughness of the microfacets on the surface. The rougher a surface is, the more light will scatter along completely different directions, resulting in larger and more muted specular reflections. Smoother surfaces, meanwhile, exhibit a sharper specular reflection as light rays are more likely to reflect in a uniform direction. Roughness can be set through a material's ```roughnessTexture``` property, or, if a uniform value is preferred, the ```roughness``` property.\n\n* __Ambient Occlusion__: The ambient occlusion texture approximates how exposed the surface is to ambient lighting. This has no effect on direct lights (it does not result in clear shadows) but it darkens enclosed and sheltered areas. These textures are typically authored using modeling tools along with roughness and metalness. Ambient occlusion can be set through each material's ```ambientOcclusionTexture``` property.\n\nThese properties are best understood with images. Below is a grid of spheres that are illuminated by four direct lights. The spheres have no diffuse texture, but are colored red. Each sphere has a unique roughness and metalness value: roughness increases from left to right, and metalness increases from bottom to top. You can see that increasing metalness creates a shinier, more reflective sphere, and increasing roughness makes the spheres scatter incoming light more, creating a less sharp and more diffuse effect.\n[block:image]\n{\n  \"images\": [\n    {\n      \"image\": [\n        \"https://files.readme.io/9b4c49c-PBR.png\",\n        \"PBR.png\",\n        1086,\n        1067,\n        \"#981515\"\n      ]\n    }\n  ]\n}\n[/block]\nIn the image above, no textures are used: the diffuse color, the roughness, and the metalness are all uniform across each sphere. However, using modeling software, artists can create texture maps for these properties, so that each pixel on a surface has its own roughness and metalness value. Viro supports loading such models through OBJ and FBX. The image below shows spheres with diffuse, roughness, and metalness texture maps.\n[block:image]\n{\n  \"images\": [\n    {\n      \"image\": [\n        \"https://files.readme.io/8cfbd85-PBR_Textured.png\",\n        \"PBR_Textured.png\",\n        1980,\n        1021,\n        \"#120e0d\"\n      ]\n    }\n  ]\n}\n[/block]\nTo learn more about using modeling software to create Viro-compatible PBR models, check out our [guide](https://blog.viromedia.com/asset-pipeline-exporting-pbr-textured-3d-models-for-ar-vr-arkit-arcore-c570423c68aa) on the PBR asset pipeline.\n[block:api-header]\n{\n  \"title\": \"Direct Lighting\"\n}\n[/block]\nAccurate physically-based rendering requires not only that material surface models are accurate, but also that the lights themselves behave physically. Viro supports two forms of physically-based lights, and two forms of stylized lights.\n\n## Physically-based Lights\n\nPhysically-based lights attenuate naturally, using a distance-squared falloff, which closely matches lights in the real-world. Note this means that the ```attenuationStartDistance``` for such lights is ignored -- but the ```attenuationEndDistance``` is still adhered to. Furthermore, these lights also have their ```intensity``` set as luminous flux (in lumens).\n\n[ViroSpotLight](doc:virospotlight1) and [ViroOmniLight](doc:viroomnilight) behave physically when illuminating physically-based materials (that is, materials whose ```lightingModel``` is set to \"PhysicallyBased\"). \n\n## Stylized Lights\n\nNot all lights are physically-based; you may want to tweak lighting to achieve a cinematic effect in your Scene that can't be easily achieved by tuning realistic light sources. For this purpose we have __stylized__ lights.\n\nFor stylized lights, the ```intensity``` is not set in lumens: instead it is simply divided by 1,000 and multiplied by the light's color. In other words, intensity acts a scalar multiplier on the color, affecting the light's brightness. Furthermore, stylized lights do not attenuate naturally: instead their attenuation can be set via the ```attenuationStartDistance```, ```attenuationEndDistance``` and (coming soon) falloff exponent to achieve the desired effect.\n\nWhen PBR is enabled, [ViroAmbientLight](doc:viroambientlight)  and [ViroDirectionalLight](doc:virodirectionallight-1) remain as stylized lights. When PBR is disabled, all lights behave as stylized lights.\n[block:api-header]\n{\n  \"title\": \"Image-Based Lighting\"\n}\n[/block]\nImage-based lighting (IBL) refers to the techniques used to physically simulate ambient light. Whereas the lights described above simulate direct lights -- for example, bulbs and spotlights -- image-based lighting simulates the softer illumination from the _environment_. \n\nViro handles IBL through [ViroLightingEnvironment](doc:virolightingenvironment). The lighting environment is a texture that acts as a global light source, illuminating surfaces with diffuse and specular ambient light. Each pixel in the lighting environment is treated as a light emitter, thereby capturing the environment's global lighting and general feel. This gives objects a sense of belonging to their environment. For this reason it is common to use the scene's background texture as the lighting environment, but this is not necessary.\n\nFor these lighting environment textures, Viro expects images in HDR Radiance format (.hdr). Below are two examples of lighting environment maps. Notice how even the less reflective spheres (those on the bottom right, with high roughness and low metalness) capture a sense of belonging in their environment.\n[block:image]\n{\n  \"images\": [\n    {\n      \"image\": [\n        \"https://files.readme.io/4a57eba-IBL_1.png\",\n        \"IBL_1.png\",\n        2146,\n        1078,\n        \"#695644\"\n      ]\n    }\n  ]\n}\n[/block]\n\n[block:image]\n{\n  \"images\": [\n    {\n      \"image\": [\n        \"https://files.readme.io/66b8da0-IBL_2.png\",\n        \"IBL_2.png\",\n        2150,\n        1081,\n        \"#63605b\"\n      ]\n    }\n  ]\n}\n[/block]\nBelow is a simplified scene with fewer spheres, and corresponding code to create it. You can use this as a starting point for experimenting with PBR. The code sample combines material properties, direct lighting, and IBL lighting. The HDR image used in the sample can be found [here](http://dq0qxqxzgyp27.cloudfront.net/virocore/readme_example_assets/ibl_mans_outside.hdr). It should be dropped into the /res folder of your application.\n[block:image]\n{\n  \"images\": [\n    {\n      \"image\": [\n        \"https://files.readme.io/2ee1840-PBR-react.png\",\n        \"PBR-react.png\",\n        2088,\n        1049,\n        \"#4f4d49\"\n      ]\n    }\n  ]\n}\n[/block]\n\n[block:code]\n{\n  \"codes\": [\n    {\n      \"code\": \"'use strict';\\n\\nimport React, { Component } from 'react';\\nimport {\\n ViroScene,\\n ViroMaterials,\\n ViroNode,\\n ViroOmniLight,\\n Viro360Image,\\n ViroSphere,\\n ViroController,\\n ViroLightingEnvironment,\\n} from 'react-viro';\\n\\nvar createReactClass = require('create-react-class');\\nvar ViroPBRTest = createReactClass({\\n  getInitialState() {\\n    return {\\n\\n    };\\n  },\\n\\n  render: function() {\\n    return (\\n\\n    <ViroScene>\\n      <Viro360Image source={require('./res/ibl_mans_outside.hdr')} \\n                    isHdr={true} />\\n      <ViroLightingEnvironment source={require('./res/ibl_mans_outside.hdr')}/>\\n\\n      <ViroOmniLight\\n          intensity={300}\\n          position={[-10, 10, 1]}\\n          color={\\\"#FFFFFF\\\"}\\n          attenuationStartDistance={20}\\n          attenuationEndDistance={30} />\\n      <ViroOmniLight\\n          intensity={300}\\n          position={[10, 10, 1]}\\n          color={\\\"#FFFFFF\\\"}\\n          attenuationStartDistance={20}\\n          attenuationEndDistance={30} />\\n      <ViroOmniLight\\n          intensity={300}\\n          position={[-10, -10, 1]}\\n          color={\\\"#FFFFFF\\\"}\\n          attenuationStartDistance={20}\\n          attenuationEndDistance={30} />\\n      <ViroOmniLight\\n          intensity={300}\\n          position={[10, -10, 1]}\\n          color={\\\"#FFFFFF\\\"}\\n          attenuationStartDistance={20}\\n          attenuationEndDistance={30} />\\n\\n      <ViroSphere\\n          position={[-3, 1.5, -9]}\\n          radius={1}\\n          materials={\\\"sphereA\\\"} />\\n      <ViroSphere\\n          position={[0, 1.5, -9]}\\n          radius={1}\\n          materials={\\\"sphereB\\\"}/>\\n      <ViroSphere\\n          position={[3, 1.5, -9]}\\n          radius={1}\\n          materials={\\\"sphereC\\\"}/>\\n      <ViroSphere\\n          position={[-3, -1.5, -9]}\\n          radius={1}\\n          materials={\\\"sphereD\\\"} />\\n      <ViroSphere\\n          position={[0, -1.5, -9]}\\n          radius={1}\\n          materials={\\\"sphereE\\\"}/>\\n      <ViroSphere\\n          position={[3, -1.5, -9]}\\n          radius={1}\\n          materials={\\\"sphereF\\\"}/>\\n    </ViroScene>\\n  );\\n  },\\n });\\n\\nViroMaterials.createMaterials({\\n  sphereA: {\\n    roughness: 0.0,\\n    metalness: 1.0,\\n    lightingModel: \\\"PBR\\\",\\n    diffuseColor: \\\"#FFFFFF\\\"\\n  },\\n  sphereB: {\\n    roughness: 0.2,\\n    metalness: 1.0,\\n    lightingModel: \\\"PBR\\\",\\n    diffuseColor: \\\"#FFFFFF\\\"\\n  },\\n  sphereC: {\\n    roughness: 0.5,\\n    metalness: 1.0,\\n    lightingModel: \\\"PBR\\\",\\n    diffuseColor: \\\"#FFFFFF\\\"\\n  },\\n  sphereD: {\\n    roughness: 0.0,\\n    metalness: 0.3,\\n    lightingModel: \\\"PBR\\\",\\n    diffuseColor: \\\"#FFFFFF\\\"\\n  },\\n  sphereE: {\\n    roughness: 0.2,\\n    metalness: 0.3,\\n    lightingModel: \\\"PBR\\\",\\n    diffuseColor: \\\"#FFFFFF\\\"\\n  },\\n  sphereF: {\\n    roughness: 0.5,\\n    metalness: 0.3,\\n    lightingModel: \\\"PBR\\\",\\n    diffuseColor: \\\"#FFFFFF\\\"\\n  },\\n});\\n\\nmodule.exports = ViroPBRTest;\",\n      \"language\": \"javascript\"\n    }\n  ]\n}\n[/block]\nTo see the full effect of physically-based rendering it's best to use FBX models authored for PBR. Below is one example: an FBX model of a canister, featuring a metalness map, a roughness map, diffuse textures, and ambient occlusion textures. The model is placed in an HDR environment. Observe how the lighting around the model subtly matches its environment lighting, and notice the sharp specular reflections on the metallic regions of the canister.\n[block:image]\n{\n  \"images\": [\n    {\n      \"image\": [\n        \"https://files.readme.io/5484638-IBL_3.png\",\n        \"IBL_3.png\",\n        2072,\n        1069,\n        \"#4e443e\"\n      ]\n    }\n  ]\n}\n[/block]\nFinally, the slightly different cylinder below, seen from all angles, showcases the effects of PBR more vividly.\n[block:image]\n{\n  \"images\": [\n    {\n      \"image\": [\n        \"https://files.readme.io/36a02cd-PBR_cylinder.gif\",\n        \"PBR_cylinder.gif\",\n        600,\n        338,\n        \"#473d3b\"\n      ]\n    }\n  ]\n}\n[/block]","excerpt":"Physically based rendering","slug":"physically-based-rendering","type":"basic","title":"PBR"}

PBR

Physically based rendering

[block:api-header] { "title": "Overview" } [/block] Physically-based rendering, or PBR, is a collection of rendering techniques that produces more realistic lighting results for your scenes by incorporating an advanced model of real-world lights and materials. The theory behind PBR closely matches the physics of real-world lighting and surfaces (though not exactly, it is still an approximation). In addition to looking better, PBR offers an [artist workflow](https://blog.viromedia.com/asset-pipeline-exporting-pbr-textured-3d-models-for-ar-vr-arkit-arcore-c570423c68aa) that's far more intuitive: lighting and surface materials are based on physical parameters, so things naturally "look right" without having to resort to random tweaks. Viro fully supports physically-based rendering. This guide covers the three constructs you need for creating great PBR scenes -- materials, direct lighting, and image-based lighting -- and offers some sample code to get you started. [block:api-header] { "title": "Materials" } [/block] The first step to creating PBR scenes is to configure materials. There are four PBR properties in each Material. * __Diffuse texture__: The diffuse or albedo texture defines the base color of the material. * __Metalness__: The metalness value or texture defines how "metallic" the surface is, which influences the degree to which light refracts and reflects off the surface, the level of sharpness in the reflections, and more. This can be set through a material's ```metalnessTexture``` property, or, if a uniform value is preferred, the ```metalness``` property. * __Roughness__: The roughness value or texture defines the roughness of the microfacets on the surface. The rougher a surface is, the more light will scatter along completely different directions, resulting in larger and more muted specular reflections. Smoother surfaces, meanwhile, exhibit a sharper specular reflection as light rays are more likely to reflect in a uniform direction. Roughness can be set through a material's ```roughnessTexture``` property, or, if a uniform value is preferred, the ```roughness``` property. * __Ambient Occlusion__: The ambient occlusion texture approximates how exposed the surface is to ambient lighting. This has no effect on direct lights (it does not result in clear shadows) but it darkens enclosed and sheltered areas. These textures are typically authored using modeling tools along with roughness and metalness. Ambient occlusion can be set through each material's ```ambientOcclusionTexture``` property. These properties are best understood with images. Below is a grid of spheres that are illuminated by four direct lights. The spheres have no diffuse texture, but are colored red. Each sphere has a unique roughness and metalness value: roughness increases from left to right, and metalness increases from bottom to top. You can see that increasing metalness creates a shinier, more reflective sphere, and increasing roughness makes the spheres scatter incoming light more, creating a less sharp and more diffuse effect. [block:image] { "images": [ { "image": [ "https://files.readme.io/9b4c49c-PBR.png", "PBR.png", 1086, 1067, "#981515" ] } ] } [/block] In the image above, no textures are used: the diffuse color, the roughness, and the metalness are all uniform across each sphere. However, using modeling software, artists can create texture maps for these properties, so that each pixel on a surface has its own roughness and metalness value. Viro supports loading such models through OBJ and FBX. The image below shows spheres with diffuse, roughness, and metalness texture maps. [block:image] { "images": [ { "image": [ "https://files.readme.io/8cfbd85-PBR_Textured.png", "PBR_Textured.png", 1980, 1021, "#120e0d" ] } ] } [/block] To learn more about using modeling software to create Viro-compatible PBR models, check out our [guide](https://blog.viromedia.com/asset-pipeline-exporting-pbr-textured-3d-models-for-ar-vr-arkit-arcore-c570423c68aa) on the PBR asset pipeline. [block:api-header] { "title": "Direct Lighting" } [/block] Accurate physically-based rendering requires not only that material surface models are accurate, but also that the lights themselves behave physically. Viro supports two forms of physically-based lights, and two forms of stylized lights. ## Physically-based Lights Physically-based lights attenuate naturally, using a distance-squared falloff, which closely matches lights in the real-world. Note this means that the ```attenuationStartDistance``` for such lights is ignored -- but the ```attenuationEndDistance``` is still adhered to. Furthermore, these lights also have their ```intensity``` set as luminous flux (in lumens). [ViroSpotLight](doc:virospotlight1) and [ViroOmniLight](doc:viroomnilight) behave physically when illuminating physically-based materials (that is, materials whose ```lightingModel``` is set to "PhysicallyBased"). ## Stylized Lights Not all lights are physically-based; you may want to tweak lighting to achieve a cinematic effect in your Scene that can't be easily achieved by tuning realistic light sources. For this purpose we have __stylized__ lights. For stylized lights, the ```intensity``` is not set in lumens: instead it is simply divided by 1,000 and multiplied by the light's color. In other words, intensity acts a scalar multiplier on the color, affecting the light's brightness. Furthermore, stylized lights do not attenuate naturally: instead their attenuation can be set via the ```attenuationStartDistance```, ```attenuationEndDistance``` and (coming soon) falloff exponent to achieve the desired effect. When PBR is enabled, [ViroAmbientLight](doc:viroambientlight) and [ViroDirectionalLight](doc:virodirectionallight-1) remain as stylized lights. When PBR is disabled, all lights behave as stylized lights. [block:api-header] { "title": "Image-Based Lighting" } [/block] Image-based lighting (IBL) refers to the techniques used to physically simulate ambient light. Whereas the lights described above simulate direct lights -- for example, bulbs and spotlights -- image-based lighting simulates the softer illumination from the _environment_. Viro handles IBL through [ViroLightingEnvironment](doc:virolightingenvironment). The lighting environment is a texture that acts as a global light source, illuminating surfaces with diffuse and specular ambient light. Each pixel in the lighting environment is treated as a light emitter, thereby capturing the environment's global lighting and general feel. This gives objects a sense of belonging to their environment. For this reason it is common to use the scene's background texture as the lighting environment, but this is not necessary. For these lighting environment textures, Viro expects images in HDR Radiance format (.hdr). Below are two examples of lighting environment maps. Notice how even the less reflective spheres (those on the bottom right, with high roughness and low metalness) capture a sense of belonging in their environment. [block:image] { "images": [ { "image": [ "https://files.readme.io/4a57eba-IBL_1.png", "IBL_1.png", 2146, 1078, "#695644" ] } ] } [/block] [block:image] { "images": [ { "image": [ "https://files.readme.io/66b8da0-IBL_2.png", "IBL_2.png", 2150, 1081, "#63605b" ] } ] } [/block] Below is a simplified scene with fewer spheres, and corresponding code to create it. You can use this as a starting point for experimenting with PBR. The code sample combines material properties, direct lighting, and IBL lighting. The HDR image used in the sample can be found [here](http://dq0qxqxzgyp27.cloudfront.net/virocore/readme_example_assets/ibl_mans_outside.hdr). It should be dropped into the /res folder of your application. [block:image] { "images": [ { "image": [ "https://files.readme.io/2ee1840-PBR-react.png", "PBR-react.png", 2088, 1049, "#4f4d49" ] } ] } [/block] [block:code] { "codes": [ { "code": "'use strict';\n\nimport React, { Component } from 'react';\nimport {\n ViroScene,\n ViroMaterials,\n ViroNode,\n ViroOmniLight,\n Viro360Image,\n ViroSphere,\n ViroController,\n ViroLightingEnvironment,\n} from 'react-viro';\n\nvar createReactClass = require('create-react-class');\nvar ViroPBRTest = createReactClass({\n getInitialState() {\n return {\n\n };\n },\n\n render: function() {\n return (\n\n <ViroScene>\n <Viro360Image source={require('./res/ibl_mans_outside.hdr')} \n isHdr={true} />\n <ViroLightingEnvironment source={require('./res/ibl_mans_outside.hdr')}/>\n\n <ViroOmniLight\n intensity={300}\n position={[-10, 10, 1]}\n color={\"#FFFFFF\"}\n attenuationStartDistance={20}\n attenuationEndDistance={30} />\n <ViroOmniLight\n intensity={300}\n position={[10, 10, 1]}\n color={\"#FFFFFF\"}\n attenuationStartDistance={20}\n attenuationEndDistance={30} />\n <ViroOmniLight\n intensity={300}\n position={[-10, -10, 1]}\n color={\"#FFFFFF\"}\n attenuationStartDistance={20}\n attenuationEndDistance={30} />\n <ViroOmniLight\n intensity={300}\n position={[10, -10, 1]}\n color={\"#FFFFFF\"}\n attenuationStartDistance={20}\n attenuationEndDistance={30} />\n\n <ViroSphere\n position={[-3, 1.5, -9]}\n radius={1}\n materials={\"sphereA\"} />\n <ViroSphere\n position={[0, 1.5, -9]}\n radius={1}\n materials={\"sphereB\"}/>\n <ViroSphere\n position={[3, 1.5, -9]}\n radius={1}\n materials={\"sphereC\"}/>\n <ViroSphere\n position={[-3, -1.5, -9]}\n radius={1}\n materials={\"sphereD\"} />\n <ViroSphere\n position={[0, -1.5, -9]}\n radius={1}\n materials={\"sphereE\"}/>\n <ViroSphere\n position={[3, -1.5, -9]}\n radius={1}\n materials={\"sphereF\"}/>\n </ViroScene>\n );\n },\n });\n\nViroMaterials.createMaterials({\n sphereA: {\n roughness: 0.0,\n metalness: 1.0,\n lightingModel: \"PBR\",\n diffuseColor: \"#FFFFFF\"\n },\n sphereB: {\n roughness: 0.2,\n metalness: 1.0,\n lightingModel: \"PBR\",\n diffuseColor: \"#FFFFFF\"\n },\n sphereC: {\n roughness: 0.5,\n metalness: 1.0,\n lightingModel: \"PBR\",\n diffuseColor: \"#FFFFFF\"\n },\n sphereD: {\n roughness: 0.0,\n metalness: 0.3,\n lightingModel: \"PBR\",\n diffuseColor: \"#FFFFFF\"\n },\n sphereE: {\n roughness: 0.2,\n metalness: 0.3,\n lightingModel: \"PBR\",\n diffuseColor: \"#FFFFFF\"\n },\n sphereF: {\n roughness: 0.5,\n metalness: 0.3,\n lightingModel: \"PBR\",\n diffuseColor: \"#FFFFFF\"\n },\n});\n\nmodule.exports = ViroPBRTest;", "language": "javascript" } ] } [/block] To see the full effect of physically-based rendering it's best to use FBX models authored for PBR. Below is one example: an FBX model of a canister, featuring a metalness map, a roughness map, diffuse textures, and ambient occlusion textures. The model is placed in an HDR environment. Observe how the lighting around the model subtly matches its environment lighting, and notice the sharp specular reflections on the metallic regions of the canister. [block:image] { "images": [ { "image": [ "https://files.readme.io/5484638-IBL_3.png", "IBL_3.png", 2072, 1069, "#4e443e" ] } ] } [/block] Finally, the slightly different cylinder below, seen from all angles, showcases the effects of PBR more vividly. [block:image] { "images": [ { "image": [ "https://files.readme.io/36a02cd-PBR_cylinder.gif", "PBR_cylinder.gif", 600, 338, "#473d3b" ] } ] } [/block]