@babylonjs/core 8.8.1 → 8.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/Engines/abstractEngine.js +2 -2
  2. package/Engines/abstractEngine.js.map +1 -1
  3. package/Engines/constants.d.ts +23 -0
  4. package/Engines/constants.js +23 -0
  5. package/Engines/constants.js.map +1 -1
  6. package/Engines/thinEngine.d.ts +1 -0
  7. package/Engines/thinEngine.js +22 -18
  8. package/Engines/thinEngine.js.map +1 -1
  9. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +8 -11
  10. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  11. package/Materials/Node/Blocks/PBR/sheenBlock.js +1 -1
  12. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  13. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +6 -2
  14. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
  15. package/Materials/PBR/pbrBRDFConfiguration.d.ts +11 -0
  16. package/Materials/PBR/pbrBRDFConfiguration.js +16 -0
  17. package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
  18. package/Materials/PBR/pbrBaseMaterial.d.ts +4 -0
  19. package/Materials/PBR/pbrBaseMaterial.js +12 -8
  20. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  21. package/Materials/PBR/pbrMaterial.d.ts +8 -0
  22. package/Materials/PBR/pbrMaterial.js +16 -0
  23. package/Materials/PBR/pbrMaterial.js.map +1 -1
  24. package/Physics/v2/physicsAggregate.d.ts +2 -2
  25. package/Physics/v2/physicsAggregate.js +2 -2
  26. package/Physics/v2/physicsAggregate.js.map +1 -1
  27. package/Rendering/objectRenderer.js +1 -1
  28. package/Rendering/objectRenderer.js.map +1 -1
  29. package/Shaders/ShadersInclude/lightFragment.js +5 -1
  30. package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
  31. package/Shaders/ShadersInclude/pbrBRDFFunctions.js +12 -5
  32. package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  33. package/Shaders/ShadersInclude/pbrBlockDirectLighting.js +3 -0
  34. package/Shaders/ShadersInclude/pbrBlockDirectLighting.js.map +1 -1
  35. package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js +21 -8
  36. package/Shaders/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
  37. package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js +3 -0
  38. package/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
  39. package/Shaders/ShadersInclude/pbrBlockReflectance.js +6 -6
  40. package/Shaders/ShadersInclude/pbrBlockReflectance.js.map +1 -1
  41. package/Shaders/ShadersInclude/pbrBlockReflectance0.js +2 -7
  42. package/Shaders/ShadersInclude/pbrBlockReflectance0.js.map +1 -1
  43. package/Shaders/ShadersInclude/pbrBlockReflectivity.js +20 -16
  44. package/Shaders/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  45. package/Shaders/ShadersInclude/pbrBlockSubSurface.js +6 -8
  46. package/Shaders/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  47. package/Shaders/ShadersInclude/pbrDebug.js +2 -2
  48. package/Shaders/ShadersInclude/pbrDebug.js.map +1 -1
  49. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +1 -5
  50. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  51. package/Shaders/pbr.fragment.js +7 -3
  52. package/Shaders/pbr.fragment.js.map +1 -1
  53. package/ShadersWGSL/ShadersInclude/lightFragment.js +5 -1
  54. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  55. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js +5 -5
  56. package/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
  57. package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js +3 -0
  58. package/ShadersWGSL/ShadersInclude/pbrBlockDirectLighting.js.map +1 -1
  59. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js +21 -8
  60. package/ShadersWGSL/ShadersInclude/pbrBlockFinalLitComponents.js.map +1 -1
  61. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js +3 -0
  62. package/ShadersWGSL/ShadersInclude/pbrBlockFinalUnlitComponents.js.map +1 -1
  63. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js +6 -6
  64. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance.js.map +1 -1
  65. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance0.js +2 -7
  66. package/ShadersWGSL/ShadersInclude/pbrBlockReflectance0.js.map +1 -1
  67. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js +22 -15
  68. package/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.js.map +1 -1
  69. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js +6 -8
  70. package/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.js.map +1 -1
  71. package/ShadersWGSL/ShadersInclude/pbrDebug.js +2 -2
  72. package/ShadersWGSL/ShadersInclude/pbrDebug.js.map +1 -1
  73. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +1 -7
  74. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  75. package/ShadersWGSL/pbr.fragment.js +7 -3
  76. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  77. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"objectRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/objectRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line import/no-internal-modules\r\nimport type { SmartArray, Nullable, Immutable, Camera, Scene, AbstractMesh, SubMesh, Material, IParticleSystem, InstancedMesh } from \"core/index\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { RenderingManager } from \"../Rendering/renderingManager\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { _ObserveArray } from \"../Misc/arrayTools\";\r\n\r\n/**\r\n * Defines the options of the object renderer\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface ObjectRendererOptions {\r\n /** The number of passes the renderer will support (1 by default) */\r\n numPasses?: number;\r\n\r\n /** True (default) to not change the aspect ratio of the scene in the RTT */\r\n doNotChangeAspectRatio?: boolean;\r\n}\r\n\r\n/**\r\n * A class that renders objects to the currently bound render target.\r\n * This class only renders objects, and is not concerned with the output texture or post-processing.\r\n */\r\nexport class ObjectRenderer {\r\n /**\r\n * Objects will only be rendered once which can be useful to improve performance if everything in your render is static for instance.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONCE: number = 0;\r\n /**\r\n * Objects will be rendered every frame and is recommended for dynamic contents.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONEVERYFRAME: number = 1;\r\n /**\r\n * Objects will be rendered every 2 frames which could be enough if your dynamic objects are not\r\n * the central point of your effect and can save a lot of performances.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONEVERYTWOFRAMES: number = 2;\r\n\r\n /**\r\n * Use this predicate to dynamically define the list of mesh you want to render.\r\n * If set, the renderList property will be overwritten.\r\n */\r\n public renderListPredicate: (AbstractMesh: AbstractMesh) => boolean;\r\n\r\n private _renderList: Nullable<Array<AbstractMesh>>;\r\n private _unObserveRenderList: Nullable<() => void> = null;\r\n\r\n /**\r\n * Use this list to define the list of mesh you want to render.\r\n */\r\n public get renderList(): Nullable<Array<AbstractMesh>> {\r\n return this._renderList;\r\n }\r\n\r\n public set renderList(value: Nullable<Array<AbstractMesh>>) {\r\n if (this._renderList === value) {\r\n return;\r\n }\r\n if (this._unObserveRenderList) {\r\n this._unObserveRenderList();\r\n this._unObserveRenderList = null;\r\n }\r\n\r\n if (value) {\r\n this._unObserveRenderList = _ObserveArray(value, this._renderListHasChanged);\r\n }\r\n\r\n this._renderList = value;\r\n }\r\n\r\n private _renderListHasChanged = (_functionName: string, previousLength: number) => {\r\n const newLength = this._renderList ? this._renderList.length : 0;\r\n if ((previousLength === 0 && newLength > 0) || newLength === 0) {\r\n for (const mesh of this._scene.meshes) {\r\n mesh._markSubMeshesAsLightDirty();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Define the list of particle systems to render. If not provided, will render all the particle systems of the scene.\r\n * Note that the particle systems are rendered only if renderParticles is set to true.\r\n */\r\n public particleSystemList: Nullable<Array<IParticleSystem>> = null;\r\n\r\n /**\r\n * Use this function to overload the renderList array at rendering time.\r\n * Return null to render with the current renderList, else return the list of meshes to use for rendering.\r\n * For 2DArray, layerOrFace is the index of the layer that is going to be rendered, else it is the faceIndex of\r\n * the cube (if the RTT is a cube, else layerOrFace=0).\r\n * The renderList passed to the function is the current render list (the one that will be used if the function returns null).\r\n * The length of this list is passed through renderListLength: don't use renderList.length directly because the array can\r\n * hold dummy elements!\r\n */\r\n public getCustomRenderList: Nullable<(layerOrFace: number, renderList: Nullable<Immutable<Array<AbstractMesh>>>, renderListLength: number) => Nullable<Array<AbstractMesh>>> =\r\n null;\r\n\r\n /**\r\n * Define if particles should be rendered.\r\n */\r\n public renderParticles = true;\r\n\r\n /**\r\n * Define if sprites should be rendered.\r\n */\r\n public renderSprites = false;\r\n\r\n /**\r\n * Force checking the layerMask property even if a custom list of meshes is provided (ie. if renderList is not undefined)\r\n */\r\n public forceLayerMaskCheck = false;\r\n\r\n /**\r\n * Define the camera used to render the objects.\r\n */\r\n public activeCamera: Nullable<Camera>;\r\n\r\n /**\r\n * Define the camera used to calculate the LOD of the objects.\r\n * If not defined, activeCamera will be used. If not defined nor activeCamera, scene's active camera will be used.\r\n */\r\n public cameraForLOD: Nullable<Camera>;\r\n\r\n private _disableImageProcessing = false;\r\n /**\r\n * If true, the object renderer will render all objects without any image processing applied.\r\n * If false (default value), the renderer will use the current setting of the scene's image processing configuration.\r\n */\r\n public get disableImageProcessing() {\r\n return this._disableImageProcessing;\r\n }\r\n\r\n public set disableImageProcessing(value: boolean) {\r\n if (value === this._disableImageProcessing) {\r\n return;\r\n }\r\n\r\n this._disableImageProcessing = value;\r\n this._scene.markAllMaterialsAsDirty(Constants.MATERIAL_ImageProcessingDirtyFlag);\r\n }\r\n\r\n /**\r\n * Override the mesh isReady function with your own one.\r\n */\r\n public customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => boolean;\r\n\r\n /**\r\n * Override the render function with your own one.\r\n */\r\n public customRenderFunction: (\r\n opaqueSubMeshes: SmartArray<SubMesh>,\r\n alphaTestSubMeshes: SmartArray<SubMesh>,\r\n transparentSubMeshes: SmartArray<SubMesh>,\r\n depthOnlySubMeshes: SmartArray<SubMesh>,\r\n beforeTransparents?: () => void\r\n ) => void;\r\n\r\n /**\r\n * An event triggered before rendering the objects\r\n */\r\n public readonly onBeforeRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered after rendering the objects\r\n */\r\n public readonly onAfterRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered before the rendering group is processed\r\n */\r\n public readonly onBeforeRenderingManagerRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered after the rendering group is processed\r\n */\r\n public readonly onAfterRenderingManagerRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered when fast path rendering is used\r\n */\r\n public readonly onFastPathRenderObservable = new Observable<number>();\r\n\r\n protected _scene: Scene;\r\n /** @internal */\r\n public _renderingManager: RenderingManager;\r\n /** @internal */\r\n public _waitingRenderList?: string[];\r\n protected _currentRefreshId = -1;\r\n protected _refreshRate = 1;\r\n protected _currentApplyByPostProcessSetting = false;\r\n\r\n /**\r\n * The options used by the object renderer\r\n */\r\n public options: Required<ObjectRendererOptions>;\r\n\r\n private _name: string;\r\n /**\r\n * Friendly name of the object renderer\r\n */\r\n public get name() {\r\n return this._name;\r\n }\r\n\r\n public set name(value: string) {\r\n if (this._name === value) {\r\n return;\r\n }\r\n\r\n this._name = value;\r\n\r\n if (!this._scene) {\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n for (let i = 0; i < this._renderPassIds.length; ++i) {\r\n const renderPassId = this._renderPassIds[i];\r\n engine._renderPassNames[renderPassId] = `${this._name}#${i}`;\r\n }\r\n }\r\n\r\n /**\r\n * Current render pass id. Note it can change over the rendering as there's a separate id for each face of a cube / each layer of an array layer!\r\n */\r\n public renderPassId: number;\r\n private readonly _renderPassIds: number[];\r\n /**\r\n * Gets the render pass ids used by the object renderer.\r\n */\r\n public get renderPassIds(): readonly number[] {\r\n return this._renderPassIds;\r\n }\r\n\r\n /**\r\n * Gets the current value of the refreshId counter\r\n */\r\n public get currentRefreshId() {\r\n return this._currentRefreshId;\r\n }\r\n\r\n /**\r\n * Sets a specific material to be used to render a mesh/a list of meshes with this object renderer\r\n * @param mesh mesh or array of meshes\r\n * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering pass.\r\n */\r\n public setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material | Material[]): void {\r\n let meshes;\r\n if (!Array.isArray(mesh)) {\r\n meshes = [mesh];\r\n } else {\r\n meshes = mesh;\r\n }\r\n for (let j = 0; j < meshes.length; ++j) {\r\n for (let i = 0; i < this.options.numPasses; ++i) {\r\n let mesh = meshes[j];\r\n if (meshes[j].isAnInstance) {\r\n mesh = (meshes[j] as InstancedMesh).sourceMesh;\r\n }\r\n mesh.setMaterialForRenderPass(this._renderPassIds[i], material !== undefined ? (Array.isArray(material) ? material[i] : material) : undefined);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates an object renderer.\r\n * @param name The friendly name of the object renderer\r\n * @param scene The scene the renderer belongs to\r\n * @param options The options used to create the renderer (optional)\r\n */\r\n constructor(name: string, scene: Scene, options?: ObjectRendererOptions) {\r\n this.name = name;\r\n this._scene = scene;\r\n\r\n this.renderList = [] as AbstractMesh[];\r\n this._renderPassIds = [];\r\n\r\n this.options = {\r\n numPasses: 1,\r\n doNotChangeAspectRatio: true,\r\n ...options,\r\n };\r\n\r\n this._createRenderPassId();\r\n\r\n this.renderPassId = this._renderPassIds[0];\r\n\r\n // Rendering groups\r\n this._renderingManager = new RenderingManager(scene);\r\n this._renderingManager._useSceneAutoClearSetup = true;\r\n }\r\n\r\n private _releaseRenderPassId(): void {\r\n const engine = this._scene.getEngine();\r\n for (let i = 0; i < this.options.numPasses; ++i) {\r\n engine.releaseRenderPassId(this._renderPassIds[i]);\r\n }\r\n this._renderPassIds.length = 0;\r\n }\r\n\r\n private _createRenderPassId(): void {\r\n this._releaseRenderPassId();\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n for (let i = 0; i < this.options.numPasses; ++i) {\r\n this._renderPassIds[i] = engine.createRenderPassId(`${this.name}#${i}`);\r\n }\r\n }\r\n\r\n /**\r\n * Resets the refresh counter of the renderer and start back from scratch.\r\n * Could be useful to re-render if it is setup to render only once.\r\n */\r\n public resetRefreshCounter(): void {\r\n this._currentRefreshId = -1;\r\n }\r\n\r\n /**\r\n * Defines the refresh rate of the rendering or the rendering frequency.\r\n * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...\r\n */\r\n public get refreshRate(): number {\r\n return this._refreshRate;\r\n }\r\n public set refreshRate(value: number) {\r\n this._refreshRate = value;\r\n this.resetRefreshCounter();\r\n }\r\n\r\n /**\r\n * Indicates if the renderer should render the current frame.\r\n * The output is based on the specified refresh rate.\r\n * @returns true if the renderer should render the current frame\r\n */\r\n public shouldRender(): boolean {\r\n if (this._currentRefreshId === -1) {\r\n // At least render once\r\n this._currentRefreshId = 1;\r\n return true;\r\n }\r\n\r\n if (this.refreshRate === this._currentRefreshId) {\r\n this._currentRefreshId = 1;\r\n return true;\r\n }\r\n\r\n this._currentRefreshId++;\r\n return false;\r\n }\r\n\r\n /**\r\n * This function will check if the renderer is ready to render (textures are loaded, shaders are compiled)\r\n * @param viewportWidth defines the width of the viewport\r\n * @param viewportHeight defines the height of the viewport\r\n * @returns true if all required resources are ready\r\n */\r\n public isReadyForRendering(viewportWidth: number, viewportHeight: number): boolean {\r\n this.prepareRenderList();\r\n this.initRender(viewportWidth, viewportHeight);\r\n\r\n const isReady = this._checkReadiness();\r\n\r\n this.finishRender();\r\n\r\n return isReady;\r\n }\r\n\r\n /**\r\n * Makes sure the list of meshes is ready to be rendered\r\n * You should call this function before \"initRender\", but if you know the render list is ok, you may call \"initRender\" directly\r\n */\r\n public prepareRenderList(): void {\r\n const scene = this._scene;\r\n\r\n if (this._waitingRenderList) {\r\n if (!this.renderListPredicate) {\r\n this.renderList = [];\r\n for (let index = 0; index < this._waitingRenderList.length; index++) {\r\n const id = this._waitingRenderList[index];\r\n const mesh = scene.getMeshById(id);\r\n if (mesh) {\r\n this.renderList.push(mesh);\r\n }\r\n }\r\n }\r\n this._waitingRenderList = undefined;\r\n }\r\n\r\n // Is predicate defined?\r\n if (this.renderListPredicate) {\r\n if (this.renderList) {\r\n this.renderList.length = 0; // Clear previous renderList\r\n } else {\r\n this.renderList = [];\r\n }\r\n\r\n const sceneMeshes = this._scene.meshes;\r\n\r\n for (let index = 0; index < sceneMeshes.length; index++) {\r\n const mesh = sceneMeshes[index];\r\n if (this.renderListPredicate(mesh)) {\r\n this.renderList.push(mesh);\r\n }\r\n }\r\n }\r\n\r\n this._currentApplyByPostProcessSetting = this._scene.imageProcessingConfiguration.applyByPostProcess;\r\n if (this._disableImageProcessing) {\r\n // we do not use the applyByPostProcess setter to avoid flagging all the materials as \"image processing dirty\"!\r\n this._scene.imageProcessingConfiguration._applyByPostProcess = this._disableImageProcessing;\r\n }\r\n }\r\n\r\n private _defaultRenderListPrepared: boolean;\r\n private _currentSceneCamera: Nullable<Camera> = null;\r\n\r\n /**\r\n * This method makes sure everything is setup before \"render\" can be called\r\n * @param viewportWidth Width of the viewport to render to\r\n * @param viewportHeight Height of the viewport to render to\r\n */\r\n public initRender(viewportWidth: number, viewportHeight: number): void {\r\n const engine = this._scene.getEngine();\r\n const camera: Nullable<Camera> = this.activeCamera ?? this._scene.activeCamera;\r\n\r\n this._currentSceneCamera = this._scene.activeCamera;\r\n\r\n if (camera) {\r\n if (camera !== this._scene.activeCamera) {\r\n this._scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(true));\r\n this._scene.activeCamera = camera;\r\n }\r\n engine.setViewport(camera.rigParent ? camera.rigParent.viewport : camera.viewport, viewportWidth, viewportHeight);\r\n }\r\n\r\n this._defaultRenderListPrepared = false;\r\n }\r\n\r\n /**\r\n * This method must be called after the \"render\" call(s), to complete the rendering process.\r\n */\r\n public finishRender() {\r\n const scene = this._scene;\r\n\r\n if (this._disableImageProcessing) {\r\n scene.imageProcessingConfiguration._applyByPostProcess = this._currentApplyByPostProcessSetting;\r\n }\r\n\r\n scene.activeCamera = this._currentSceneCamera;\r\n if (this._currentSceneCamera) {\r\n if (this.activeCamera && this.activeCamera !== scene.activeCamera) {\r\n scene.setTransformMatrix(this._currentSceneCamera.getViewMatrix(), this._currentSceneCamera.getProjectionMatrix(true));\r\n }\r\n scene.getEngine().setViewport(this._currentSceneCamera.viewport);\r\n }\r\n\r\n scene.resetCachedMaterial();\r\n }\r\n\r\n /**\r\n * Renders all the objects (meshes, particles systems, sprites) to the currently bound render target texture.\r\n * @param passIndex defines the pass index to use (default: 0)\r\n * @param skipOnAfterRenderObservable defines a flag to skip raising the onAfterRenderObservable\r\n */\r\n public render(passIndex = 0, skipOnAfterRenderObservable = false): void {\r\n const scene = this._scene;\r\n const engine = scene.getEngine();\r\n\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n\r\n engine.currentRenderPassId = this._renderPassIds[passIndex];\r\n\r\n this.onBeforeRenderObservable.notifyObservers(passIndex);\r\n\r\n const fastPath = engine.snapshotRendering && engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST;\r\n\r\n if (!fastPath) {\r\n // Get the list of meshes to render\r\n let currentRenderList: Nullable<Array<AbstractMesh>> = null;\r\n const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data;\r\n const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length;\r\n\r\n if (this.getCustomRenderList) {\r\n currentRenderList = this.getCustomRenderList(passIndex, defaultRenderList, defaultRenderListLength);\r\n }\r\n\r\n if (!currentRenderList) {\r\n // No custom render list provided, we prepare the rendering for the default list, but check\r\n // first if we did not already performed the preparation before so as to avoid re-doing it several times\r\n if (!this._defaultRenderListPrepared) {\r\n this._prepareRenderingManager(defaultRenderList, defaultRenderListLength, !this.renderList || this.forceLayerMaskCheck);\r\n this._defaultRenderListPrepared = true;\r\n }\r\n currentRenderList = defaultRenderList;\r\n } else {\r\n // Prepare the rendering for the custom render list provided\r\n this._prepareRenderingManager(currentRenderList, currentRenderList.length, this.forceLayerMaskCheck);\r\n }\r\n\r\n this.onBeforeRenderingManagerRenderObservable.notifyObservers(passIndex);\r\n\r\n this._renderingManager.render(this.customRenderFunction, currentRenderList, this.renderParticles, this.renderSprites);\r\n\r\n this.onAfterRenderingManagerRenderObservable.notifyObservers(passIndex);\r\n } else {\r\n this.onFastPathRenderObservable.notifyObservers(passIndex);\r\n }\r\n\r\n if (!skipOnAfterRenderObservable) {\r\n this.onAfterRenderObservable.notifyObservers(passIndex);\r\n }\r\n\r\n engine.currentRenderPassId = currentRenderPassId;\r\n }\r\n\r\n /** @internal */\r\n public _checkReadiness(): boolean {\r\n const scene = this._scene;\r\n const engine = scene.getEngine();\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n\r\n let returnValue = true;\r\n\r\n if (!scene.getViewMatrix()) {\r\n // We probably didn't execute scene.render() yet, so make sure we have a view/projection matrix setup for the scene\r\n scene.updateTransformMatrix();\r\n }\r\n\r\n const numPasses = this.options.numPasses;\r\n for (let passIndex = 0; passIndex < numPasses && returnValue; passIndex++) {\r\n let currentRenderList: Nullable<Array<AbstractMesh>> = null;\r\n const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data;\r\n const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length;\r\n\r\n engine.currentRenderPassId = this._renderPassIds[passIndex];\r\n\r\n this.onBeforeRenderObservable.notifyObservers(passIndex);\r\n\r\n if (this.getCustomRenderList) {\r\n currentRenderList = this.getCustomRenderList(passIndex, defaultRenderList, defaultRenderListLength);\r\n }\r\n\r\n if (!currentRenderList) {\r\n currentRenderList = defaultRenderList;\r\n }\r\n\r\n if (!this.options.doNotChangeAspectRatio) {\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n for (let i = 0; i < currentRenderList.length && returnValue; ++i) {\r\n const mesh = currentRenderList[i];\r\n\r\n if (!mesh.isEnabled() || mesh.isBlocked || !mesh.isVisible || !mesh.subMeshes) {\r\n continue;\r\n }\r\n\r\n if (this.customIsReadyFunction) {\r\n if (!this.customIsReadyFunction(mesh, this.refreshRate, true)) {\r\n returnValue = false;\r\n continue;\r\n }\r\n } else if (!mesh.isReady(true)) {\r\n returnValue = false;\r\n continue;\r\n }\r\n }\r\n\r\n this.onAfterRenderObservable.notifyObservers(passIndex);\r\n\r\n if (numPasses > 1) {\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n }\r\n }\r\n\r\n const particleSystems = this.particleSystemList || scene.particleSystems;\r\n for (const particleSystem of particleSystems) {\r\n if (!particleSystem.isReady()) {\r\n returnValue = false;\r\n }\r\n }\r\n\r\n engine.currentRenderPassId = currentRenderPassId;\r\n\r\n return returnValue;\r\n }\r\n\r\n private _prepareRenderingManager(currentRenderList: Array<AbstractMesh>, currentRenderListLength: number, checkLayerMask: boolean): void {\r\n const scene = this._scene;\r\n const camera = scene.activeCamera; // note that at this point, scene.activeCamera == this.activeCamera if defined, because initRender() has been called before\r\n const cameraForLOD = this.cameraForLOD ?? camera;\r\n\r\n this._renderingManager.reset();\r\n\r\n const sceneRenderId = scene.getRenderId();\r\n const currentFrameId = scene.getFrameId();\r\n for (let meshIndex = 0; meshIndex < currentRenderListLength; meshIndex++) {\r\n const mesh = currentRenderList[meshIndex];\r\n\r\n if (mesh && !mesh.isBlocked) {\r\n if (this.customIsReadyFunction) {\r\n if (!this.customIsReadyFunction(mesh, this.refreshRate, false)) {\r\n this.resetRefreshCounter();\r\n continue;\r\n }\r\n } else if (!mesh.isReady(this.refreshRate === 0)) {\r\n this.resetRefreshCounter();\r\n continue;\r\n }\r\n\r\n let meshToRender: Nullable<AbstractMesh> = null;\r\n\r\n if (cameraForLOD) {\r\n const meshToRenderAndFrameId = mesh._internalAbstractMeshDataInfo._currentLOD.get(cameraForLOD);\r\n if (!meshToRenderAndFrameId || meshToRenderAndFrameId[1] !== currentFrameId) {\r\n meshToRender = scene.customLODSelector ? scene.customLODSelector(mesh, cameraForLOD) : mesh.getLOD(cameraForLOD);\r\n if (!meshToRenderAndFrameId) {\r\n mesh._internalAbstractMeshDataInfo._currentLOD.set(cameraForLOD, [meshToRender, currentFrameId]);\r\n } else {\r\n meshToRenderAndFrameId[0] = meshToRender;\r\n meshToRenderAndFrameId[1] = currentFrameId;\r\n }\r\n } else {\r\n meshToRender = meshToRenderAndFrameId[0];\r\n }\r\n } else {\r\n meshToRender = mesh;\r\n }\r\n\r\n if (!meshToRender) {\r\n continue;\r\n }\r\n\r\n if (meshToRender !== mesh && meshToRender.billboardMode !== 0) {\r\n meshToRender.computeWorldMatrix(); // Compute world matrix if LOD is billboard\r\n }\r\n\r\n meshToRender._preActivateForIntermediateRendering(sceneRenderId);\r\n\r\n let isMasked;\r\n if (checkLayerMask && camera) {\r\n isMasked = (mesh.layerMask & camera.layerMask) === 0;\r\n } else {\r\n isMasked = false;\r\n }\r\n\r\n if (mesh.isEnabled() && mesh.isVisible && mesh.subMeshes && !isMasked) {\r\n if (meshToRender !== mesh) {\r\n meshToRender._activate(sceneRenderId, true);\r\n }\r\n if (mesh._activate(sceneRenderId, true) && mesh.subMeshes.length) {\r\n if (!mesh.isAnInstance) {\r\n meshToRender._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = false;\r\n } else {\r\n if (mesh._internalAbstractMeshDataInfo._actAsRegularMesh) {\r\n meshToRender = mesh;\r\n }\r\n }\r\n meshToRender._internalAbstractMeshDataInfo._isActiveIntermediate = true;\r\n\r\n scene._prepareSkeleton(meshToRender);\r\n\r\n for (let subIndex = 0; subIndex < meshToRender.subMeshes.length; subIndex++) {\r\n const subMesh = meshToRender.subMeshes[subIndex];\r\n this._renderingManager.dispatch(subMesh, meshToRender);\r\n }\r\n }\r\n\r\n mesh._postActivate();\r\n }\r\n }\r\n }\r\n\r\n const particleSystems = this.particleSystemList || scene.particleSystems;\r\n for (let particleIndex = 0; particleIndex < particleSystems.length; particleIndex++) {\r\n const particleSystem = particleSystems[particleIndex];\r\n\r\n const emitter: any = particleSystem.emitter;\r\n\r\n if (!particleSystem.isStarted() || !emitter || (emitter.position && !emitter.isEnabled())) {\r\n continue;\r\n }\r\n\r\n this._renderingManager.dispatchParticles(particleSystem);\r\n }\r\n }\r\n\r\n /**\r\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\r\n * This allowed control for front to back rendering or reversely depending of the special needs.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\r\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\r\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\r\n */\r\n public setRenderingOrder(\r\n renderingGroupId: number,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ): void {\r\n this._renderingManager.setRenderingOrder(renderingGroupId, opaqueSortCompareFn, alphaTestSortCompareFn, transparentSortCompareFn);\r\n }\r\n\r\n /**\r\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\r\n * @param depth Automatically clears depth between groups if true and autoClear is true.\r\n * @param stencil Automatically clears stencil between groups if true and autoClear is true.\r\n */\r\n public setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean, depth = true, stencil = true): void {\r\n this._renderingManager.setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil, depth, stencil);\r\n this._renderingManager._useSceneAutoClearSetup = false;\r\n }\r\n\r\n /**\r\n * Clones the renderer.\r\n * @returns the cloned renderer\r\n */\r\n public clone(): ObjectRenderer {\r\n const newRenderer = new ObjectRenderer(this.name, this._scene, this.options);\r\n\r\n if (this.renderList) {\r\n newRenderer.renderList = this.renderList.slice(0);\r\n }\r\n\r\n return newRenderer;\r\n }\r\n\r\n /**\r\n * Dispose the renderer and release its associated resources.\r\n */\r\n public dispose(): void {\r\n const renderList = this.renderList ? this.renderList : this._scene.getActiveMeshes().data;\r\n const renderListLength = this.renderList ? this.renderList.length : this._scene.getActiveMeshes().length;\r\n for (let i = 0; i < renderListLength; i++) {\r\n const mesh = renderList[i];\r\n if (mesh.getMaterialForRenderPass(this.renderPassId) !== undefined) {\r\n mesh.setMaterialForRenderPass(this.renderPassId, undefined);\r\n }\r\n }\r\n\r\n this.onBeforeRenderObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onBeforeRenderingManagerRenderObservable.clear();\r\n this.onAfterRenderingManagerRenderObservable.clear();\r\n this.onFastPathRenderObservable.clear();\r\n\r\n this._releaseRenderPassId();\r\n\r\n this.renderList = null;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this.refreshRate === ObjectRenderer.REFRESHRATE_RENDER_ONCE) {\r\n this.refreshRate = ObjectRenderer.REFRESHRATE_RENDER_ONCE;\r\n }\r\n }\r\n\r\n /**\r\n * Clear the info related to rendering groups preventing retention point in material dispose.\r\n */\r\n public freeRenderingGroups(): void {\r\n if (this._renderingManager) {\r\n this._renderingManager.freeRenderingGroups();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"objectRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Rendering/objectRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line import/no-internal-modules\r\nimport type { SmartArray, Nullable, Immutable, Camera, Scene, AbstractMesh, SubMesh, Material, IParticleSystem, InstancedMesh } from \"core/index\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { RenderingManager } from \"../Rendering/renderingManager\";\r\nimport { Constants } from \"../Engines/constants\";\r\nimport { _ObserveArray } from \"../Misc/arrayTools\";\r\n\r\n/**\r\n * Defines the options of the object renderer\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface ObjectRendererOptions {\r\n /** The number of passes the renderer will support (1 by default) */\r\n numPasses?: number;\r\n\r\n /** True (default) to not change the aspect ratio of the scene in the RTT */\r\n doNotChangeAspectRatio?: boolean;\r\n}\r\n\r\n/**\r\n * A class that renders objects to the currently bound render target.\r\n * This class only renders objects, and is not concerned with the output texture or post-processing.\r\n */\r\nexport class ObjectRenderer {\r\n /**\r\n * Objects will only be rendered once which can be useful to improve performance if everything in your render is static for instance.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONCE: number = 0;\r\n /**\r\n * Objects will be rendered every frame and is recommended for dynamic contents.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONEVERYFRAME: number = 1;\r\n /**\r\n * Objects will be rendered every 2 frames which could be enough if your dynamic objects are not\r\n * the central point of your effect and can save a lot of performances.\r\n */\r\n public static readonly REFRESHRATE_RENDER_ONEVERYTWOFRAMES: number = 2;\r\n\r\n /**\r\n * Use this predicate to dynamically define the list of mesh you want to render.\r\n * If set, the renderList property will be overwritten.\r\n */\r\n public renderListPredicate: (AbstractMesh: AbstractMesh) => boolean;\r\n\r\n private _renderList: Nullable<Array<AbstractMesh>>;\r\n private _unObserveRenderList: Nullable<() => void> = null;\r\n\r\n /**\r\n * Use this list to define the list of mesh you want to render.\r\n */\r\n public get renderList(): Nullable<Array<AbstractMesh>> {\r\n return this._renderList;\r\n }\r\n\r\n public set renderList(value: Nullable<Array<AbstractMesh>>) {\r\n if (this._renderList === value) {\r\n return;\r\n }\r\n if (this._unObserveRenderList) {\r\n this._unObserveRenderList();\r\n this._unObserveRenderList = null;\r\n }\r\n\r\n if (value) {\r\n this._unObserveRenderList = _ObserveArray(value, this._renderListHasChanged);\r\n }\r\n\r\n this._renderList = value;\r\n }\r\n\r\n private _renderListHasChanged = (_functionName: string, previousLength: number) => {\r\n const newLength = this._renderList ? this._renderList.length : 0;\r\n if ((previousLength === 0 && newLength > 0) || newLength === 0) {\r\n for (const mesh of this._scene.meshes) {\r\n mesh._markSubMeshesAsLightDirty();\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Define the list of particle systems to render. If not provided, will render all the particle systems of the scene.\r\n * Note that the particle systems are rendered only if renderParticles is set to true.\r\n */\r\n public particleSystemList: Nullable<Array<IParticleSystem>> = null;\r\n\r\n /**\r\n * Use this function to overload the renderList array at rendering time.\r\n * Return null to render with the current renderList, else return the list of meshes to use for rendering.\r\n * For 2DArray, layerOrFace is the index of the layer that is going to be rendered, else it is the faceIndex of\r\n * the cube (if the RTT is a cube, else layerOrFace=0).\r\n * The renderList passed to the function is the current render list (the one that will be used if the function returns null).\r\n * The length of this list is passed through renderListLength: don't use renderList.length directly because the array can\r\n * hold dummy elements!\r\n */\r\n public getCustomRenderList: Nullable<(layerOrFace: number, renderList: Nullable<Immutable<Array<AbstractMesh>>>, renderListLength: number) => Nullable<Array<AbstractMesh>>> =\r\n null;\r\n\r\n /**\r\n * Define if particles should be rendered.\r\n */\r\n public renderParticles = true;\r\n\r\n /**\r\n * Define if sprites should be rendered.\r\n */\r\n public renderSprites = false;\r\n\r\n /**\r\n * Force checking the layerMask property even if a custom list of meshes is provided (ie. if renderList is not undefined)\r\n */\r\n public forceLayerMaskCheck = false;\r\n\r\n /**\r\n * Define the camera used to render the objects.\r\n */\r\n public activeCamera: Nullable<Camera>;\r\n\r\n /**\r\n * Define the camera used to calculate the LOD of the objects.\r\n * If not defined, activeCamera will be used. If not defined nor activeCamera, scene's active camera will be used.\r\n */\r\n public cameraForLOD: Nullable<Camera>;\r\n\r\n private _disableImageProcessing = false;\r\n /**\r\n * If true, the object renderer will render all objects without any image processing applied.\r\n * If false (default value), the renderer will use the current setting of the scene's image processing configuration.\r\n */\r\n public get disableImageProcessing() {\r\n return this._disableImageProcessing;\r\n }\r\n\r\n public set disableImageProcessing(value: boolean) {\r\n if (value === this._disableImageProcessing) {\r\n return;\r\n }\r\n\r\n this._disableImageProcessing = value;\r\n this._scene.markAllMaterialsAsDirty(Constants.MATERIAL_ImageProcessingDirtyFlag);\r\n }\r\n\r\n /**\r\n * Override the mesh isReady function with your own one.\r\n */\r\n public customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => boolean;\r\n\r\n /**\r\n * Override the render function with your own one.\r\n */\r\n public customRenderFunction: (\r\n opaqueSubMeshes: SmartArray<SubMesh>,\r\n alphaTestSubMeshes: SmartArray<SubMesh>,\r\n transparentSubMeshes: SmartArray<SubMesh>,\r\n depthOnlySubMeshes: SmartArray<SubMesh>,\r\n beforeTransparents?: () => void\r\n ) => void;\r\n\r\n /**\r\n * An event triggered before rendering the objects\r\n */\r\n public readonly onBeforeRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered after rendering the objects\r\n */\r\n public readonly onAfterRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered before the rendering group is processed\r\n */\r\n public readonly onBeforeRenderingManagerRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered after the rendering group is processed\r\n */\r\n public readonly onAfterRenderingManagerRenderObservable = new Observable<number>();\r\n\r\n /**\r\n * An event triggered when fast path rendering is used\r\n */\r\n public readonly onFastPathRenderObservable = new Observable<number>();\r\n\r\n protected _scene: Scene;\r\n /** @internal */\r\n public _renderingManager: RenderingManager;\r\n /** @internal */\r\n public _waitingRenderList?: string[];\r\n protected _currentRefreshId = -1;\r\n protected _refreshRate = 1;\r\n protected _currentApplyByPostProcessSetting = false;\r\n\r\n /**\r\n * The options used by the object renderer\r\n */\r\n public options: Required<ObjectRendererOptions>;\r\n\r\n private _name: string;\r\n /**\r\n * Friendly name of the object renderer\r\n */\r\n public get name() {\r\n return this._name;\r\n }\r\n\r\n public set name(value: string) {\r\n if (this._name === value) {\r\n return;\r\n }\r\n\r\n this._name = value;\r\n\r\n if (!this._scene) {\r\n return;\r\n }\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n for (let i = 0; i < this._renderPassIds.length; ++i) {\r\n const renderPassId = this._renderPassIds[i];\r\n engine._renderPassNames[renderPassId] = `${this._name}#${i}`;\r\n }\r\n }\r\n\r\n /**\r\n * Current render pass id. Note it can change over the rendering as there's a separate id for each face of a cube / each layer of an array layer!\r\n */\r\n public renderPassId: number;\r\n private readonly _renderPassIds: number[];\r\n /**\r\n * Gets the render pass ids used by the object renderer.\r\n */\r\n public get renderPassIds(): readonly number[] {\r\n return this._renderPassIds;\r\n }\r\n\r\n /**\r\n * Gets the current value of the refreshId counter\r\n */\r\n public get currentRefreshId() {\r\n return this._currentRefreshId;\r\n }\r\n\r\n /**\r\n * Sets a specific material to be used to render a mesh/a list of meshes with this object renderer\r\n * @param mesh mesh or array of meshes\r\n * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering pass.\r\n */\r\n public setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material | Material[]): void {\r\n let meshes;\r\n if (!Array.isArray(mesh)) {\r\n meshes = [mesh];\r\n } else {\r\n meshes = mesh;\r\n }\r\n for (let j = 0; j < meshes.length; ++j) {\r\n for (let i = 0; i < this.options.numPasses; ++i) {\r\n let mesh = meshes[j];\r\n if (meshes[j].isAnInstance) {\r\n mesh = (meshes[j] as InstancedMesh).sourceMesh;\r\n }\r\n mesh.setMaterialForRenderPass(this._renderPassIds[i], material !== undefined ? (Array.isArray(material) ? material[i] : material) : undefined);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates an object renderer.\r\n * @param name The friendly name of the object renderer\r\n * @param scene The scene the renderer belongs to\r\n * @param options The options used to create the renderer (optional)\r\n */\r\n constructor(name: string, scene: Scene, options?: ObjectRendererOptions) {\r\n this.name = name;\r\n this._scene = scene;\r\n\r\n this.renderList = [] as AbstractMesh[];\r\n this._renderPassIds = [];\r\n\r\n this.options = {\r\n numPasses: 1,\r\n doNotChangeAspectRatio: true,\r\n ...options,\r\n };\r\n\r\n this._createRenderPassId();\r\n\r\n this.renderPassId = this._renderPassIds[0];\r\n\r\n // Rendering groups\r\n this._renderingManager = new RenderingManager(scene);\r\n this._renderingManager._useSceneAutoClearSetup = true;\r\n }\r\n\r\n private _releaseRenderPassId(): void {\r\n const engine = this._scene.getEngine();\r\n for (let i = 0; i < this.options.numPasses; ++i) {\r\n engine.releaseRenderPassId(this._renderPassIds[i]);\r\n }\r\n this._renderPassIds.length = 0;\r\n }\r\n\r\n private _createRenderPassId(): void {\r\n this._releaseRenderPassId();\r\n\r\n const engine = this._scene.getEngine();\r\n\r\n for (let i = 0; i < this.options.numPasses; ++i) {\r\n this._renderPassIds[i] = engine.createRenderPassId(`${this.name}#${i}`);\r\n }\r\n }\r\n\r\n /**\r\n * Resets the refresh counter of the renderer and start back from scratch.\r\n * Could be useful to re-render if it is setup to render only once.\r\n */\r\n public resetRefreshCounter(): void {\r\n this._currentRefreshId = -1;\r\n }\r\n\r\n /**\r\n * Defines the refresh rate of the rendering or the rendering frequency.\r\n * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...\r\n */\r\n public get refreshRate(): number {\r\n return this._refreshRate;\r\n }\r\n public set refreshRate(value: number) {\r\n this._refreshRate = value;\r\n this.resetRefreshCounter();\r\n }\r\n\r\n /**\r\n * Indicates if the renderer should render the current frame.\r\n * The output is based on the specified refresh rate.\r\n * @returns true if the renderer should render the current frame\r\n */\r\n public shouldRender(): boolean {\r\n if (this._currentRefreshId === -1) {\r\n // At least render once\r\n this._currentRefreshId = 1;\r\n return true;\r\n }\r\n\r\n if (this.refreshRate === this._currentRefreshId) {\r\n this._currentRefreshId = 1;\r\n return true;\r\n }\r\n\r\n this._currentRefreshId++;\r\n return false;\r\n }\r\n\r\n /**\r\n * This function will check if the renderer is ready to render (textures are loaded, shaders are compiled)\r\n * @param viewportWidth defines the width of the viewport\r\n * @param viewportHeight defines the height of the viewport\r\n * @returns true if all required resources are ready\r\n */\r\n public isReadyForRendering(viewportWidth: number, viewportHeight: number): boolean {\r\n this.prepareRenderList();\r\n this.initRender(viewportWidth, viewportHeight);\r\n\r\n const isReady = this._checkReadiness();\r\n\r\n this.finishRender();\r\n\r\n return isReady;\r\n }\r\n\r\n /**\r\n * Makes sure the list of meshes is ready to be rendered\r\n * You should call this function before \"initRender\", but if you know the render list is ok, you may call \"initRender\" directly\r\n */\r\n public prepareRenderList(): void {\r\n const scene = this._scene;\r\n\r\n if (this._waitingRenderList) {\r\n if (!this.renderListPredicate) {\r\n this.renderList = [];\r\n for (let index = 0; index < this._waitingRenderList.length; index++) {\r\n const id = this._waitingRenderList[index];\r\n const mesh = scene.getMeshById(id);\r\n if (mesh) {\r\n this.renderList.push(mesh);\r\n }\r\n }\r\n }\r\n this._waitingRenderList = undefined;\r\n }\r\n\r\n // Is predicate defined?\r\n if (this.renderListPredicate) {\r\n if (this.renderList) {\r\n this.renderList.length = 0; // Clear previous renderList\r\n } else {\r\n this.renderList = [];\r\n }\r\n\r\n const sceneMeshes = this._scene.meshes;\r\n\r\n for (let index = 0; index < sceneMeshes.length; index++) {\r\n const mesh = sceneMeshes[index];\r\n if (this.renderListPredicate(mesh)) {\r\n this.renderList.push(mesh);\r\n }\r\n }\r\n }\r\n\r\n this._currentApplyByPostProcessSetting = this._scene.imageProcessingConfiguration.applyByPostProcess;\r\n if (this._disableImageProcessing) {\r\n // we do not use the applyByPostProcess setter to avoid flagging all the materials as \"image processing dirty\"!\r\n this._scene.imageProcessingConfiguration._applyByPostProcess = this._disableImageProcessing;\r\n }\r\n }\r\n\r\n private _defaultRenderListPrepared: boolean;\r\n private _currentSceneCamera: Nullable<Camera> = null;\r\n\r\n /**\r\n * This method makes sure everything is setup before \"render\" can be called\r\n * @param viewportWidth Width of the viewport to render to\r\n * @param viewportHeight Height of the viewport to render to\r\n */\r\n public initRender(viewportWidth: number, viewportHeight: number): void {\r\n const engine = this._scene.getEngine();\r\n const camera: Nullable<Camera> = this.activeCamera ?? this._scene.activeCamera;\r\n\r\n this._currentSceneCamera = this._scene.activeCamera;\r\n\r\n if (camera) {\r\n if (camera !== this._scene.activeCamera) {\r\n this._scene.setTransformMatrix(camera.getViewMatrix(), camera.getProjectionMatrix(true));\r\n this._scene.activeCamera = camera;\r\n }\r\n engine.setViewport(camera.rigParent ? camera.rigParent.viewport : camera.viewport, viewportWidth, viewportHeight);\r\n }\r\n\r\n this._defaultRenderListPrepared = false;\r\n }\r\n\r\n /**\r\n * This method must be called after the \"render\" call(s), to complete the rendering process.\r\n */\r\n public finishRender() {\r\n const scene = this._scene;\r\n\r\n if (this._disableImageProcessing) {\r\n scene.imageProcessingConfiguration._applyByPostProcess = this._currentApplyByPostProcessSetting;\r\n }\r\n\r\n scene.activeCamera = this._currentSceneCamera;\r\n if (this._currentSceneCamera) {\r\n if (this.activeCamera && this.activeCamera !== scene.activeCamera) {\r\n scene.setTransformMatrix(this._currentSceneCamera.getViewMatrix(), this._currentSceneCamera.getProjectionMatrix(true));\r\n }\r\n scene.getEngine().setViewport(this._currentSceneCamera.viewport);\r\n }\r\n\r\n scene.resetCachedMaterial();\r\n }\r\n\r\n /**\r\n * Renders all the objects (meshes, particles systems, sprites) to the currently bound render target texture.\r\n * @param passIndex defines the pass index to use (default: 0)\r\n * @param skipOnAfterRenderObservable defines a flag to skip raising the onAfterRenderObservable\r\n */\r\n public render(passIndex = 0, skipOnAfterRenderObservable = false): void {\r\n const scene = this._scene;\r\n const engine = scene.getEngine();\r\n\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n\r\n engine.currentRenderPassId = this._renderPassIds[passIndex];\r\n\r\n this.onBeforeRenderObservable.notifyObservers(passIndex);\r\n\r\n const fastPath = engine.snapshotRendering && engine.snapshotRenderingMode === Constants.SNAPSHOTRENDERING_FAST;\r\n\r\n if (!fastPath) {\r\n // Get the list of meshes to render\r\n let currentRenderList: Nullable<Array<AbstractMesh>> = null;\r\n const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data;\r\n const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length;\r\n\r\n if (this.getCustomRenderList) {\r\n currentRenderList = this.getCustomRenderList(passIndex, defaultRenderList, defaultRenderListLength);\r\n }\r\n\r\n if (!currentRenderList) {\r\n // No custom render list provided, we prepare the rendering for the default list, but check\r\n // first if we did not already performed the preparation before so as to avoid re-doing it several times\r\n if (!this._defaultRenderListPrepared) {\r\n this._prepareRenderingManager(defaultRenderList, defaultRenderListLength, !this.renderList || this.forceLayerMaskCheck);\r\n this._defaultRenderListPrepared = true;\r\n }\r\n currentRenderList = defaultRenderList;\r\n } else {\r\n // Prepare the rendering for the custom render list provided\r\n this._prepareRenderingManager(currentRenderList, currentRenderList.length, this.forceLayerMaskCheck);\r\n }\r\n\r\n this.onBeforeRenderingManagerRenderObservable.notifyObservers(passIndex);\r\n\r\n this._renderingManager.render(this.customRenderFunction, currentRenderList, this.renderParticles, this.renderSprites);\r\n\r\n this.onAfterRenderingManagerRenderObservable.notifyObservers(passIndex);\r\n } else {\r\n this.onFastPathRenderObservable.notifyObservers(passIndex);\r\n }\r\n\r\n if (!skipOnAfterRenderObservable) {\r\n this.onAfterRenderObservable.notifyObservers(passIndex);\r\n }\r\n\r\n engine.currentRenderPassId = currentRenderPassId;\r\n }\r\n\r\n /** @internal */\r\n public _checkReadiness(): boolean {\r\n const scene = this._scene;\r\n const engine = scene.getEngine();\r\n const currentRenderPassId = engine.currentRenderPassId;\r\n\r\n let returnValue = true;\r\n\r\n if (!scene.getViewMatrix()) {\r\n // We probably didn't execute scene.render() yet, so make sure we have a view/projection matrix setup for the scene\r\n scene.updateTransformMatrix();\r\n }\r\n\r\n const numPasses = this.options.numPasses;\r\n for (let passIndex = 0; passIndex < numPasses && returnValue; passIndex++) {\r\n let currentRenderList: Nullable<Array<AbstractMesh>> = null;\r\n const defaultRenderList = this.renderList ? this.renderList : scene.getActiveMeshes().data;\r\n const defaultRenderListLength = this.renderList ? this.renderList.length : scene.getActiveMeshes().length;\r\n\r\n engine.currentRenderPassId = this._renderPassIds[passIndex];\r\n\r\n this.onBeforeRenderObservable.notifyObservers(passIndex);\r\n\r\n if (this.getCustomRenderList) {\r\n currentRenderList = this.getCustomRenderList(passIndex, defaultRenderList, defaultRenderListLength);\r\n }\r\n\r\n if (!currentRenderList) {\r\n currentRenderList = defaultRenderList;\r\n }\r\n\r\n if (!this.options.doNotChangeAspectRatio) {\r\n scene.updateTransformMatrix(true);\r\n }\r\n\r\n for (let i = 0; i < currentRenderList.length && returnValue; ++i) {\r\n const mesh = currentRenderList[i];\r\n\r\n if (!mesh.isEnabled() || mesh.isBlocked || !mesh.isVisible || !mesh.subMeshes) {\r\n continue;\r\n }\r\n\r\n if (this.customIsReadyFunction) {\r\n if (!this.customIsReadyFunction(mesh, this.refreshRate, true)) {\r\n returnValue = false;\r\n continue;\r\n }\r\n } else if (!mesh.isReady(true)) {\r\n returnValue = false;\r\n continue;\r\n }\r\n }\r\n\r\n this.onAfterRenderObservable.notifyObservers(passIndex);\r\n\r\n if (numPasses > 1) {\r\n scene.incrementRenderId();\r\n scene.resetCachedMaterial();\r\n }\r\n }\r\n\r\n const particleSystems = this.particleSystemList || scene.particleSystems;\r\n for (const particleSystem of particleSystems) {\r\n if (!particleSystem.isReady()) {\r\n returnValue = false;\r\n }\r\n }\r\n\r\n engine.currentRenderPassId = currentRenderPassId;\r\n\r\n return returnValue;\r\n }\r\n\r\n private _prepareRenderingManager(currentRenderList: Array<AbstractMesh>, currentRenderListLength: number, checkLayerMask: boolean): void {\r\n const scene = this._scene;\r\n const camera = scene.activeCamera; // note that at this point, scene.activeCamera == this.activeCamera if defined, because initRender() has been called before\r\n const cameraForLOD = this.cameraForLOD ?? camera;\r\n\r\n this._renderingManager.reset();\r\n\r\n const sceneRenderId = scene.getRenderId();\r\n const currentFrameId = scene.getFrameId();\r\n for (let meshIndex = 0; meshIndex < currentRenderListLength; meshIndex++) {\r\n const mesh = currentRenderList[meshIndex];\r\n\r\n if (mesh && !mesh.isBlocked) {\r\n if (this.customIsReadyFunction) {\r\n if (!this.customIsReadyFunction(mesh, this.refreshRate, false)) {\r\n this.resetRefreshCounter();\r\n continue;\r\n }\r\n } else if (!mesh.isReady(this.refreshRate === 0)) {\r\n this.resetRefreshCounter();\r\n continue;\r\n }\r\n\r\n let meshToRender: Nullable<AbstractMesh> = null;\r\n\r\n if (cameraForLOD) {\r\n const meshToRenderAndFrameId = mesh._internalAbstractMeshDataInfo._currentLOD.get(cameraForLOD);\r\n if (!meshToRenderAndFrameId || meshToRenderAndFrameId[1] !== currentFrameId) {\r\n meshToRender = scene.customLODSelector ? scene.customLODSelector(mesh, cameraForLOD) : mesh.getLOD(cameraForLOD);\r\n if (!meshToRenderAndFrameId) {\r\n mesh._internalAbstractMeshDataInfo._currentLOD.set(cameraForLOD, [meshToRender, currentFrameId]);\r\n } else {\r\n meshToRenderAndFrameId[0] = meshToRender;\r\n meshToRenderAndFrameId[1] = currentFrameId;\r\n }\r\n } else {\r\n meshToRender = meshToRenderAndFrameId[0];\r\n }\r\n } else {\r\n meshToRender = mesh;\r\n }\r\n\r\n if (!meshToRender) {\r\n continue;\r\n }\r\n\r\n if (meshToRender !== mesh && meshToRender.billboardMode !== 0) {\r\n meshToRender.computeWorldMatrix(); // Compute world matrix if LOD is billboard\r\n }\r\n\r\n meshToRender._preActivateForIntermediateRendering(sceneRenderId);\r\n\r\n let isMasked;\r\n if (checkLayerMask && camera) {\r\n isMasked = (mesh.layerMask & camera.layerMask) === 0;\r\n } else {\r\n isMasked = false;\r\n }\r\n\r\n if (mesh.isEnabled() && mesh.isVisible && mesh.subMeshes && !isMasked) {\r\n if (meshToRender !== mesh) {\r\n meshToRender._activate(sceneRenderId, true);\r\n }\r\n if (mesh._activate(sceneRenderId, true) && mesh.subMeshes.length) {\r\n if (!mesh.isAnInstance) {\r\n meshToRender._internalAbstractMeshDataInfo._onlyForInstancesIntermediate = false;\r\n } else {\r\n if (mesh._internalAbstractMeshDataInfo._actAsRegularMesh) {\r\n meshToRender = mesh;\r\n }\r\n }\r\n meshToRender._internalAbstractMeshDataInfo._isActiveIntermediate = true;\r\n\r\n scene._prepareSkeleton(meshToRender);\r\n\r\n for (let subIndex = 0; subIndex < meshToRender.subMeshes.length; subIndex++) {\r\n const subMesh = meshToRender.subMeshes[subIndex];\r\n this._renderingManager.dispatch(subMesh, meshToRender);\r\n }\r\n }\r\n\r\n mesh._postActivate();\r\n }\r\n }\r\n }\r\n\r\n const particleSystems = this.particleSystemList || scene.particleSystems;\r\n for (let particleIndex = 0; particleIndex < particleSystems.length; particleIndex++) {\r\n const particleSystem = particleSystems[particleIndex];\r\n\r\n const emitter: any = particleSystem.emitter;\r\n\r\n if (!particleSystem.isStarted() || !emitter || (emitter.position && !emitter.isEnabled())) {\r\n continue;\r\n }\r\n\r\n this._renderingManager.dispatchParticles(particleSystem);\r\n }\r\n }\r\n\r\n /**\r\n * Overrides the default sort function applied in the rendering group to prepare the meshes.\r\n * This allowed control for front to back rendering or reversely depending of the special needs.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param opaqueSortCompareFn The opaque queue comparison function use to sort.\r\n * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.\r\n * @param transparentSortCompareFn The transparent queue comparison function use to sort.\r\n */\r\n public setRenderingOrder(\r\n renderingGroupId: number,\r\n opaqueSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n alphaTestSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null,\r\n transparentSortCompareFn: Nullable<(a: SubMesh, b: SubMesh) => number> = null\r\n ): void {\r\n this._renderingManager.setRenderingOrder(renderingGroupId, opaqueSortCompareFn, alphaTestSortCompareFn, transparentSortCompareFn);\r\n }\r\n\r\n /**\r\n * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.\r\n *\r\n * @param renderingGroupId The rendering group id corresponding to its index\r\n * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.\r\n * @param depth Automatically clears depth between groups if true and autoClear is true.\r\n * @param stencil Automatically clears stencil between groups if true and autoClear is true.\r\n */\r\n public setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean, depth = true, stencil = true): void {\r\n this._renderingManager.setRenderingAutoClearDepthStencil(renderingGroupId, autoClearDepthStencil, depth, stencil);\r\n this._renderingManager._useSceneAutoClearSetup = false;\r\n }\r\n\r\n /**\r\n * Clones the renderer.\r\n * @returns the cloned renderer\r\n */\r\n public clone(): ObjectRenderer {\r\n const newRenderer = new ObjectRenderer(this.name, this._scene, this.options);\r\n\r\n if (this.renderList) {\r\n newRenderer.renderList = this.renderList.slice(0);\r\n }\r\n\r\n return newRenderer;\r\n }\r\n\r\n /**\r\n * Dispose the renderer and release its associated resources.\r\n */\r\n public dispose(): void {\r\n const renderList = this.renderList ? this.renderList : this._scene.getActiveMeshes().data;\r\n const renderListLength = this.renderList ? this.renderList.length : this._scene.getActiveMeshes().length;\r\n for (let i = 0; i < renderListLength; i++) {\r\n const mesh = renderList[i];\r\n if (mesh && mesh.getMaterialForRenderPass(this.renderPassId) !== undefined) {\r\n mesh.setMaterialForRenderPass(this.renderPassId, undefined);\r\n }\r\n }\r\n\r\n this.onBeforeRenderObservable.clear();\r\n this.onAfterRenderObservable.clear();\r\n this.onBeforeRenderingManagerRenderObservable.clear();\r\n this.onAfterRenderingManagerRenderObservable.clear();\r\n this.onFastPathRenderObservable.clear();\r\n\r\n this._releaseRenderPassId();\r\n\r\n this.renderList = null;\r\n }\r\n\r\n /** @internal */\r\n public _rebuild(): void {\r\n if (this.refreshRate === ObjectRenderer.REFRESHRATE_RENDER_ONCE) {\r\n this.refreshRate = ObjectRenderer.REFRESHRATE_RENDER_ONCE;\r\n }\r\n }\r\n\r\n /**\r\n * Clear the info related to rendering groups preventing retention point in material dispose.\r\n */\r\n public freeRenderingGroups(): void {\r\n if (this._renderingManager) {\r\n this._renderingManager.freeRenderingGroups();\r\n }\r\n }\r\n}\r\n"]}
