From cf248fe094cec52eb41807728470594815de596b Mon Sep 17 00:00:00 2001 From: Jeshurun Hembd Date: Thu, 20 Jun 2024 19:15:56 -0400 Subject: [PATCH 1/3] Fix f0 calculation for KHR_materials_specular extension --- .../Source/Shaders/Builtin/Structs/modelMaterial.glsl | 2 ++ packages/engine/Source/Shaders/Model/MaterialStageFS.glsl | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/engine/Source/Shaders/Builtin/Structs/modelMaterial.glsl b/packages/engine/Source/Shaders/Builtin/Structs/modelMaterial.glsl index 3802a9a9a068..1a787115cdc2 100644 --- a/packages/engine/Source/Shaders/Builtin/Structs/modelMaterial.glsl +++ b/packages/engine/Source/Shaders/Builtin/Structs/modelMaterial.glsl @@ -10,6 +10,7 @@ * @name czm_modelMaterial * @glslStruct * + * @property {vec4} baseColor The base color of the material. * @property {vec3} diffuse Incoming light that scatters evenly in all directions. * @property {float} alpha Alpha of this material. 0.0 is completely transparent; 1.0 is completely opaque. * @property {vec3} specular Color of reflected light at normal incidence in PBR materials. This is sometimes referred to as f0 in the literature. @@ -19,6 +20,7 @@ * @property {vec3} emissive Light emitted by the material equally in all directions. The default is vec3(0.0), which emits no light. */ struct czm_modelMaterial { + vec4 baseColor; vec3 diffuse; float alpha; vec3 specular; diff --git a/packages/engine/Source/Shaders/Model/MaterialStageFS.glsl b/packages/engine/Source/Shaders/Model/MaterialStageFS.glsl index baabb3909efb..cca132e92331 100644 --- a/packages/engine/Source/Shaders/Model/MaterialStageFS.glsl +++ b/packages/engine/Source/Shaders/Model/MaterialStageFS.glsl @@ -296,12 +296,12 @@ float setMetallicRoughness(inout czm_modelMaterial material) // dielectrics use f0 = 0.04, metals use albedo as f0 const vec3 REFLECTANCE_DIELECTRIC = vec3(0.04); - vec3 f0 = mix(REFLECTANCE_DIELECTRIC, material.diffuse, metalness); + vec3 f0 = mix(REFLECTANCE_DIELECTRIC, material.baseColor.rgb, metalness); material.specular = f0; // diffuse only applies to dielectrics. - material.diffuse = material.diffuse * (1.0 - f0) * (1.0 - metalness); + material.diffuse = mix(material.baseColor.rgb, vec3(0), metalness); // roughness is authored as perceptual roughness // square it to get material roughness @@ -349,7 +349,7 @@ void setSpecular(inout czm_modelMaterial material, in float metalness) material.specularWeight = specularWeight; vec3 f0 = material.specular; vec3 dielectricSpecularF0 = min(f0 * specularColorFactor, vec3(1.0)); - material.specular = mix(dielectricSpecularF0, material.diffuse, metalness); + material.specular = mix(dielectricSpecularF0, material.baseColor.rgb, metalness); } #endif #ifdef USE_ANISOTROPY @@ -458,6 +458,7 @@ void materialStage(inout czm_modelMaterial material, ProcessedAttributes attribu baseColorWithAlpha *= color; #endif + material.baseColor = baseColorWithAlpha; material.diffuse = baseColorWithAlpha.rgb; material.alpha = baseColorWithAlpha.a; From a9aaffee7943370cdb984082034039d346a40378 Mon Sep 17 00:00:00 2001 From: Jeshurun Hembd Date: Mon, 24 Jun 2024 15:30:19 -0400 Subject: [PATCH 2/3] Update CHANGES.md --- CHANGES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index df1a82639c0b..e1b14985df5e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -8,6 +8,10 @@ - Added support for the `scale` property of a normal texture in a glTF material. [#12018](https://github.com/CesiumGS/cesium/pull/12018) +##### Fixes :wrench: + +- Fixed diffuse color calculation for PBR materials. Many models will now appear slightly brighter. This also fixes an [issue affecting the KHR_materials_specular extension](https://github.com/CesiumGS/cesium/issues/12041). [#12043](https://github.com/CesiumGS/cesium/pull/12043) + ### 1.118.2 - 2024-06-03 This is an npm-only release to fix a dependency issue published in 1.118.1 From 38d2dadc8f18de9b805b1ab188dde14527bdc143 Mon Sep 17 00:00:00 2001 From: Jeshurun Hembd Date: Mon, 24 Jun 2024 15:54:22 -0400 Subject: [PATCH 3/3] PR feedback --- CHANGES.md | 3 ++- packages/engine/Source/Shaders/Model/MaterialStageFS.glsl | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 6ece33c04c64..77bf6bec33b5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -14,7 +14,8 @@ ##### Fixes :wrench: -- Fixed diffuse color calculation for PBR materials. Many models will now appear slightly brighter. This also fixes an [issue affecting the KHR_materials_specular extension](https://github.com/CesiumGS/cesium/issues/12041). [#12043](https://github.com/CesiumGS/cesium/pull/12043) +- Fixed diffuse color calculation for PBR materials. Many models will now appear slightly brighter. [#12043](https://github.com/CesiumGS/cesium/pull/12043) +- Fixed the calculation of base color in materials using the KHR_materials_specular extension [#12041](https://github.com/CesiumGS/cesium/issues/12041). - Fixed issue where Entities would not use a custom ellipsoid. [#3543](https://github.com/CesiumGS/cesium/issues/3543) ##### Breaking Changes :mega: diff --git a/packages/engine/Source/Shaders/Model/MaterialStageFS.glsl b/packages/engine/Source/Shaders/Model/MaterialStageFS.glsl index cca132e92331..7f23f3b274cc 100644 --- a/packages/engine/Source/Shaders/Model/MaterialStageFS.glsl +++ b/packages/engine/Source/Shaders/Model/MaterialStageFS.glsl @@ -301,7 +301,7 @@ float setMetallicRoughness(inout czm_modelMaterial material) material.specular = f0; // diffuse only applies to dielectrics. - material.diffuse = mix(material.baseColor.rgb, vec3(0), metalness); + material.diffuse = mix(material.baseColor.rgb, vec3(0.0), metalness); // roughness is authored as perceptual roughness // square it to get material roughness