diff --git a/Editor/ModelImporter_GLTF.cpp b/Editor/ModelImporter_GLTF.cpp index f9be957f8..4625daa31 100644 --- a/Editor/ModelImporter_GLTF.cpp +++ b/Editor/ModelImporter_GLTF.cpp @@ -650,6 +650,17 @@ void ImportModel_GLTF(const std::string& fileName, Scene& scene) material.shaderType = MaterialComponent::SHADERTYPE_UNLIT; } + auto ext_emissiveStrength = x.extensions.find("KHR_materials_emissive_strength"); + if (ext_emissiveStrength != x.extensions.end()) + { + // https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md + if (ext_emissiveStrength->second.Has("emissiveStrength")) + { + auto& factor = ext_emissiveStrength->second.Get("emissiveStrength"); + material.SetEmissiveStrength(float(factor.IsNumber() ? factor.Get() : factor.Get())); + } + } + auto ext_transmission = x.extensions.find("KHR_materials_transmission"); if (ext_transmission != x.extensions.end()) { @@ -3497,6 +3508,10 @@ void ExportModel_GLTF(const std::string& filename, Scene& scene) { state.gltfModel.extensionsUsed.push_back("KHR_materials_pbrSpecularGlossiness"); } + if (material.GetEmissiveStrength() != 1.0f) + { + state.gltfModel.extensionsUsed.push_back("KHR_materials_emissive_strength"); + } if (material.shaderType == MaterialComponent::SHADERTYPE::SHADERTYPE_PBR_CLOTH) { @@ -3655,9 +3670,9 @@ void ExportModel_GLTF(const std::string& filename, Scene& scene) material_builder.pbrMetallicRoughness.roughnessFactor = { material.roughness }; material_builder.pbrMetallicRoughness.metallicFactor = { material.metalness }; material_builder.emissiveFactor = { - material.emissiveColor.x * material.emissiveColor.w, - material.emissiveColor.y * material.emissiveColor.w, - material.emissiveColor.z * material.emissiveColor.w, + material.emissiveColor.x, + material.emissiveColor.y, + material.emissiveColor.z, }; if (material.alphaRef < 1.f) { @@ -3681,6 +3696,14 @@ void ExportModel_GLTF(const std::string& filename, Scene& scene) material_builder.extensions["KHR_materials_unlit"] = tinygltf::Value(); } + if (material.GetEmissiveStrength() != 1.0f) + { + tinygltf::Value::Object KHR_materials_emissive_strength_builder = { + {"emissiveStrength", tinygltf::Value(double(material.GetEmissiveStrength()))} + }; + material_builder.extensions["KHR_materials_emissive_strength"] = tinygltf::Value(KHR_materials_emissive_strength_builder); + } + // Transmission extension (KHR_materials_transmission) // Values if (material.transmission > 0 || material.textures[wi::scene::MaterialComponent::TRANSMISSIONMAP].resource.IsValid()) diff --git a/features.txt b/features.txt index 4466654c8..4b2ff9338 100644 --- a/features.txt +++ b/features.txt @@ -97,6 +97,7 @@ KHR_materials_clearcoat KHR_materials_specular KHR_materials_anisotropy KHR_materials_ior +KHR_materials_emissive_strength KHR_texture_basisu KHR_lights_punctual