@@ -88,10 +88,14 @@ info.diffuse=computeDiffuseLighting(preInfo,diffuse{X}.rgb);
88
88
  #if AREALIGHT{X}
89
89
  info.specular=computeAreaSpecularLighting(preInfo,light{X}.vLightSpecular.rgb);
90
90
  #else
91
+ fresnel=fresnelSchlickGGX(preInfo.VdotH,vec3(reflectanceF0),specularEnvironmentR90);coloredFresnel=fresnelSchlickGGX(preInfo.VdotH,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90);
92
+ #ifndef LEGACY_SPECULAR_ENERGY_CONSERVATION
93
+ info.diffuse*=(1.0-fresnel);
94
+ #endif
91
95
  #ifdef ANISOTROPIC
92
96
  info.specular=computeAnisotropicSpecularLighting(preInfo,viewDirectionW,normalW,anisotropicOut.anisotropicTangent,anisotropicOut.anisotropicBitangent,anisotropicOut.anisotropy,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,diffuse{X}.rgb);
93
97
  #else
94
- info.specular=computeSpecularLighting(preInfo,normalW,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,diffuse{X}.rgb,vReflectivityColor.b);
98
+ info.specular=computeSpecularLighting(preInfo,normalW,clearcoatOut.specularEnvironmentR0,coloredFresnel,AARoughnessFactors.x,diffuse{X}.rgb);
95
99
  #endif
