diff --git a/CHANGES.md b/CHANGES.md index 66f7ee647925..d7867be92da3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -14,6 +14,8 @@ ##### Fixes :wrench: +- 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) - Fixed issue where Property 'availability' is missing in type 'CustomHeightmapTerrainProvider' but required in type 'TerrainProvider' when using with typescript 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..7f23f3b274cc 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.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;