96
100
  #endif
97
101
  #endif
@@ -1 +1 @@
1
- {"version":3,"file":"lightFragment.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/lightFragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,eAAe,CAAC;AAC7B,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgUd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightFragment\";\nconst shader = `#ifdef LIGHT{X}\n#if defined(SHADOWONLY) || defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) && defined(LIGHTMAPNOSPECULAR{X})\n#else\nvec4 diffuse{X}=light{X}.vLightDiffuse;\n#define CUSTOM_LIGHT{X}_COLOR \n#ifdef PBR\n#ifdef SPOTLIGHT{X}\npreInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW,vPositionW);\n#elif defined(POINTLIGHT{X})\npreInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW,vPositionW);\n#elif defined(HEMILIGHT{X})\npreInfo=computeHemisphericPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(DIRLIGHT{X})\npreInfo=computeDirectionalPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(AREALIGHT{X}) && defined(AREALIGHTSUPPORTED)\npreInfo=computeAreaPreLightingInfo(areaLightsLTC1Sampler,areaLightsLTC2Sampler,viewDirectionW,normalW,vPositionW,light{X}.vLightData,light{X}.vLightWidth.xyz,light{X}.vLightHeight.xyz,roughness);\n#endif\npreInfo.NdotV=NdotV;\n#ifdef SPOTLIGHT{X}\n#ifdef LIGHT_FALLOFF_GLTF{X}\npreInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);\n#ifdef IESLIGHTTEXTURE{X}\npreInfo.attenuation*=computeDirectionalLightFalloff_IES(light{X}.vLightDirection.xyz,preInfo.L,iesLightTexture{X});\n#else\npreInfo.attenuation*=computeDirectionalLightFalloff_GLTF(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);\n#endif\n#elif defined(LIGHT_FALLOFF_PHYSICAL{X})\npreInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);\n#ifdef IESLIGHTTEXTURE{X}\npreInfo.attenuation*=computeDirectionalLightFalloff_IES(light{X}.vLightDirection.xyz,preInfo.L,iesLightTexture{X});\n#else\npreInfo.attenuation*=computeDirectionalLightFalloff_Physical(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w);\n#endif\n#elif defined(LIGHT_FALLOFF_STANDARD{X})\npreInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);\n#ifdef IESLIGHTTEXTURE{X}\npreInfo.attenuation*=computeDirectionalLightFalloff_IES(light{X}.vLightDirection.xyz,preInfo.L,iesLightTexture{X});\n#else\npreInfo.attenuation*=computeDirectionalLightFalloff_Standard(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w);\n#endif\n#else\npreInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);\n#ifdef IESLIGHTTEXTURE{X}\npreInfo.attenuation*=computeDirectionalLightFalloff_IES(light{X}.vLightDirection.xyz,preInfo.L,iesLightTexture{X});\n#else\npreInfo.attenuation*=computeDirectionalLightFalloff(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);\n#endif\n#endif\n#elif defined(POINTLIGHT{X})\n#ifdef LIGHT_FALLOFF_GLTF{X}\npreInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);\n#elif defined(LIGHT_FALLOFF_PHYSICAL{X})\npreInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);\n#elif defined(LIGHT_FALLOFF_STANDARD{X})\npreInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);\n#else\npreInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);\n#endif\n#else\npreInfo.attenuation=1.0;\n#endif\n#if defined(HEMILIGHT{X}) || defined(AREALIGHT{X})\npreInfo.roughness=roughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(roughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\npreInfo.diffuseRoughness=diffuseRoughness;preInfo.surfaceAlbedo=surfaceAlbedo;\n#ifdef IRIDESCENCE\npreInfo.iridescenceIntensity=iridescenceIntensity;\n#endif\n#ifdef HEMILIGHT{X}\ninfo.diffuse=computeHemisphericDiffuseLighting(preInfo,diffuse{X}.rgb,light{X}.vLightGround);\n#elif defined(AREALIGHT{X})\ninfo.diffuse=computeAreaDiffuseLighting(preInfo,diffuse{X}.rgb);\n#elif defined(SS_TRANSLUCENCY)\n#ifndef SS_TRANSLUCENCY_LEGACY\ninfo.diffuse=computeDiffuseLighting(preInfo,diffuse{X}.rgb)*(1.0-subSurfaceOut.translucencyIntensity);info.diffuseTransmission=computeDiffuseTransmittedLighting(preInfo,diffuse{X}.rgb,subSurfaceOut.transmittance); \n#else\ninfo.diffuse=computeDiffuseTransmittedLighting(preInfo,diffuse{X}.rgb,subSurfaceOut.transmittance);info.diffuseTransmission=vec3(0.0);\n#endif\n#else\ninfo.diffuse=computeDiffuseLighting(preInfo,diffuse{X}.rgb);\n#endif\n#ifdef SPECULARTERM\n#if AREALIGHT{X}\ninfo.specular=computeAreaSpecularLighting(preInfo,light{X}.vLightSpecular.rgb);\n#else\n#ifdef ANISOTROPIC\ninfo.specular=computeAnisotropicSpecularLighting(preInfo,viewDirectionW,normalW,anisotropicOut.anisotropicTangent,anisotropicOut.anisotropicBitangent,anisotropicOut.anisotropy,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,diffuse{X}.rgb);\n#else\ninfo.specular=computeSpecularLighting(preInfo,normalW,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,diffuse{X}.rgb,vReflectivityColor.b);\n#endif\n#endif\n#endif\n#ifndef AREALIGHT{X}\n#ifdef SHEEN\n#ifdef SHEEN_LINKWITHALBEDO\npreInfo.roughness=sheenOut.sheenIntensity;\n#else\n#ifdef HEMILIGHT{X}\npreInfo.roughness=sheenOut.sheenRoughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(sheenOut.sheenRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\n#endif\ninfo.sheen=computeSheenLighting(preInfo,normalW,sheenOut.sheenColor,specularEnvironmentR90,AARoughnessFactors.x,diffuse{X}.rgb);\n#endif\n#ifdef CLEARCOAT\n#ifdef HEMILIGHT{X}\npreInfo.roughness=clearcoatOut.clearCoatRoughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(clearcoatOut.clearCoatRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\ninfo.clearCoat=computeClearCoatLighting(preInfo,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatAARoughnessFactors.x,clearcoatOut.clearCoatIntensity,diffuse{X}.rgb);\n#ifdef CLEARCOAT_TINT\nabsorption=computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract,preInfo.L,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatColor,clearcoatOut.clearCoatThickness,clearcoatOut.clearCoatIntensity);info.diffuse*=absorption;\n#ifdef SS_TRANSLUCENCY\ninfo.diffuseTransmission*=absorption;\n#endif\n#ifdef SPECULARTERM\ninfo.specular*=absorption;\n#endif\n#endif\ninfo.diffuse*=info.clearCoat.w;\n#ifdef SS_TRANSLUCENCY\ninfo.diffuseTransmission*=info.clearCoat.w;\n#endif\n#ifdef SPECULARTERM\ninfo.specular*=info.clearCoat.w;\n#endif\n#ifdef SHEEN\ninfo.sheen*=info.clearCoat.w;\n#endif\n#endif\n#endif\n#else\n#ifdef SPOTLIGHT{X}\n#ifdef IESLIGHTTEXTURE{X}\ninfo=computeIESSpotLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDirection,diffuse{X}.rgb,light{X}.vLightSpecular.rgb,diffuse{X}.a,glossiness,iesLightTexture{X});\n#else\ninfo=computeSpotLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDirection,diffuse{X}.rgb,light{X}.vLightSpecular.rgb,diffuse{X}.a,glossiness);\n#endif\n#elif defined(HEMILIGHT{X})\ninfo=computeHemisphericLighting(viewDirectionW,normalW,light{X}.vLightData,diffuse{X}.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightGround,glossiness);\n#elif defined(POINTLIGHT{X}) || defined(DIRLIGHT{X})\ninfo=computeLighting(viewDirectionW,normalW,light{X}.vLightData,diffuse{X}.rgb,light{X}.vLightSpecular.rgb,diffuse{X}.a,glossiness);\n#elif defined(AREALIGHT{X}) && defined(AREALIGHTSUPPORTED)\ninfo=computeAreaLighting(areaLightsLTC1Sampler,areaLightsLTC2Sampler,viewDirectionW,normalW,vPositionW,light{X}.vLightData.xyz,light{X}.vLightWidth.rgb,light{X}.vLightHeight.rgb,diffuse{X}.rgb,light{X}.vLightSpecular.rgb,\n#ifdef AREALIGHTNOROUGHTNESS\n0.5\n#else\nvReflectionInfos.y\n#endif\n);\n#endif\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\ninfo.diffuse*=computeProjectionTextureDiffuseLighting(projectionLightTexture{X},textureProjectionMatrix{X},vPositionW);\n#endif\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nfor (int i=0; i<SHADOWCSMNUM_CASCADES{X}; i++)\n{\n#ifdef SHADOWCSM_RIGHTHANDED{X}\ndiff{X}=viewFrustumZ{X}[i]+vPositionFromCamera{X}.z;\n#else\ndiff{X}=viewFrustumZ{X}[i]-vPositionFromCamera{X}.z;\n#endif\nif (diff{X}>=0.) {index{X}=i;break;}}\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nif (index{X}>=0)\n#endif\n{\n#if defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#else\nshadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#endif\n#else\nshadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nshadowDebug{X}=vec3(shadow)*vCascadeColorsMultiplier{X}[index{X}];\n#endif\n#ifndef SHADOWCSMNOBLEND{X}\nfloat frustumLength=frustumLengths{X}[index{X}];float diffRatio=clamp(diff{X}/frustumLength,0.,1.)*cascadeBlendFactor{X};if (index{X}<(SHADOWCSMNUM_CASCADES{X}-1) && diffRatio<1.)\n{index{X}+=1;float nextShadow=0.;\n#if defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nnextShadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nnextShadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nnextShadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nnextShadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#elif defined(SHADOWMEDIUMQUALITY{X})\nnextShadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#else\nnextShadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#endif\n#else\nnextShadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\nshadow=mix(nextShadow,shadow,diffRatio);\n#ifdef SHADOWCSMDEBUG{X}\nshadowDebug{X}=mix(vec3(nextShadow)*vCascadeColorsMultiplier{X}[index{X}],shadowDebug{X},diffRatio);\n#endif\n}\n#endif\n}\n#elif defined(SHADOWCLOSEESM{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithCloseESMCube(vPositionW,light{X}.vLightData.xyz,shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);\n#else\nshadow=computeShadowWithCloseESM(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWESM{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithESMCube(vPositionW,light{X}.vLightData.xyz,shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);\n#else\nshadow=computeShadowWithESM(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPOISSON{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithPoissonSamplingCube(vPositionW,light{X}.vLightData.xyz,shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadowWithPoissonSampling(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithPCF1(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithPCF3(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithPCF5(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithPCSS16(vPositionFromLight{X},vDepthMetric{X},depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithPCSS32(vPositionFromLight{X},vDepthMetric{X},depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithPCSS64(vPositionFromLight{X},vDepthMetric{X},depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#else\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowCube(vPositionW,light{X}.vLightData.xyz,shadowTexture{X},light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadow(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#endif\n#ifdef SHADOWONLY\n#ifndef SHADOWINUSE\n#define SHADOWINUSE\n#endif\nglobalShadow+=shadow;shadowLightCount+=1.0;\n#endif\n#else\nshadow=1.;\n#endif\naggShadow+=shadow;numLights+=1.0;\n#ifndef SHADOWONLY\n#ifdef CUSTOMUSERLIGHTING\ndiffuseBase+=computeCustomDiffuseLighting(info,diffuseBase,shadow);\n#ifdef SPECULARTERM\nspecularBase+=computeCustomSpecularLighting(info,specularBase,shadow);\n#endif\n#elif defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X})\ndiffuseBase+=lightmapColor.rgb*shadow;\n#ifdef SPECULARTERM\n#ifndef LIGHTMAPNOSPECULAR{X}\nspecularBase+=info.specular*shadow*lightmapColor.rgb;\n#endif\n#endif\n#ifdef CLEARCOAT\n#ifndef LIGHTMAPNOSPECULAR{X}\nclearCoatBase+=info.clearCoat.rgb*shadow*lightmapColor.rgb;\n#endif\n#endif\n#ifdef SHEEN\n#ifndef LIGHTMAPNOSPECULAR{X}\nsheenBase+=info.sheen.rgb*shadow;\n#endif\n#endif\n#else\n#ifdef SHADOWCSMDEBUG{X}\ndiffuseBase+=info.diffuse*shadowDebug{X};\n#else\ndiffuseBase+=info.diffuse*shadow;\n#endif\n#ifdef SS_TRANSLUCENCY\ndiffuseTransmissionBase+=info.diffuseTransmission*shadow;\n#endif\n#ifdef SPECULARTERM\nspecularBase+=info.specular*shadow;\n#endif\n#ifdef CLEARCOAT\nclearCoatBase+=info.clearCoat.rgb*shadow;\n#endif\n#ifdef SHEEN\nsheenBase+=info.sheen.rgb*shadow;\n#endif\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const lightFragment = { name, shader };\n"]}
1
+ {"version":3,"file":"lightFragment.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/lightFragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,eAAe,CAAC;AAC7B,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoUd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"lightFragment\";\nconst shader = `#ifdef LIGHT{X}\n#if defined(SHADOWONLY) || defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X}) && defined(LIGHTMAPNOSPECULAR{X})\n#else\nvec4 diffuse{X}=light{X}.vLightDiffuse;\n#define CUSTOM_LIGHT{X}_COLOR \n#ifdef PBR\n#ifdef SPOTLIGHT{X}\npreInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW,vPositionW);\n#elif defined(POINTLIGHT{X})\npreInfo=computePointAndSpotPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW,vPositionW);\n#elif defined(HEMILIGHT{X})\npreInfo=computeHemisphericPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(DIRLIGHT{X})\npreInfo=computeDirectionalPreLightingInfo(light{X}.vLightData,viewDirectionW,normalW);\n#elif defined(AREALIGHT{X}) && defined(AREALIGHTSUPPORTED)\npreInfo=computeAreaPreLightingInfo(areaLightsLTC1Sampler,areaLightsLTC2Sampler,viewDirectionW,normalW,vPositionW,light{X}.vLightData,light{X}.vLightWidth.xyz,light{X}.vLightHeight.xyz,roughness);\n#endif\npreInfo.NdotV=NdotV;\n#ifdef SPOTLIGHT{X}\n#ifdef LIGHT_FALLOFF_GLTF{X}\npreInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);\n#ifdef IESLIGHTTEXTURE{X}\npreInfo.attenuation*=computeDirectionalLightFalloff_IES(light{X}.vLightDirection.xyz,preInfo.L,iesLightTexture{X});\n#else\npreInfo.attenuation*=computeDirectionalLightFalloff_GLTF(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);\n#endif\n#elif defined(LIGHT_FALLOFF_PHYSICAL{X})\npreInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);\n#ifdef IESLIGHTTEXTURE{X}\npreInfo.attenuation*=computeDirectionalLightFalloff_IES(light{X}.vLightDirection.xyz,preInfo.L,iesLightTexture{X});\n#else\npreInfo.attenuation*=computeDirectionalLightFalloff_Physical(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w);\n#endif\n#elif defined(LIGHT_FALLOFF_STANDARD{X})\npreInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);\n#ifdef IESLIGHTTEXTURE{X}\npreInfo.attenuation*=computeDirectionalLightFalloff_IES(light{X}.vLightDirection.xyz,preInfo.L,iesLightTexture{X});\n#else\npreInfo.attenuation*=computeDirectionalLightFalloff_Standard(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w);\n#endif\n#else\npreInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);\n#ifdef IESLIGHTTEXTURE{X}\npreInfo.attenuation*=computeDirectionalLightFalloff_IES(light{X}.vLightDirection.xyz,preInfo.L,iesLightTexture{X});\n#else\npreInfo.attenuation*=computeDirectionalLightFalloff(light{X}.vLightDirection.xyz,preInfo.L,light{X}.vLightDirection.w,light{X}.vLightData.w,light{X}.vLightFalloff.z,light{X}.vLightFalloff.w);\n#endif\n#endif\n#elif defined(POINTLIGHT{X})\n#ifdef LIGHT_FALLOFF_GLTF{X}\npreInfo.attenuation=computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared,light{X}.vLightFalloff.y);\n#elif defined(LIGHT_FALLOFF_PHYSICAL{X})\npreInfo.attenuation=computeDistanceLightFalloff_Physical(preInfo.lightDistanceSquared);\n#elif defined(LIGHT_FALLOFF_STANDARD{X})\npreInfo.attenuation=computeDistanceLightFalloff_Standard(preInfo.lightOffset,light{X}.vLightFalloff.x);\n#else\npreInfo.attenuation=computeDistanceLightFalloff(preInfo.lightOffset,preInfo.lightDistanceSquared,light{X}.vLightFalloff.x,light{X}.vLightFalloff.y);\n#endif\n#else\npreInfo.attenuation=1.0;\n#endif\n#if defined(HEMILIGHT{X}) || defined(AREALIGHT{X})\npreInfo.roughness=roughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(roughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\npreInfo.diffuseRoughness=diffuseRoughness;preInfo.surfaceAlbedo=surfaceAlbedo;\n#ifdef IRIDESCENCE\npreInfo.iridescenceIntensity=iridescenceIntensity;\n#endif\n#ifdef HEMILIGHT{X}\ninfo.diffuse=computeHemisphericDiffuseLighting(preInfo,diffuse{X}.rgb,light{X}.vLightGround);\n#elif defined(AREALIGHT{X})\ninfo.diffuse=computeAreaDiffuseLighting(preInfo,diffuse{X}.rgb);\n#elif defined(SS_TRANSLUCENCY)\n#ifndef SS_TRANSLUCENCY_LEGACY\ninfo.diffuse=computeDiffuseLighting(preInfo,diffuse{X}.rgb)*(1.0-subSurfaceOut.translucencyIntensity);info.diffuseTransmission=computeDiffuseTransmittedLighting(preInfo,diffuse{X}.rgb,subSurfaceOut.transmittance); \n#else\ninfo.diffuse=computeDiffuseTransmittedLighting(preInfo,diffuse{X}.rgb,subSurfaceOut.transmittance);info.diffuseTransmission=vec3(0.0);\n#endif\n#else\ninfo.diffuse=computeDiffuseLighting(preInfo,diffuse{X}.rgb);\n#endif\n#ifdef SPECULARTERM\n#if AREALIGHT{X}\ninfo.specular=computeAreaSpecularLighting(preInfo,light{X}.vLightSpecular.rgb);\n#else\nfresnel=fresnelSchlickGGX(preInfo.VdotH,vec3(reflectanceF0),specularEnvironmentR90);coloredFresnel=fresnelSchlickGGX(preInfo.VdotH,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90);\n#ifndef LEGACY_SPECULAR_ENERGY_CONSERVATION\ninfo.diffuse*=(1.0-fresnel);\n#endif\n#ifdef ANISOTROPIC\ninfo.specular=computeAnisotropicSpecularLighting(preInfo,viewDirectionW,normalW,anisotropicOut.anisotropicTangent,anisotropicOut.anisotropicBitangent,anisotropicOut.anisotropy,clearcoatOut.specularEnvironmentR0,specularEnvironmentR90,AARoughnessFactors.x,diffuse{X}.rgb);\n#else\ninfo.specular=computeSpecularLighting(preInfo,normalW,clearcoatOut.specularEnvironmentR0,coloredFresnel,AARoughnessFactors.x,diffuse{X}.rgb);\n#endif\n#endif\n#endif\n#ifndef AREALIGHT{X}\n#ifdef SHEEN\n#ifdef SHEEN_LINKWITHALBEDO\npreInfo.roughness=sheenOut.sheenIntensity;\n#else\n#ifdef HEMILIGHT{X}\npreInfo.roughness=sheenOut.sheenRoughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(sheenOut.sheenRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\n#endif\ninfo.sheen=computeSheenLighting(preInfo,normalW,sheenOut.sheenColor,specularEnvironmentR90,AARoughnessFactors.x,diffuse{X}.rgb);\n#endif\n#ifdef CLEARCOAT\n#ifdef HEMILIGHT{X}\npreInfo.roughness=clearcoatOut.clearCoatRoughness;\n#else\npreInfo.roughness=adjustRoughnessFromLightProperties(clearcoatOut.clearCoatRoughness,light{X}.vLightSpecular.a,preInfo.lightDistance);\n#endif\ninfo.clearCoat=computeClearCoatLighting(preInfo,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatAARoughnessFactors.x,clearcoatOut.clearCoatIntensity,diffuse{X}.rgb);\n#ifdef CLEARCOAT_TINT\nabsorption=computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract,preInfo.L,clearcoatOut.clearCoatNormalW,clearcoatOut.clearCoatColor,clearcoatOut.clearCoatThickness,clearcoatOut.clearCoatIntensity);info.diffuse*=absorption;\n#ifdef SS_TRANSLUCENCY\ninfo.diffuseTransmission*=absorption;\n#endif\n#ifdef SPECULARTERM\ninfo.specular*=absorption;\n#endif\n#endif\ninfo.diffuse*=info.clearCoat.w;\n#ifdef SS_TRANSLUCENCY\ninfo.diffuseTransmission*=info.clearCoat.w;\n#endif\n#ifdef SPECULARTERM\ninfo.specular*=info.clearCoat.w;\n#endif\n#ifdef SHEEN\ninfo.sheen*=info.clearCoat.w;\n#endif\n#endif\n#endif\n#else\n#ifdef SPOTLIGHT{X}\n#ifdef IESLIGHTTEXTURE{X}\ninfo=computeIESSpotLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDirection,diffuse{X}.rgb,light{X}.vLightSpecular.rgb,diffuse{X}.a,glossiness,iesLightTexture{X});\n#else\ninfo=computeSpotLighting(viewDirectionW,normalW,light{X}.vLightData,light{X}.vLightDirection,diffuse{X}.rgb,light{X}.vLightSpecular.rgb,diffuse{X}.a,glossiness);\n#endif\n#elif defined(HEMILIGHT{X})\ninfo=computeHemisphericLighting(viewDirectionW,normalW,light{X}.vLightData,diffuse{X}.rgb,light{X}.vLightSpecular.rgb,light{X}.vLightGround,glossiness);\n#elif defined(POINTLIGHT{X}) || defined(DIRLIGHT{X})\ninfo=computeLighting(viewDirectionW,normalW,light{X}.vLightData,diffuse{X}.rgb,light{X}.vLightSpecular.rgb,diffuse{X}.a,glossiness);\n#elif defined(AREALIGHT{X}) && defined(AREALIGHTSUPPORTED)\ninfo=computeAreaLighting(areaLightsLTC1Sampler,areaLightsLTC2Sampler,viewDirectionW,normalW,vPositionW,light{X}.vLightData.xyz,light{X}.vLightWidth.rgb,light{X}.vLightHeight.rgb,diffuse{X}.rgb,light{X}.vLightSpecular.rgb,\n#ifdef AREALIGHTNOROUGHTNESS\n0.5\n#else\nvReflectionInfos.y\n#endif\n);\n#endif\n#endif\n#ifdef PROJECTEDLIGHTTEXTURE{X}\ninfo.diffuse*=computeProjectionTextureDiffuseLighting(projectionLightTexture{X},textureProjectionMatrix{X},vPositionW);\n#endif\n#endif\n#ifdef SHADOW{X}\n#ifdef SHADOWCSM{X}\nfor (int i=0; i<SHADOWCSMNUM_CASCADES{X}; i++)\n{\n#ifdef SHADOWCSM_RIGHTHANDED{X}\ndiff{X}=viewFrustumZ{X}[i]+vPositionFromCamera{X}.z;\n#else\ndiff{X}=viewFrustumZ{X}[i]-vPositionFromCamera{X}.z;\n#endif\nif (diff{X}>=0.) {index{X}=i;break;}}\n#ifdef SHADOWCSMUSESHADOWMAXZ{X}\nif (index{X}>=0)\n#endif\n{\n#if defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#else\nshadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#endif\n#else\nshadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#ifdef SHADOWCSMDEBUG{X}\nshadowDebug{X}=vec3(shadow)*vCascadeColorsMultiplier{X}[index{X}];\n#endif\n#ifndef SHADOWCSMNOBLEND{X}\nfloat frustumLength=frustumLengths{X}[index{X}];float diffRatio=clamp(diff{X}/frustumLength,0.,1.)*cascadeBlendFactor{X};if (index{X}<(SHADOWCSMNUM_CASCADES{X}-1) && diffRatio<1.)\n{index{X}+=1;float nextShadow=0.;\n#if defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nnextShadow=computeShadowWithCSMPCF1(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nnextShadow=computeShadowWithCSMPCF3(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nnextShadow=computeShadowWithCSMPCF5(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nnextShadow=computeShadowWithCSMPCSS16(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#elif defined(SHADOWMEDIUMQUALITY{X})\nnextShadow=computeShadowWithCSMPCSS32(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#else\nnextShadow=computeShadowWithCSMPCSS64(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w,lightSizeUVCorrection{X}[index{X}],depthCorrection{X}[index{X}],penumbraDarkness{X});\n#endif\n#else\nnextShadow=computeShadowCSM(float(index{X}),vPositionFromLight{X}[index{X}],vDepthMetric{X}[index{X}],shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\nshadow=mix(nextShadow,shadow,diffRatio);\n#ifdef SHADOWCSMDEBUG{X}\nshadowDebug{X}=mix(vec3(nextShadow)*vCascadeColorsMultiplier{X}[index{X}],shadowDebug{X},diffRatio);\n#endif\n}\n#endif\n}\n#elif defined(SHADOWCLOSEESM{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithCloseESMCube(vPositionW,light{X}.vLightData.xyz,shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);\n#else\nshadow=computeShadowWithCloseESM(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWESM{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithESMCube(vPositionW,light{X}.vLightData.xyz,shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.depthValues);\n#else\nshadow=computeShadowWithESM(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.z,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPOISSON{X})\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowWithPoissonSamplingCube(vPositionW,light{X}.vLightData.xyz,shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadowWithPoissonSampling(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCF{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithPCF1(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithPCF3(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithPCF5(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.yz,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#elif defined(SHADOWPCSS{X})\n#if defined(SHADOWLOWQUALITY{X})\nshadow=computeShadowWithPCSS16(vPositionFromLight{X},vDepthMetric{X},depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#elif defined(SHADOWMEDIUMQUALITY{X})\nshadow=computeShadowWithPCSS32(vPositionFromLight{X},vDepthMetric{X},depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#else\nshadow=computeShadowWithPCSS64(vPositionFromLight{X},vDepthMetric{X},depthTexture{X},shadowTexture{X},light{X}.shadowsInfo.y,light{X}.shadowsInfo.z,light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#else\n#if defined(SHADOWCUBE{X})\nshadow=computeShadowCube(vPositionW,light{X}.vLightData.xyz,shadowTexture{X},light{X}.shadowsInfo.x,light{X}.depthValues);\n#else\nshadow=computeShadow(vPositionFromLight{X},vDepthMetric{X},shadowTexture{X},light{X}.shadowsInfo.x,light{X}.shadowsInfo.w);\n#endif\n#endif\n#ifdef SHADOWONLY\n#ifndef SHADOWINUSE\n#define SHADOWINUSE\n#endif\nglobalShadow+=shadow;shadowLightCount+=1.0;\n#endif\n#else\nshadow=1.;\n#endif\naggShadow+=shadow;numLights+=1.0;\n#ifndef SHADOWONLY\n#ifdef CUSTOMUSERLIGHTING\ndiffuseBase+=computeCustomDiffuseLighting(info,diffuseBase,shadow);\n#ifdef SPECULARTERM\nspecularBase+=computeCustomSpecularLighting(info,specularBase,shadow);\n#endif\n#elif defined(LIGHTMAP) && defined(LIGHTMAPEXCLUDED{X})\ndiffuseBase+=lightmapColor.rgb*shadow;\n#ifdef SPECULARTERM\n#ifndef LIGHTMAPNOSPECULAR{X}\nspecularBase+=info.specular*shadow*lightmapColor.rgb;\n#endif\n#endif\n#ifdef CLEARCOAT\n#ifndef LIGHTMAPNOSPECULAR{X}\nclearCoatBase+=info.clearCoat.rgb*shadow*lightmapColor.rgb;\n#endif\n#endif\n#ifdef SHEEN\n#ifndef LIGHTMAPNOSPECULAR{X}\nsheenBase+=info.sheen.rgb*shadow;\n#endif\n#endif\n#else\n#ifdef SHADOWCSMDEBUG{X}\ndiffuseBase+=info.diffuse*shadowDebug{X};\n#else\ndiffuseBase+=info.diffuse*shadow;\n#endif\n#ifdef SS_TRANSLUCENCY\ndiffuseTransmissionBase+=info.diffuseTransmission*shadow;\n#endif\n#ifdef SPECULARTERM\nspecularBase+=info.specular*shadow;\n#endif\n#ifdef CLEARCOAT\nclearCoatBase+=info.clearCoat.rgb*shadow;\n#endif\n#ifdef SHEEN\nsheenBase+=info.sheen.rgb*shadow;\n#endif\n#endif\n#endif\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const lightFragment = { name, shader };\n"]}
@@ -5,22 +5,29 @@ const shader = `#define FRESNEL_MAXIMUM_ON_ROUGH 0.25
5
5
  #define BRDF_DIFFUSE_MODEL_EON 0
6
6
  #define BRDF_DIFFUSE_MODEL_BURLEY 1
7
7
  #define BRDF_DIFFUSE_MODEL_LAMBERT 2
8
+ #define DIELECTRIC_SPECULAR_MODEL_GLTF 0
9
+ #define DIELECTRIC_SPECULAR_MODEL_OPENPBR 1
10
+ #define CONDUCTOR_SPECULAR_MODEL_GLTF 0
11
+ #define CONDUCTOR_SPECULAR_MODEL_OPENPBR 1
8
12
  #ifdef MS_BRDF_ENERGY_CONSERVATION
9
13
  vec3 getEnergyConservationFactor(const vec3 specularEnvironmentR0,const vec3 environmentBrdf) {return 1.0+specularEnvironmentR0*(1.0/environmentBrdf.y-1.0);}
10
14
  #endif
15
+ #if CONDUCTOR_SPECULAR_MODEL==CONDUCTOR_SPECULAR_MODEL_OPENPBR
16
+ vec3 getF82Specular(float NdotV,vec3 F0,vec3 edgeTint,float roughness) {const float cos_theta_max=0.142857143;
17
+ const float one_minus_cos_theta_max_to_the_fifth=0.462664366;
18
+ const float one_minus_cos_theta_max_to_the_sixth=0.396569457;
19
+ vec3 white_minus_F0=vec3(1.0)-F0;vec3 b_numerator=(F0+white_minus_F0*one_minus_cos_theta_max_to_the_fifth)*(vec3(1.0)-edgeTint);const float b_denominator=cos_theta_max*one_minus_cos_theta_max_to_the_sixth;const float b_denominator_reciprocal=1.0/b_denominator;vec3 b=b_numerator*b_denominator_reciprocal;
20
+ float cos_theta=max(roughness,NdotV);float one_minus_cos_theta=1.0-cos_theta;vec3 offset_from_F0=(white_minus_F0-b*cos_theta*one_minus_cos_theta)*pow(one_minus_cos_theta,5.0);return clamp(F0+offset_from_F0,0.0,1.0);}
21
+ #endif
11
22
  #ifdef ENVIRONMENTBRDF
12
23
  vec3 getBRDFLookup(float NdotV,float perceptualRoughness) {vec2 UV=vec2(NdotV,perceptualRoughness);vec4 brdfLookup=texture2D(environmentBrdfSampler,UV);
13
24
  #ifdef ENVIRONMENTBRDF_RGBD
14
25
  brdfLookup.rgb=fromRGBD(brdfLookup.rgba);
15
26
  #endif
16
27
  return brdfLookup.rgb;}
17
- vec3 getReflectanceFromBRDFLookup(const vec3 specularEnvironmentR0,const vec3 specularEnvironmentR90,const float ior,const vec3 environmentBrdf) {
28
+ vec3 getReflectanceFromBRDFLookup(const vec3 specularEnvironmentR0,const vec3 specularEnvironmentR90,const vec3 environmentBrdf) {
18
29
  #ifdef BRDF_V_HEIGHT_CORRELATED
19
- #ifdef METALLICWORKFLOW
20
- vec3 reflectance=(specularEnvironmentR90-specularEnvironmentR0)*clamp(environmentBrdf.x*2.0*(ior-1.0),0.0,1.0)+specularEnvironmentR0*environmentBrdf.y;
21
- #else
22
30
  vec3 reflectance=(specularEnvironmentR90-specularEnvironmentR0)*environmentBrdf.x+specularEnvironmentR0*environmentBrdf.y;
23
- #endif
24
31
  #else
25
32
  vec3 reflectance=specularEnvironmentR0*environmentBrdf.x+specularEnvironmentR90*environmentBrdf.y;
26
33
  #endif
@@ -1 +1 @@
1
- {"version":3,"file":"pbrBRDFFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/pbrBRDFFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,kBAAkB,CAAC;AAChC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Jd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"pbrBRDFFunctions\";\nconst shader = `#define FRESNEL_MAXIMUM_ON_ROUGH 0.25\n#define BRDF_DIFFUSE_MODEL_EON 0\n#define BRDF_DIFFUSE_MODEL_BURLEY 1\n#define BRDF_DIFFUSE_MODEL_LAMBERT 2\n#ifdef MS_BRDF_ENERGY_CONSERVATION\nvec3 getEnergyConservationFactor(const vec3 specularEnvironmentR0,const vec3 environmentBrdf) {return 1.0+specularEnvironmentR0*(1.0/environmentBrdf.y-1.0);}\n#endif\n#ifdef ENVIRONMENTBRDF\nvec3 getBRDFLookup(float NdotV,float perceptualRoughness) {vec2 UV=vec2(NdotV,perceptualRoughness);vec4 brdfLookup=texture2D(environmentBrdfSampler,UV);\n#ifdef ENVIRONMENTBRDF_RGBD\nbrdfLookup.rgb=fromRGBD(brdfLookup.rgba);\n#endif\nreturn brdfLookup.rgb;}\nvec3 getReflectanceFromBRDFLookup(const vec3 specularEnvironmentR0,const vec3 specularEnvironmentR90,const float ior,const vec3 environmentBrdf) {\n#ifdef BRDF_V_HEIGHT_CORRELATED\n#ifdef METALLICWORKFLOW\nvec3 reflectance=(specularEnvironmentR90-specularEnvironmentR0)*clamp(environmentBrdf.x*2.0*(ior-1.0),0.0,1.0)+specularEnvironmentR0*environmentBrdf.y;\n#else\nvec3 reflectance=(specularEnvironmentR90-specularEnvironmentR0)*environmentBrdf.x+specularEnvironmentR0*environmentBrdf.y;\n#endif\n#else\nvec3 reflectance=specularEnvironmentR0*environmentBrdf.x+specularEnvironmentR90*environmentBrdf.y;\n#endif\nreturn reflectance;}\nvec3 getReflectanceFromBRDFLookup(const vec3 specularEnvironmentR0,const vec3 environmentBrdf) {\n#ifdef BRDF_V_HEIGHT_CORRELATED\nvec3 reflectance=mix(environmentBrdf.xxx,environmentBrdf.yyy,specularEnvironmentR0);\n#else\nvec3 reflectance=specularEnvironmentR0*environmentBrdf.x+environmentBrdf.y;\n#endif\nreturn reflectance;}\n#endif\n/* NOT USED\n#if defined(SHEEN) && defined(SHEEN_SOFTER)\nfloat getBRDFLookupCharlieSheen(float NdotV,float perceptualRoughness)\n{float c=1.0-NdotV;float c3=c*c*c;return 0.65584461*c3+1.0/(4.16526551+exp(-7.97291361*perceptualRoughness+6.33516894));}\n#endif\n*/\n#if !defined(ENVIRONMENTBRDF) || defined(REFLECTIONMAP_SKYBOX) || defined(ALPHAFRESNEL)\nvec3 getReflectanceFromAnalyticalBRDFLookup_Jones(float VdotN,vec3 reflectance0,vec3 reflectance90,float smoothness)\n{float weight=mix(FRESNEL_MAXIMUM_ON_ROUGH,1.0,smoothness);return reflectance0+weight*(reflectance90-reflectance0)*pow5(saturate(1.0-VdotN));}\n#endif\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF)\n/**\n* The sheen BRDF not containing F can be easily stored in the blue channel of the BRDF texture.\n* The blue channel contains DCharlie*VAshikhmin*NdotL as a lokkup table\n*/\nvec3 getSheenReflectanceFromBRDFLookup(const vec3 reflectance0,const vec3 environmentBrdf) {vec3 sheenEnvironmentReflectance=reflectance0*environmentBrdf.b;return sheenEnvironmentReflectance;}\n#endif\nvec3 fresnelSchlickGGX(float VdotH,vec3 reflectance0,vec3 reflectance90)\n{return reflectance0+(reflectance90-reflectance0)*pow5(1.0-VdotH);}\nfloat fresnelSchlickGGX(float VdotH,float reflectance0,float reflectance90)\n{return reflectance0+(reflectance90-reflectance0)*pow5(1.0-VdotH);}\n#ifdef CLEARCOAT\nvec3 getR0RemappedForClearCoat(vec3 f0) {\n#ifdef CLEARCOAT_DEFAULTIOR\n#ifdef MOBILE\nreturn saturate(f0*(f0*0.526868+0.529324)-0.0482256);\n#else\nreturn saturate(f0*(f0*(0.941892-0.263008*f0)+0.346479)-0.0285998);\n#endif\n#else\nvec3 s=sqrt(f0);vec3 t=(vClearCoatRefractionParams.z+vClearCoatRefractionParams.w*s)/(vClearCoatRefractionParams.w+vClearCoatRefractionParams.z*s);return square(t);\n#endif\n}\n#endif\n#ifdef IRIDESCENCE\nconst mat3 XYZ_TO_REC709=mat3(\n3.2404542,-0.9692660, 0.0556434,\n-1.5371385, 1.8760108,-0.2040259,\n-0.4985314, 0.0415560, 1.0572252\n);vec3 getIORTfromAirToSurfaceR0(vec3 f0) {vec3 sqrtF0=sqrt(f0);return (1.+sqrtF0)/(1.-sqrtF0);}\nvec3 getR0fromIORs(vec3 iorT,float iorI) {return square((iorT-vec3(iorI))/(iorT+vec3(iorI)));}\nfloat getR0fromIORs(float iorT,float iorI) {return square((iorT-iorI)/(iorT+iorI));}\nvec3 evalSensitivity(float opd,vec3 shift) {float phase=2.0*PI*opd*1.0e-9;const vec3 val=vec3(5.4856e-13,4.4201e-13,5.2481e-13);const vec3 pos=vec3(1.6810e+06,1.7953e+06,2.2084e+06);const vec3 var=vec3(4.3278e+09,9.3046e+09,6.6121e+09);vec3 xyz=val*sqrt(2.0*PI*var)*cos(pos*phase+shift)*exp(-square(phase)*var);xyz.x+=9.7470e-14*sqrt(2.0*PI*4.5282e+09)*cos(2.2399e+06*phase+shift[0])*exp(-4.5282e+09*square(phase));xyz/=1.0685e-7;vec3 srgb=XYZ_TO_REC709*xyz;return srgb;}\nvec3 evalIridescence(float outsideIOR,float eta2,float cosTheta1,float thinFilmThickness,vec3 baseF0) {vec3 I=vec3(1.0);float iridescenceIOR=mix(outsideIOR,eta2,smoothstep(0.0,0.03,thinFilmThickness));float sinTheta2Sq=square(outsideIOR/iridescenceIOR)*(1.0-square(cosTheta1));float cosTheta2Sq=1.0-sinTheta2Sq;if (cosTheta2Sq<0.0) {return I;}\nfloat cosTheta2=sqrt(cosTheta2Sq);float R0=getR0fromIORs(iridescenceIOR,outsideIOR);float R12=fresnelSchlickGGX(cosTheta1,R0,1.);float R21=R12;float T121=1.0-R12;float phi12=0.0;if (iridescenceIOR<outsideIOR) phi12=PI;float phi21=PI-phi12;vec3 baseIOR=getIORTfromAirToSurfaceR0(clamp(baseF0,0.0,0.9999)); \nvec3 R1=getR0fromIORs(baseIOR,iridescenceIOR);vec3 R23=fresnelSchlickGGX(cosTheta2,R1,vec3(1.));vec3 phi23=vec3(0.0);if (baseIOR[0]<iridescenceIOR) phi23[0]=PI;if (baseIOR[1]<iridescenceIOR) phi23[1]=PI;if (baseIOR[2]<iridescenceIOR) phi23[2]=PI;float opd=2.0*iridescenceIOR*thinFilmThickness*cosTheta2;vec3 phi=vec3(phi21)+phi23;vec3 R123=clamp(R12*R23,1e-5,0.9999);vec3 r123=sqrt(R123);vec3 Rs=square(T121)*R23/(vec3(1.0)-R123);vec3 C0=R12+Rs;I=C0;vec3 Cm=Rs-T121;for (int m=1; m<=2; ++m)\n{Cm*=r123;vec3 Sm=2.0*evalSensitivity(float(m)*opd,float(m)*phi);I+=Cm*Sm;}\nreturn max(I,vec3(0.0));}\n#endif\nfloat normalDistributionFunction_TrowbridgeReitzGGX(float NdotH,float alphaG)\n{float a2=square(alphaG);float d=NdotH*NdotH*(a2-1.0)+1.0;return a2/(PI*d*d);}\n#ifdef SHEEN\nfloat normalDistributionFunction_CharlieSheen(float NdotH,float alphaG)\n{float invR=1./alphaG;float cos2h=NdotH*NdotH;float sin2h=1.-cos2h;return (2.+invR)*pow(sin2h,invR*.5)/(2.*PI);}\n#endif\n#ifdef ANISOTROPIC\nfloat normalDistributionFunction_BurleyGGX_Anisotropic(float NdotH,float TdotH,float BdotH,const vec2 alphaTB) {float a2=alphaTB.x*alphaTB.y;vec3 v=vec3(alphaTB.y*TdotH,alphaTB.x *BdotH,a2*NdotH);float v2=dot(v,v);float w2=a2/v2;return a2*w2*w2*RECIPROCAL_PI;}\n#endif\n#ifdef BRDF_V_HEIGHT_CORRELATED\nfloat smithVisibility_GGXCorrelated(float NdotL,float NdotV,float alphaG) {\n#ifdef MOBILE\nfloat GGXV=NdotL*(NdotV*(1.0-alphaG)+alphaG);float GGXL=NdotV*(NdotL*(1.0-alphaG)+alphaG);return 0.5/(GGXV+GGXL);\n#else\nfloat a2=alphaG*alphaG;float GGXV=NdotL*sqrt(NdotV*(NdotV-a2*NdotV)+a2);float GGXL=NdotV*sqrt(NdotL*(NdotL-a2*NdotL)+a2);return 0.5/(GGXV+GGXL);\n#endif\n}\n#else\nfloat smithVisibilityG1_TrowbridgeReitzGGXFast(float dot,float alphaG)\n{\n#ifdef MOBILE\nreturn 1.0/(dot+alphaG+(1.0-alphaG)*dot ));\n#else\nfloat alphaSquared=alphaG*alphaG;return 1.0/(dot+sqrt(alphaSquared+(1.0-alphaSquared)*dot*dot));\n#endif\n}\nfloat smithVisibility_TrowbridgeReitzGGXFast(float NdotL,float NdotV,float alphaG)\n{float visibility=smithVisibilityG1_TrowbridgeReitzGGXFast(NdotL,alphaG)*smithVisibilityG1_TrowbridgeReitzGGXFast(NdotV,alphaG);return visibility;}\n#endif\n#ifdef ANISOTROPIC\nfloat smithVisibility_GGXCorrelated_Anisotropic(float NdotL,float NdotV,float TdotV,float BdotV,float TdotL,float BdotL,const vec2 alphaTB) {float lambdaV=NdotL*length(vec3(alphaTB.x*TdotV,alphaTB.y*BdotV,NdotV));float lambdaL=NdotV*length(vec3(alphaTB.x*TdotL,alphaTB.y*BdotL,NdotL));float v=0.5/(lambdaV+lambdaL);return v;}\n#endif\n#ifdef CLEARCOAT\nfloat visibility_Kelemen(float VdotH) {return 0.25/(VdotH*VdotH); }\n#endif\n#ifdef SHEEN\nfloat visibility_Ashikhmin(float NdotL,float NdotV)\n{return 1./(4.*(NdotL+NdotV-NdotL*NdotV));}\n/* NOT USED\n#ifdef SHEEN_SOFTER\nfloat l(float x,float alphaG)\n{float oneMinusAlphaSq=(1.0-alphaG)*(1.0-alphaG);float a=mix(21.5473,25.3245,oneMinusAlphaSq);float b=mix(3.82987,3.32435,oneMinusAlphaSq);float c=mix(0.19823,0.16801,oneMinusAlphaSq);float d=mix(-1.97760,-1.27393,oneMinusAlphaSq);float e=mix(-4.32054,-4.85967,oneMinusAlphaSq);return a/(1.0+b*pow(x,c))+d*x+e;}\nfloat lambdaSheen(float cosTheta,float alphaG)\n{return abs(cosTheta)<0.5 ? exp(l(cosTheta,alphaG)) : exp(2.0*l(0.5,alphaG)-l(1.0-cosTheta,alphaG));}\nfloat visibility_CharlieSheen(float NdotL,float NdotV,float alphaG)\n{float G=1.0/(1.0+lambdaSheen(NdotV,alphaG)+lambdaSheen(NdotL,alphaG));return G/(4.0*NdotV*NdotL);}\n#endif\n*/\n#endif\nfloat diffuseBRDF_Burley(float NdotL,float NdotV,float VdotH,float roughness) {float diffuseFresnelNV=pow5(saturateEps(1.0-NdotL));float diffuseFresnelNL=pow5(saturateEps(1.0-NdotV));float diffuseFresnel90=0.5+2.0*VdotH*VdotH*roughness;float fresnel =\n(1.0+(diffuseFresnel90-1.0)*diffuseFresnelNL) *\n(1.0+(diffuseFresnel90-1.0)*diffuseFresnelNV);return fresnel/PI;}\nconst float constant1_FON=0.5-2.0/(3.0*PI);const float constant2_FON=2.0/3.0-28.0/(15.0*PI);float E_FON_approx(float mu,float roughness)\n{float sigma=roughness; \nfloat mucomp=1.0-mu;float mucomp2=mucomp*mucomp;const mat2 Gcoeffs=mat2(0.0571085289,-0.332181442,\n0.491881867,0.0714429953);float GoverPi=dot(Gcoeffs*vec2(mucomp,mucomp2),vec2(1.0,mucomp2));return (1.0+sigma*GoverPi)/(1.0+constant1_FON*sigma);}\nvec3 diffuseBRDF_EON(vec3 albedo,float roughness,float NdotL,float NdotV,float LdotV)\n{vec3 rho=albedo;float sigma=roughness; \nfloat mu_i=NdotL; \nfloat mu_o=NdotV; \nfloat s=LdotV-mu_i*mu_o; \nfloat sovertF=s>0.0 ? s/max(mu_i,mu_o) : s; \nfloat AF=1.0/(1.0+constant1_FON*sigma); \nvec3 f_ss=(rho*RECIPROCAL_PI)*AF*(1.0+sigma*sovertF); \nfloat EFo=E_FON_approx(mu_o,sigma); \nfloat EFi=E_FON_approx(mu_i,sigma); \nfloat avgEF=AF*(1.0+constant2_FON*sigma); \nvec3 rho_ms=(rho*rho)*avgEF/(vec3(1.0)-rho*(1.0-avgEF));const float eps=1.0e-7;vec3 f_ms=(rho_ms*RECIPROCAL_PI)*max(eps,1.0-EFo) \n* max(eps,1.0-EFi)\n/ max(eps,1.0-avgEF);return (f_ss+f_ms);}\n#ifdef SS_TRANSLUCENCY\nvec3 transmittanceBRDF_Burley(const vec3 tintColor,const vec3 diffusionDistance,float thickness) {vec3 S=1./maxEps(diffusionDistance);vec3 temp=exp((-0.333333333*thickness)*S);return tintColor.rgb*0.25*(temp*temp*temp+3.0*temp);}\nfloat computeWrappedDiffuseNdotL(float NdotL,float w) {float t=1.0+w;float invt2=1.0/square(t);return saturate((NdotL+w)*invt2);}\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const pbrBRDFFunctions = { name, shader };\n"]}
1
+ {"version":3,"file":"pbrBRDFFunctions.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/pbrBRDFFunctions.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,kBAAkB,CAAC;AAChC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkKd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"pbrBRDFFunctions\";\nconst shader = `#define FRESNEL_MAXIMUM_ON_ROUGH 0.25\n#define BRDF_DIFFUSE_MODEL_EON 0\n#define BRDF_DIFFUSE_MODEL_BURLEY 1\n#define BRDF_DIFFUSE_MODEL_LAMBERT 2\n#define DIELECTRIC_SPECULAR_MODEL_GLTF 0\n#define DIELECTRIC_SPECULAR_MODEL_OPENPBR 1\n#define CONDUCTOR_SPECULAR_MODEL_GLTF 0\n#define CONDUCTOR_SPECULAR_MODEL_OPENPBR 1\n#ifdef MS_BRDF_ENERGY_CONSERVATION\nvec3 getEnergyConservationFactor(const vec3 specularEnvironmentR0,const vec3 environmentBrdf) {return 1.0+specularEnvironmentR0*(1.0/environmentBrdf.y-1.0);}\n#endif\n#if CONDUCTOR_SPECULAR_MODEL==CONDUCTOR_SPECULAR_MODEL_OPENPBR \nvec3 getF82Specular(float NdotV,vec3 F0,vec3 edgeTint,float roughness) {const float cos_theta_max=0.142857143; \nconst float one_minus_cos_theta_max_to_the_fifth=0.462664366; \nconst float one_minus_cos_theta_max_to_the_sixth=0.396569457; \nvec3 white_minus_F0=vec3(1.0)-F0;vec3 b_numerator=(F0+white_minus_F0*one_minus_cos_theta_max_to_the_fifth)*(vec3(1.0)-edgeTint);const float b_denominator=cos_theta_max*one_minus_cos_theta_max_to_the_sixth;const float b_denominator_reciprocal=1.0/b_denominator;vec3 b=b_numerator*b_denominator_reciprocal; \nfloat cos_theta=max(roughness,NdotV);float one_minus_cos_theta=1.0-cos_theta;vec3 offset_from_F0=(white_minus_F0-b*cos_theta*one_minus_cos_theta)*pow(one_minus_cos_theta,5.0);return clamp(F0+offset_from_F0,0.0,1.0);}\n#endif\n#ifdef ENVIRONMENTBRDF\nvec3 getBRDFLookup(float NdotV,float perceptualRoughness) {vec2 UV=vec2(NdotV,perceptualRoughness);vec4 brdfLookup=texture2D(environmentBrdfSampler,UV);\n#ifdef ENVIRONMENTBRDF_RGBD\nbrdfLookup.rgb=fromRGBD(brdfLookup.rgba);\n#endif\nreturn brdfLookup.rgb;}\nvec3 getReflectanceFromBRDFLookup(const vec3 specularEnvironmentR0,const vec3 specularEnvironmentR90,const vec3 environmentBrdf) {\n#ifdef BRDF_V_HEIGHT_CORRELATED\nvec3 reflectance=(specularEnvironmentR90-specularEnvironmentR0)*environmentBrdf.x+specularEnvironmentR0*environmentBrdf.y;\n#else\nvec3 reflectance=specularEnvironmentR0*environmentBrdf.x+specularEnvironmentR90*environmentBrdf.y;\n#endif\nreturn reflectance;}\nvec3 getReflectanceFromBRDFLookup(const vec3 specularEnvironmentR0,const vec3 environmentBrdf) {\n#ifdef BRDF_V_HEIGHT_CORRELATED\nvec3 reflectance=mix(environmentBrdf.xxx,environmentBrdf.yyy,specularEnvironmentR0);\n#else\nvec3 reflectance=specularEnvironmentR0*environmentBrdf.x+environmentBrdf.y;\n#endif\nreturn reflectance;}\n#endif\n/* NOT USED\n#if defined(SHEEN) && defined(SHEEN_SOFTER)\nfloat getBRDFLookupCharlieSheen(float NdotV,float perceptualRoughness)\n{float c=1.0-NdotV;float c3=c*c*c;return 0.65584461*c3+1.0/(4.16526551+exp(-7.97291361*perceptualRoughness+6.33516894));}\n#endif\n*/\n#if !defined(ENVIRONMENTBRDF) || defined(REFLECTIONMAP_SKYBOX) || defined(ALPHAFRESNEL)\nvec3 getReflectanceFromAnalyticalBRDFLookup_Jones(float VdotN,vec3 reflectance0,vec3 reflectance90,float smoothness)\n{float weight=mix(FRESNEL_MAXIMUM_ON_ROUGH,1.0,smoothness);return reflectance0+weight*(reflectance90-reflectance0)*pow5(saturate(1.0-VdotN));}\n#endif\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF)\n/**\n* The sheen BRDF not containing F can be easily stored in the blue channel of the BRDF texture.\n* The blue channel contains DCharlie*VAshikhmin*NdotL as a lokkup table\n*/\nvec3 getSheenReflectanceFromBRDFLookup(const vec3 reflectance0,const vec3 environmentBrdf) {vec3 sheenEnvironmentReflectance=reflectance0*environmentBrdf.b;return sheenEnvironmentReflectance;}\n#endif\nvec3 fresnelSchlickGGX(float VdotH,vec3 reflectance0,vec3 reflectance90)\n{return reflectance0+(reflectance90-reflectance0)*pow5(1.0-VdotH);}\nfloat fresnelSchlickGGX(float VdotH,float reflectance0,float reflectance90)\n{return reflectance0+(reflectance90-reflectance0)*pow5(1.0-VdotH);}\n#ifdef CLEARCOAT\nvec3 getR0RemappedForClearCoat(vec3 f0) {\n#ifdef CLEARCOAT_DEFAULTIOR\n#ifdef MOBILE\nreturn saturate(f0*(f0*0.526868+0.529324)-0.0482256);\n#else\nreturn saturate(f0*(f0*(0.941892-0.263008*f0)+0.346479)-0.0285998);\n#endif\n#else\nvec3 s=sqrt(f0);vec3 t=(vClearCoatRefractionParams.z+vClearCoatRefractionParams.w*s)/(vClearCoatRefractionParams.w+vClearCoatRefractionParams.z*s);return square(t);\n#endif\n}\n#endif\n#ifdef IRIDESCENCE\nconst mat3 XYZ_TO_REC709=mat3(\n3.2404542,-0.9692660, 0.0556434,\n-1.5371385, 1.8760108,-0.2040259,\n-0.4985314, 0.0415560, 1.0572252\n);vec3 getIORTfromAirToSurfaceR0(vec3 f0) {vec3 sqrtF0=sqrt(f0);return (1.+sqrtF0)/(1.-sqrtF0);}\nvec3 getR0fromIORs(vec3 iorT,float iorI) {return square((iorT-vec3(iorI))/(iorT+vec3(iorI)));}\nfloat getR0fromIORs(float iorT,float iorI) {return square((iorT-iorI)/(iorT+iorI));}\nvec3 evalSensitivity(float opd,vec3 shift) {float phase=2.0*PI*opd*1.0e-9;const vec3 val=vec3(5.4856e-13,4.4201e-13,5.2481e-13);const vec3 pos=vec3(1.6810e+06,1.7953e+06,2.2084e+06);const vec3 var=vec3(4.3278e+09,9.3046e+09,6.6121e+09);vec3 xyz=val*sqrt(2.0*PI*var)*cos(pos*phase+shift)*exp(-square(phase)*var);xyz.x+=9.7470e-14*sqrt(2.0*PI*4.5282e+09)*cos(2.2399e+06*phase+shift[0])*exp(-4.5282e+09*square(phase));xyz/=1.0685e-7;vec3 srgb=XYZ_TO_REC709*xyz;return srgb;}\nvec3 evalIridescence(float outsideIOR,float eta2,float cosTheta1,float thinFilmThickness,vec3 baseF0) {vec3 I=vec3(1.0);float iridescenceIOR=mix(outsideIOR,eta2,smoothstep(0.0,0.03,thinFilmThickness));float sinTheta2Sq=square(outsideIOR/iridescenceIOR)*(1.0-square(cosTheta1));float cosTheta2Sq=1.0-sinTheta2Sq;if (cosTheta2Sq<0.0) {return I;}\nfloat cosTheta2=sqrt(cosTheta2Sq);float R0=getR0fromIORs(iridescenceIOR,outsideIOR);float R12=fresnelSchlickGGX(cosTheta1,R0,1.);float R21=R12;float T121=1.0-R12;float phi12=0.0;if (iridescenceIOR<outsideIOR) phi12=PI;float phi21=PI-phi12;vec3 baseIOR=getIORTfromAirToSurfaceR0(clamp(baseF0,0.0,0.9999)); \nvec3 R1=getR0fromIORs(baseIOR,iridescenceIOR);vec3 R23=fresnelSchlickGGX(cosTheta2,R1,vec3(1.));vec3 phi23=vec3(0.0);if (baseIOR[0]<iridescenceIOR) phi23[0]=PI;if (baseIOR[1]<iridescenceIOR) phi23[1]=PI;if (baseIOR[2]<iridescenceIOR) phi23[2]=PI;float opd=2.0*iridescenceIOR*thinFilmThickness*cosTheta2;vec3 phi=vec3(phi21)+phi23;vec3 R123=clamp(R12*R23,1e-5,0.9999);vec3 r123=sqrt(R123);vec3 Rs=square(T121)*R23/(vec3(1.0)-R123);vec3 C0=R12+Rs;I=C0;vec3 Cm=Rs-T121;for (int m=1; m<=2; ++m)\n{Cm*=r123;vec3 Sm=2.0*evalSensitivity(float(m)*opd,float(m)*phi);I+=Cm*Sm;}\nreturn max(I,vec3(0.0));}\n#endif\nfloat normalDistributionFunction_TrowbridgeReitzGGX(float NdotH,float alphaG)\n{float a2=square(alphaG);float d=NdotH*NdotH*(a2-1.0)+1.0;return a2/(PI*d*d);}\n#ifdef SHEEN\nfloat normalDistributionFunction_CharlieSheen(float NdotH,float alphaG)\n{float invR=1./alphaG;float cos2h=NdotH*NdotH;float sin2h=1.-cos2h;return (2.+invR)*pow(sin2h,invR*.5)/(2.*PI);}\n#endif\n#ifdef ANISOTROPIC\nfloat normalDistributionFunction_BurleyGGX_Anisotropic(float NdotH,float TdotH,float BdotH,const vec2 alphaTB) {float a2=alphaTB.x*alphaTB.y;vec3 v=vec3(alphaTB.y*TdotH,alphaTB.x *BdotH,a2*NdotH);float v2=dot(v,v);float w2=a2/v2;return a2*w2*w2*RECIPROCAL_PI;}\n#endif\n#ifdef BRDF_V_HEIGHT_CORRELATED\nfloat smithVisibility_GGXCorrelated(float NdotL,float NdotV,float alphaG) {\n#ifdef MOBILE\nfloat GGXV=NdotL*(NdotV*(1.0-alphaG)+alphaG);float GGXL=NdotV*(NdotL*(1.0-alphaG)+alphaG);return 0.5/(GGXV+GGXL);\n#else\nfloat a2=alphaG*alphaG;float GGXV=NdotL*sqrt(NdotV*(NdotV-a2*NdotV)+a2);float GGXL=NdotV*sqrt(NdotL*(NdotL-a2*NdotL)+a2);return 0.5/(GGXV+GGXL);\n#endif\n}\n#else\nfloat smithVisibilityG1_TrowbridgeReitzGGXFast(float dot,float alphaG)\n{\n#ifdef MOBILE\nreturn 1.0/(dot+alphaG+(1.0-alphaG)*dot ));\n#else\nfloat alphaSquared=alphaG*alphaG;return 1.0/(dot+sqrt(alphaSquared+(1.0-alphaSquared)*dot*dot));\n#endif\n}\nfloat smithVisibility_TrowbridgeReitzGGXFast(float NdotL,float NdotV,float alphaG)\n{float visibility=smithVisibilityG1_TrowbridgeReitzGGXFast(NdotL,alphaG)*smithVisibilityG1_TrowbridgeReitzGGXFast(NdotV,alphaG);return visibility;}\n#endif\n#ifdef ANISOTROPIC\nfloat smithVisibility_GGXCorrelated_Anisotropic(float NdotL,float NdotV,float TdotV,float BdotV,float TdotL,float BdotL,const vec2 alphaTB) {float lambdaV=NdotL*length(vec3(alphaTB.x*TdotV,alphaTB.y*BdotV,NdotV));float lambdaL=NdotV*length(vec3(alphaTB.x*TdotL,alphaTB.y*BdotL,NdotL));float v=0.5/(lambdaV+lambdaL);return v;}\n#endif\n#ifdef CLEARCOAT\nfloat visibility_Kelemen(float VdotH) {return 0.25/(VdotH*VdotH); }\n#endif\n#ifdef SHEEN\nfloat visibility_Ashikhmin(float NdotL,float NdotV)\n{return 1./(4.*(NdotL+NdotV-NdotL*NdotV));}\n/* NOT USED\n#ifdef SHEEN_SOFTER\nfloat l(float x,float alphaG)\n{float oneMinusAlphaSq=(1.0-alphaG)*(1.0-alphaG);float a=mix(21.5473,25.3245,oneMinusAlphaSq);float b=mix(3.82987,3.32435,oneMinusAlphaSq);float c=mix(0.19823,0.16801,oneMinusAlphaSq);float d=mix(-1.97760,-1.27393,oneMinusAlphaSq);float e=mix(-4.32054,-4.85967,oneMinusAlphaSq);return a/(1.0+b*pow(x,c))+d*x+e;}\nfloat lambdaSheen(float cosTheta,float alphaG)\n{return abs(cosTheta)<0.5 ? exp(l(cosTheta,alphaG)) : exp(2.0*l(0.5,alphaG)-l(1.0-cosTheta,alphaG));}\nfloat visibility_CharlieSheen(float NdotL,float NdotV,float alphaG)\n{float G=1.0/(1.0+lambdaSheen(NdotV,alphaG)+lambdaSheen(NdotL,alphaG));return G/(4.0*NdotV*NdotL);}\n#endif\n*/\n#endif\nfloat diffuseBRDF_Burley(float NdotL,float NdotV,float VdotH,float roughness) {float diffuseFresnelNV=pow5(saturateEps(1.0-NdotL));float diffuseFresnelNL=pow5(saturateEps(1.0-NdotV));float diffuseFresnel90=0.5+2.0*VdotH*VdotH*roughness;float fresnel =\n(1.0+(diffuseFresnel90-1.0)*diffuseFresnelNL) *\n(1.0+(diffuseFresnel90-1.0)*diffuseFresnelNV);return fresnel/PI;}\nconst float constant1_FON=0.5-2.0/(3.0*PI);const float constant2_FON=2.0/3.0-28.0/(15.0*PI);float E_FON_approx(float mu,float roughness)\n{float sigma=roughness; \nfloat mucomp=1.0-mu;float mucomp2=mucomp*mucomp;const mat2 Gcoeffs=mat2(0.0571085289,-0.332181442,\n0.491881867,0.0714429953);float GoverPi=dot(Gcoeffs*vec2(mucomp,mucomp2),vec2(1.0,mucomp2));return (1.0+sigma*GoverPi)/(1.0+constant1_FON*sigma);}\nvec3 diffuseBRDF_EON(vec3 albedo,float roughness,float NdotL,float NdotV,float LdotV)\n{vec3 rho=albedo;float sigma=roughness; \nfloat mu_i=NdotL; \nfloat mu_o=NdotV; \nfloat s=LdotV-mu_i*mu_o; \nfloat sovertF=s>0.0 ? s/max(mu_i,mu_o) : s; \nfloat AF=1.0/(1.0+constant1_FON*sigma); \nvec3 f_ss=(rho*RECIPROCAL_PI)*AF*(1.0+sigma*sovertF); \nfloat EFo=E_FON_approx(mu_o,sigma); \nfloat EFi=E_FON_approx(mu_i,sigma); \nfloat avgEF=AF*(1.0+constant2_FON*sigma); \nvec3 rho_ms=(rho*rho)*avgEF/(vec3(1.0)-rho*(1.0-avgEF));const float eps=1.0e-7;vec3 f_ms=(rho_ms*RECIPROCAL_PI)*max(eps,1.0-EFo) \n* max(eps,1.0-EFi)\n/ max(eps,1.0-avgEF);return (f_ss+f_ms);}\n#ifdef SS_TRANSLUCENCY\nvec3 transmittanceBRDF_Burley(const vec3 tintColor,const vec3 diffusionDistance,float thickness) {vec3 S=1./maxEps(diffusionDistance);vec3 temp=exp((-0.333333333*thickness)*S);return tintColor.rgb*0.25*(temp*temp*temp+3.0*temp);}\nfloat computeWrappedDiffuseNdotL(float NdotL,float w) {float t=1.0+w;float invt2=1.0/square(t);return saturate((NdotL+w)*invt2);}\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const pbrBRDFFunctions = { name, shader };\n"]}
@@ -14,6 +14,9 @@ vec3 clearCoatBase=vec3(0.,0.,0.);
14
14
  #ifdef SHEEN
15
15
  vec3 sheenBase=vec3(0.,0.,0.);
16
16
  #endif
17
+ #if defined(SPECULARTERM) && defined(LIGHT0)
18
+ vec3 fresnel;vec3 coloredFresnel;
19
+ #endif
17
20
  preLightingInfo preInfo;lightingInfo info;float shadow=1.;
18
21
  float aggShadow=0.;float numLights=0.;
19
22
  #if defined(CLEARCOAT) && defined(CLEARCOAT_TINT)
@@ -1 +1 @@
1
- {"version":3,"file":"pbrBlockDirectLighting.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/pbrBlockDirectLighting.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,wBAAwB,CAAC;AACtC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;CAkBd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"pbrBlockDirectLighting\";\nconst shader = `vec3 diffuseBase=vec3(0.,0.,0.);\n#ifdef SS_TRANSLUCENCY\nvec3 diffuseTransmissionBase=vec3(0.,0.,0.);\n#endif\n#ifdef SPECULARTERM\nvec3 specularBase=vec3(0.,0.,0.);\n#endif\n#ifdef CLEARCOAT\nvec3 clearCoatBase=vec3(0.,0.,0.);\n#endif\n#ifdef SHEEN\nvec3 sheenBase=vec3(0.,0.,0.);\n#endif\npreLightingInfo preInfo;lightingInfo info;float shadow=1.; \nfloat aggShadow=0.;float numLights=0.;\n#if defined(CLEARCOAT) && defined(CLEARCOAT_TINT)\nvec3 absorption=vec3(0.);\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const pbrBlockDirectLighting = { name, shader };\n"]}
1
+ {"version":3,"file":"pbrBlockDirectLighting.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/pbrBlockDirectLighting.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,wBAAwB,CAAC;AACtC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"pbrBlockDirectLighting\";\nconst shader = `vec3 diffuseBase=vec3(0.,0.,0.);\n#ifdef SS_TRANSLUCENCY\nvec3 diffuseTransmissionBase=vec3(0.,0.,0.);\n#endif\n#ifdef SPECULARTERM\nvec3 specularBase=vec3(0.,0.,0.);\n#endif\n#ifdef CLEARCOAT\nvec3 clearCoatBase=vec3(0.,0.,0.);\n#endif\n#ifdef SHEEN\nvec3 sheenBase=vec3(0.,0.,0.);\n#endif\n#if defined(SPECULARTERM) && defined(LIGHT0)\nvec3 fresnel;vec3 coloredFresnel;\n#endif\npreLightingInfo preInfo;lightingInfo info;float shadow=1.; \nfloat aggShadow=0.;float numLights=0.;\n#if defined(CLEARCOAT) && defined(CLEARCOAT_TINT)\nvec3 absorption=vec3(0.);\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const pbrBlockDirectLighting = { name, shader };\n"]}
@@ -4,19 +4,32 @@ const name = "pbrBlockFinalLitComponents";
4
4
  const shader = `aggShadow=aggShadow/numLights;
5
5
  #if defined(ENVIRONMENTBRDF)
6
6
  #ifdef MS_BRDF_ENERGY_CONSERVATION
7
- vec3 energyConservationFactor=getEnergyConservationFactor(clearcoatOut.specularEnvironmentR0,environmentBrdf);
7
+ vec3 baseSpecularEnergyConservationFactor=getEnergyConservationFactor(vec3(reflectanceF0),environmentBrdf);vec3 coloredEnergyConservationFactor=getEnergyConservationFactor(clearcoatOut.specularEnvironmentR0,environmentBrdf);
8
8
  #endif
9
9
  #endif
10
+ #if defined(SHEEN) && defined(SHEEN_ALBEDOSCALING) && defined(ENVIRONMENTBRDF)
11
+ surfaceAlbedo.rgb=sheenOut.sheenAlbedoScaling*surfaceAlbedo.rgb;
12
+ #endif
13
+ #ifdef LEGACY_SPECULAR_ENERGY_CONSERVATION
10
14
  #ifndef METALLICWORKFLOW
11
15
  #ifdef SPECULAR_GLOSSINESS_ENERGY_CONSERVATION
12
- surfaceAlbedo.rgb=(1.-reflectance)*surfaceAlbedo.rgb;
16
+ surfaceAlbedo.rgb=(1.-reflectanceF0)*surfaceAlbedo.rgb;
13
17
  #endif
14
18
  #endif
15
- #if defined(SHEEN) && defined(SHEEN_ALBEDOSCALING) && defined(ENVIRONMENTBRDF)
16
- surfaceAlbedo.rgb=sheenOut.sheenAlbedoScaling*surfaceAlbedo.rgb;
17
19
  #endif
18
20
  #ifdef REFLECTION
19
21
  vec3 finalIrradiance=reflectionOut.environmentIrradiance;
22
+ #ifndef LEGACY_SPECULAR_ENERGY_CONSERVATION
23
+ #if defined(METALLICWORKFLOW) || defined(SPECULAR_GLOSSINESS_ENERGY_CONSERVATION)
24
+ vec3 baseSpecularEnergy=vec3(baseSpecularEnvironmentReflectance);
25
+ #if defined(ENVIRONMENTBRDF)
26
+ #ifdef MS_BRDF_ENERGY_CONSERVATION
27
+ baseSpecularEnergy*=baseSpecularEnergyConservationFactor;
28
+ #endif
29
+ #endif
30
+ finalIrradiance*=clamp(vec3(1.0)-baseSpecularEnergy,0.0,1.0);
31
+ #endif
32
+ #endif
20
33
  #if defined(CLEARCOAT)
21
34
  finalIrradiance*=clearcoatOut.conservationFactor;
22
35
  #if defined(CLEARCOAT_TINT)
@@ -27,7 +40,7 @@ finalIrradiance*=clearcoatOut.absorption;
27
40
  finalIrradiance*=surfaceAlbedo.rgb;
28
41
  #endif
29
42
  #if defined(SS_REFRACTION)
30
- finalIrradiance*=subSurfaceOut.refractionFactorForIrradiance;
43
+ finalIrradiance*=subSurfaceOut.refractionOpacity;
31
44
  #endif
32
45
  #if defined(SS_TRANSLUCENCY)
33
46
  finalIrradiance*=(1.0-subSurfaceOut.translucencyIntensity);finalIrradiance+=subSurfaceOut.refractionIrradiance;
@@ -40,16 +53,16 @@ finalIrradiance*=vLightingIntensity.z;finalIrradiance*=aoOut.ambientOcclusionCol
40
53
  #ifdef SPECULARTERM
41
54
  vec3 finalSpecular=specularBase;finalSpecular=max(finalSpecular,0.0);vec3 finalSpecularScaled=finalSpecular*vLightingIntensity.x*vLightingIntensity.w;
42
55
  #if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)
43
- finalSpecularScaled*=energyConservationFactor;
56
+ finalSpecularScaled*=coloredEnergyConservationFactor;
44
57
  #endif
45
58
  #if defined(SHEEN) && defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)
46
59
  finalSpecularScaled*=sheenOut.sheenAlbedoScaling;
47
60
  #endif
48
61
  #endif
49
62
  #ifdef REFLECTION
50
- vec3 finalRadiance=reflectionOut.environmentRadiance.rgb;finalRadiance*=subSurfaceOut.specularEnvironmentReflectance;vec3 finalRadianceScaled=finalRadiance*vLightingIntensity.z;
63
+ vec3 finalRadiance=reflectionOut.environmentRadiance.rgb;finalRadiance*=cumulativeSpecularEnvironmentReflectance;vec3 finalRadianceScaled=finalRadiance*vLightingIntensity.z;
51
64
  #if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)
52
- finalRadianceScaled*=energyConservationFactor;
65
+ finalRadianceScaled*=coloredEnergyConservationFactor;
53
66
  #endif
54
67
  #if defined(SHEEN) && defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)
55
68
  finalRadianceScaled*=sheenOut.sheenAlbedoScaling;
@@ -1 +1 @@
1
- {"version":3,"file":"pbrBlockFinalLitComponents.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/pbrBlockFinalLitComponents.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,4BAA4B,CAAC;AAC1C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Fd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"pbrBlockFinalLitComponents\";\nconst shader = `aggShadow=aggShadow/numLights;\n#if defined(ENVIRONMENTBRDF)\n#ifdef MS_BRDF_ENERGY_CONSERVATION\nvec3 energyConservationFactor=getEnergyConservationFactor(clearcoatOut.specularEnvironmentR0,environmentBrdf);\n#endif\n#endif\n#ifndef METALLICWORKFLOW\n#ifdef SPECULAR_GLOSSINESS_ENERGY_CONSERVATION\nsurfaceAlbedo.rgb=(1.-reflectance)*surfaceAlbedo.rgb;\n#endif\n#endif\n#if defined(SHEEN) && defined(SHEEN_ALBEDOSCALING) && defined(ENVIRONMENTBRDF)\nsurfaceAlbedo.rgb=sheenOut.sheenAlbedoScaling*surfaceAlbedo.rgb;\n#endif\n#ifdef REFLECTION\nvec3 finalIrradiance=reflectionOut.environmentIrradiance;\n#if defined(CLEARCOAT)\nfinalIrradiance*=clearcoatOut.conservationFactor;\n#if defined(CLEARCOAT_TINT)\nfinalIrradiance*=clearcoatOut.absorption;\n#endif\n#endif\n#ifndef SS_APPLY_ALBEDO_AFTER_SUBSURFACE\nfinalIrradiance*=surfaceAlbedo.rgb;\n#endif\n#if defined(SS_REFRACTION)\nfinalIrradiance*=subSurfaceOut.refractionFactorForIrradiance;\n#endif\n#if defined(SS_TRANSLUCENCY)\nfinalIrradiance*=(1.0-subSurfaceOut.translucencyIntensity);finalIrradiance+=subSurfaceOut.refractionIrradiance;\n#endif\n#ifdef SS_APPLY_ALBEDO_AFTER_SUBSURFACE\nfinalIrradiance*=surfaceAlbedo.rgb;\n#endif\nfinalIrradiance*=vLightingIntensity.z;finalIrradiance*=aoOut.ambientOcclusionColor;\n#endif\n#ifdef SPECULARTERM\nvec3 finalSpecular=specularBase;finalSpecular=max(finalSpecular,0.0);vec3 finalSpecularScaled=finalSpecular*vLightingIntensity.x*vLightingIntensity.w;\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nfinalSpecularScaled*=energyConservationFactor;\n#endif\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)\nfinalSpecularScaled*=sheenOut.sheenAlbedoScaling;\n#endif\n#endif\n#ifdef REFLECTION\nvec3 finalRadiance=reflectionOut.environmentRadiance.rgb;finalRadiance*=subSurfaceOut.specularEnvironmentReflectance;vec3 finalRadianceScaled=finalRadiance*vLightingIntensity.z;\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nfinalRadianceScaled*=energyConservationFactor;\n#endif\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)\nfinalRadianceScaled*=sheenOut.sheenAlbedoScaling;\n#endif\n#endif\n#ifdef SHEEN\nvec3 finalSheen=sheenBase*sheenOut.sheenColor;finalSheen=max(finalSheen,0.0);vec3 finalSheenScaled=finalSheen*vLightingIntensity.x*vLightingIntensity.w;\n#if defined(CLEARCOAT) && defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nsheenOut.finalSheenRadianceScaled*=clearcoatOut.conservationFactor;\n#if defined(CLEARCOAT_TINT)\nsheenOut.finalSheenRadianceScaled*=clearcoatOut.absorption;\n#endif\n#endif\n#endif\n#ifdef CLEARCOAT\nvec3 finalClearCoat=clearCoatBase;finalClearCoat=max(finalClearCoat,0.0);vec3 finalClearCoatScaled=finalClearCoat*vLightingIntensity.x*vLightingIntensity.w;\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nfinalClearCoatScaled*=clearcoatOut.energyConservationFactorClearCoat;\n#endif\n#ifdef SS_REFRACTION\nsubSurfaceOut.finalRefraction*=clearcoatOut.conservationFactor;\n#ifdef CLEARCOAT_TINT\nsubSurfaceOut.finalRefraction*=clearcoatOut.absorption;\n#endif\n#endif\n#endif\n#ifdef ALPHABLEND\nfloat luminanceOverAlpha=0.0;\n#if defined(REFLECTION) && defined(RADIANCEOVERALPHA)\nluminanceOverAlpha+=getLuminance(finalRadianceScaled);\n#if defined(CLEARCOAT)\nluminanceOverAlpha+=getLuminance(clearcoatOut.finalClearCoatRadianceScaled);\n#endif\n#endif\n#if defined(SPECULARTERM) && defined(SPECULAROVERALPHA)\nluminanceOverAlpha+=getLuminance(finalSpecularScaled);\n#endif\n#if defined(CLEARCOAT) && defined(CLEARCOATOVERALPHA)\nluminanceOverAlpha+=getLuminance(finalClearCoatScaled);\n#endif\n#if defined(RADIANCEOVERALPHA) || defined(SPECULAROVERALPHA) || defined(CLEARCOATOVERALPHA)\nalpha=saturate(alpha+luminanceOverAlpha*luminanceOverAlpha);\n#endif\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const pbrBlockFinalLitComponents = { name, shader };\n"]}
1
+ {"version":3,"file":"pbrBlockFinalLitComponents.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/pbrBlockFinalLitComponents.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,4BAA4B,CAAC;AAC1C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0Gd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"pbrBlockFinalLitComponents\";\nconst shader = `aggShadow=aggShadow/numLights;\n#if defined(ENVIRONMENTBRDF)\n#ifdef MS_BRDF_ENERGY_CONSERVATION\nvec3 baseSpecularEnergyConservationFactor=getEnergyConservationFactor(vec3(reflectanceF0),environmentBrdf);vec3 coloredEnergyConservationFactor=getEnergyConservationFactor(clearcoatOut.specularEnvironmentR0,environmentBrdf);\n#endif\n#endif\n#if defined(SHEEN) && defined(SHEEN_ALBEDOSCALING) && defined(ENVIRONMENTBRDF)\nsurfaceAlbedo.rgb=sheenOut.sheenAlbedoScaling*surfaceAlbedo.rgb;\n#endif\n#ifdef LEGACY_SPECULAR_ENERGY_CONSERVATION\n#ifndef METALLICWORKFLOW\n#ifdef SPECULAR_GLOSSINESS_ENERGY_CONSERVATION\nsurfaceAlbedo.rgb=(1.-reflectanceF0)*surfaceAlbedo.rgb;\n#endif\n#endif\n#endif\n#ifdef REFLECTION\nvec3 finalIrradiance=reflectionOut.environmentIrradiance;\n#ifndef LEGACY_SPECULAR_ENERGY_CONSERVATION\n#if defined(METALLICWORKFLOW) || defined(SPECULAR_GLOSSINESS_ENERGY_CONSERVATION)\nvec3 baseSpecularEnergy=vec3(baseSpecularEnvironmentReflectance);\n#if defined(ENVIRONMENTBRDF)\n#ifdef MS_BRDF_ENERGY_CONSERVATION\nbaseSpecularEnergy*=baseSpecularEnergyConservationFactor;\n#endif\n#endif\nfinalIrradiance*=clamp(vec3(1.0)-baseSpecularEnergy,0.0,1.0);\n#endif\n#endif\n#if defined(CLEARCOAT)\nfinalIrradiance*=clearcoatOut.conservationFactor;\n#if defined(CLEARCOAT_TINT)\nfinalIrradiance*=clearcoatOut.absorption;\n#endif\n#endif\n#ifndef SS_APPLY_ALBEDO_AFTER_SUBSURFACE\nfinalIrradiance*=surfaceAlbedo.rgb;\n#endif\n#if defined(SS_REFRACTION)\nfinalIrradiance*=subSurfaceOut.refractionOpacity;\n#endif\n#if defined(SS_TRANSLUCENCY)\nfinalIrradiance*=(1.0-subSurfaceOut.translucencyIntensity);finalIrradiance+=subSurfaceOut.refractionIrradiance;\n#endif\n#ifdef SS_APPLY_ALBEDO_AFTER_SUBSURFACE\nfinalIrradiance*=surfaceAlbedo.rgb;\n#endif\nfinalIrradiance*=vLightingIntensity.z;finalIrradiance*=aoOut.ambientOcclusionColor;\n#endif\n#ifdef SPECULARTERM\nvec3 finalSpecular=specularBase;finalSpecular=max(finalSpecular,0.0);vec3 finalSpecularScaled=finalSpecular*vLightingIntensity.x*vLightingIntensity.w;\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nfinalSpecularScaled*=coloredEnergyConservationFactor;\n#endif\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)\nfinalSpecularScaled*=sheenOut.sheenAlbedoScaling;\n#endif\n#endif\n#ifdef REFLECTION\nvec3 finalRadiance=reflectionOut.environmentRadiance.rgb;finalRadiance*=cumulativeSpecularEnvironmentReflectance;vec3 finalRadianceScaled=finalRadiance*vLightingIntensity.z;\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nfinalRadianceScaled*=coloredEnergyConservationFactor;\n#endif\n#if defined(SHEEN) && defined(ENVIRONMENTBRDF) && defined(SHEEN_ALBEDOSCALING)\nfinalRadianceScaled*=sheenOut.sheenAlbedoScaling;\n#endif\n#endif\n#ifdef SHEEN\nvec3 finalSheen=sheenBase*sheenOut.sheenColor;finalSheen=max(finalSheen,0.0);vec3 finalSheenScaled=finalSheen*vLightingIntensity.x*vLightingIntensity.w;\n#if defined(CLEARCOAT) && defined(REFLECTION) && defined(ENVIRONMENTBRDF)\nsheenOut.finalSheenRadianceScaled*=clearcoatOut.conservationFactor;\n#if defined(CLEARCOAT_TINT)\nsheenOut.finalSheenRadianceScaled*=clearcoatOut.absorption;\n#endif\n#endif\n#endif\n#ifdef CLEARCOAT\nvec3 finalClearCoat=clearCoatBase;finalClearCoat=max(finalClearCoat,0.0);vec3 finalClearCoatScaled=finalClearCoat*vLightingIntensity.x*vLightingIntensity.w;\n#if defined(ENVIRONMENTBRDF) && defined(MS_BRDF_ENERGY_CONSERVATION)\nfinalClearCoatScaled*=clearcoatOut.energyConservationFactorClearCoat;\n#endif\n#ifdef SS_REFRACTION\nsubSurfaceOut.finalRefraction*=clearcoatOut.conservationFactor;\n#ifdef CLEARCOAT_TINT\nsubSurfaceOut.finalRefraction*=clearcoatOut.absorption;\n#endif\n#endif\n#endif\n#ifdef ALPHABLEND\nfloat luminanceOverAlpha=0.0;\n#if defined(REFLECTION) && defined(RADIANCEOVERALPHA)\nluminanceOverAlpha+=getLuminance(finalRadianceScaled);\n#if defined(CLEARCOAT)\nluminanceOverAlpha+=getLuminance(clearcoatOut.finalClearCoatRadianceScaled);\n#endif\n#endif\n#if defined(SPECULARTERM) && defined(SPECULAROVERALPHA)\nluminanceOverAlpha+=getLuminance(finalSpecularScaled);\n#endif\n#if defined(CLEARCOAT) && defined(CLEARCOATOVERALPHA)\nluminanceOverAlpha+=getLuminance(finalClearCoatScaled);\n#endif\n#if defined(RADIANCEOVERALPHA) || defined(SPECULAROVERALPHA) || defined(CLEARCOATOVERALPHA)\nalpha=saturate(alpha+luminanceOverAlpha*luminanceOverAlpha);\n#endif\n#endif\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const pbrBlockFinalLitComponents = { name, shader };\n"]}
@@ -2,6 +2,9 @@
2
2
  import { ShaderStore } from "../../Engines/shaderStore.js";
3
3
  const name = "pbrBlockFinalUnlitComponents";
4
4
  const shader = `vec3 finalDiffuse=diffuseBase;finalDiffuse*=surfaceAlbedo;
5
+ #if defined(SS_REFRACTION) && !defined(UNLIT)
6
+ finalDiffuse*=subSurfaceOut.refractionOpacity;
7
+ #endif
5
8
  #if defined(SS_TRANSLUCENCY) && !defined(UNLIT)
6
9
  finalDiffuse+=diffuseTransmissionBase;
7
10
  #endif
@@ -1 +1 @@
1
- {"version":3,"file":"pbrBlockFinalUnlitComponents.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,8BAA8B,CAAC;AAC5C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"pbrBlockFinalUnlitComponents\";\nconst shader = `vec3 finalDiffuse=diffuseBase;finalDiffuse*=surfaceAlbedo;\n#if defined(SS_TRANSLUCENCY) && !defined(UNLIT)\nfinalDiffuse+=diffuseTransmissionBase;\n#endif\nfinalDiffuse=max(finalDiffuse,0.0);finalDiffuse*=vLightingIntensity.x;vec3 finalAmbient=vAmbientColor;finalAmbient*=surfaceAlbedo.rgb;vec3 finalEmissive=vEmissiveColor;\n#ifdef EMISSIVE\nvec3 emissiveColorTex=texture2D(emissiveSampler,vEmissiveUV+uvOffset).rgb;\n#ifdef GAMMAEMISSIVE\nfinalEmissive*=toLinearSpace(emissiveColorTex.rgb);\n#else\nfinalEmissive*=emissiveColorTex.rgb;\n#endif\nfinalEmissive*= vEmissiveInfos.y;\n#endif\nfinalEmissive*=vLightingIntensity.y;\n#ifdef AMBIENT\nvec3 ambientOcclusionForDirectDiffuse=mix(vec3(1.),aoOut.ambientOcclusionColor,vAmbientInfos.w);\n#else\nvec3 ambientOcclusionForDirectDiffuse=aoOut.ambientOcclusionColor;\n#endif\nfinalAmbient*=aoOut.ambientOcclusionColor;finalDiffuse*=ambientOcclusionForDirectDiffuse;\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const pbrBlockFinalUnlitComponents = { name, shader };\n"]}
1
+ {"version":3,"file":"pbrBlockFinalUnlitComponents.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/pbrBlockFinalUnlitComponents.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,8BAA8B,CAAC;AAC5C,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBd,CAAC;AACF,aAAa;AACb,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1C,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACpD,CAAC;AACD,gBAAgB;AAChB,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"pbrBlockFinalUnlitComponents\";\nconst shader = `vec3 finalDiffuse=diffuseBase;finalDiffuse*=surfaceAlbedo;\n#if defined(SS_REFRACTION) && !defined(UNLIT)\nfinalDiffuse*=subSurfaceOut.refractionOpacity;\n#endif\n#if defined(SS_TRANSLUCENCY) && !defined(UNLIT)\nfinalDiffuse+=diffuseTransmissionBase;\n#endif\nfinalDiffuse=max(finalDiffuse,0.0);finalDiffuse*=vLightingIntensity.x;vec3 finalAmbient=vAmbientColor;finalAmbient*=surfaceAlbedo.rgb;vec3 finalEmissive=vEmissiveColor;\n#ifdef EMISSIVE\nvec3 emissiveColorTex=texture2D(emissiveSampler,vEmissiveUV+uvOffset).rgb;\n#ifdef GAMMAEMISSIVE\nfinalEmissive*=toLinearSpace(emissiveColorTex.rgb);\n#else\nfinalEmissive*=emissiveColorTex.rgb;\n#endif\nfinalEmissive*= vEmissiveInfos.y;\n#endif\nfinalEmissive*=vLightingIntensity.y;\n#ifdef AMBIENT\nvec3 ambientOcclusionForDirectDiffuse=mix(vec3(1.),aoOut.ambientOcclusionColor,vAmbientInfos.w);\n#else\nvec3 ambientOcclusionForDirectDiffuse=aoOut.ambientOcclusionColor;\n#endif\nfinalAmbient*=aoOut.ambientOcclusionColor;finalDiffuse*=ambientOcclusionForDirectDiffuse;\n`;\n// Sideeffect\nif (!ShaderStore.IncludesShadersStore[name]) {\n ShaderStore.IncludesShadersStore[name] = shader;\n}\n/** @internal */\nexport const pbrBlockFinalUnlitComponents = { name, shader };\n"]}