diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 185bbae1ed..5c2a77ed1b 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -6,12 +6,13 @@ A new header is inserted each time a *tag* is created. ## Next release - The Android support libraries (gltfio and filament-utils) now use dynamic linking. -- Screen-space refraction is now supported. - Removed depth-prepass related APIs. (⚠ API Change) - gltfio: add asynchronous API to ResourceLoader. - gltfio: generate normals for flat-shaded models that do not have normals. - Material instances now allow dynamic depth testing and other rasterization state. -- Support for Bloom as a post-process effect. +- Unlit materials now apply emissive in the same way as lit materials. +- Screen-space refraction is now supported. +- Support for HDR Bloom as a post-process effect. - Added Java bindings for geometry::SurfaceOrientation. - Fixed bug rendering transparent objects with Metal backend. - Fixed crash on macOS Catalina when rendering with Metal backend. diff --git a/samples/material_sandbox.cpp b/samples/material_sandbox.cpp index 3b8f216421..636b764816 100644 --- a/samples/material_sandbox.cpp +++ b/samples/material_sandbox.cpp @@ -299,6 +299,89 @@ static void setup(Engine* engine, View*, Scene* scene) { g_params.bloomOptions.dirt = FilamentApp::get().getDirtTexture(); } +static filament::MaterialInstance* updateInstances( + SandboxParameters& params, filament::Engine& engine) { + + int material = params.currentMaterialModel; + if (material == MATERIAL_MODEL_LIT) { + if (params.currentBlending == BLENDING_TRANSPARENT) material = MATERIAL_TRANSPARENT; + if (params.currentBlending == BLENDING_FADE) material = MATERIAL_FADE; + if (params.ssr) { + if (params.currentBlending == BLENDING_THIN_REFRACTION) material = MATERIAL_THIN_SS_REFRACTION; + if (params.currentBlending == BLENDING_SOLID_REFRACTION) material = MATERIAL_SOLID_SS_REFRACTION; + } else { + if (params.currentBlending == BLENDING_THIN_REFRACTION) material = MATERIAL_THIN_REFRACTION; + if (params.currentBlending == BLENDING_SOLID_REFRACTION) material = MATERIAL_SOLID_REFRACTION; + } + } + + bool hasRefraction = params.currentBlending == BLENDING_THIN_REFRACTION || + params.currentBlending == BLENDING_SOLID_REFRACTION; + + MaterialInstance* materialInstance = params.materialInstance[material]; + materialInstance->setParameter("baseColor", RgbType::sRGB, params.color); + + if (params.currentMaterialModel != MATERIAL_MODEL_CLOTH) { + math::float4 emissive(Color::toLinear(params.emissiveColor), params.emissiveEC); + materialInstance->setParameter("emissive", emissive); + } + + if (params.currentMaterialModel == MATERIAL_MODEL_LIT) { + materialInstance->setParameter("roughness", params.roughness); + materialInstance->setParameter("metallic", params.metallic); + if (!hasRefraction) { + materialInstance->setParameter("reflectance", params.reflectance); + } + materialInstance->setParameter("clearCoat", params.clearCoat); + materialInstance->setParameter("clearCoatRoughness", params.clearCoatRoughness); + materialInstance->setParameter("anisotropy", params.anisotropy); + + if (params.currentBlending != BLENDING_OPAQUE) { + materialInstance->setParameter("alpha", params.alpha); + } + + if (hasRefraction) { + math::float3 color = Color::toLinear(params.transmittanceColor); + materialInstance->setParameter("absorption", + Color::absorptionAtDistance(color, params.distance)); + materialInstance->setParameter("ior", params.ior); + materialInstance->setParameter("transmission", params.transmission); + materialInstance->setParameter("thickness", params.thickness); + } + } + + if (params.currentMaterialModel == MATERIAL_MODEL_SPECGLOSS) { + materialInstance->setParameter("glossiness", params.glossiness); + materialInstance->setParameter("specularColor", params.specularColor); + materialInstance->setParameter("reflectance", params.reflectance); + materialInstance->setParameter("clearCoat", params.clearCoat); + materialInstance->setParameter("clearCoatRoughness", params.clearCoatRoughness); + materialInstance->setParameter("anisotropy", params.anisotropy); + } + + if (params.currentMaterialModel == MATERIAL_MODEL_SUBSURFACE) { + materialInstance->setParameter("roughness", params.roughness); + materialInstance->setParameter("metallic", params.metallic); + materialInstance->setParameter("reflectance", params.reflectance); + materialInstance->setParameter("thickness", params.thickness); + materialInstance->setParameter("subsurfacePower", params.subsurfacePower); + materialInstance->setParameter("subsurfaceColor", RgbType::sRGB, params.subsurfaceColor); + } + + if (params.currentMaterialModel == MATERIAL_MODEL_CLOTH) { + materialInstance->setParameter("roughness", params.roughness); + materialInstance->setParameter("sheenColor", RgbType::sRGB, params.sheenColor); + materialInstance->setParameter("subsurfaceColor", RgbType::sRGB, params.subsurfaceColor); + } + + if (params.currentMaterialModel != MATERIAL_MODEL_UNLIT) { + materialInstance->setSpecularAntiAliasingVariance(params.specularAntiAliasingVariance); + materialInstance->setSpecularAntiAliasingThreshold(params.specularAntiAliasingThreshold); + } + + return materialInstance; +} + static void gui(filament::Engine* engine, filament::View*) { auto& params = g_params; ImGui::SetNextWindowSize(ImVec2(0.0f, 0.0f)); @@ -368,7 +451,7 @@ static void gui(filament::Engine* engine, filament::View*) { } ImGui::ColorEdit3("emissiveColor", ¶ms.emissiveColor.r); - ImGui::SliderFloat("emissiveEC", ¶ms.emissiveEC, 0.0f, 6.0f); + ImGui::SliderFloat("emissiveEC", ¶ms.emissiveEC, 0.0f, 12.0f); } if (ImGui::CollapsingHeader("Shading AA")) { diff --git a/samples/material_sandbox.h b/samples/material_sandbox.h index ee0b372073..14d167e0ef 100644 --- a/samples/material_sandbox.h +++ b/samples/material_sandbox.h @@ -192,84 +192,4 @@ inline void createInstances(SandboxParameters& params, filament::Engine& engine) .build(engine, params.light); } -inline filament::MaterialInstance* updateInstances(SandboxParameters& params, - filament::Engine& engine) { - using namespace filament; - int material = params.currentMaterialModel; - if (material == MATERIAL_MODEL_LIT) { - if (params.currentBlending == BLENDING_TRANSPARENT) material = MATERIAL_TRANSPARENT; - if (params.currentBlending == BLENDING_FADE) material = MATERIAL_FADE; - if (params.ssr) { - if (params.currentBlending == BLENDING_THIN_REFRACTION) material = MATERIAL_THIN_SS_REFRACTION; - if (params.currentBlending == BLENDING_SOLID_REFRACTION) material = MATERIAL_SOLID_SS_REFRACTION; - } else { - if (params.currentBlending == BLENDING_THIN_REFRACTION) material = MATERIAL_THIN_REFRACTION; - if (params.currentBlending == BLENDING_SOLID_REFRACTION) material = MATERIAL_SOLID_REFRACTION; - } - } - - bool hasRefraction = params.currentBlending == BLENDING_THIN_REFRACTION || - params.currentBlending == BLENDING_SOLID_REFRACTION; - - MaterialInstance* materialInstance = params.materialInstance[material]; - materialInstance->setParameter("baseColor", RgbType::sRGB, params.color); - math::float4 emissive(Color::toLinear(params.emissiveColor), params.emissiveEC); - materialInstance->setParameter("emissive", emissive); - - if (params.currentMaterialModel == MATERIAL_MODEL_LIT) { - materialInstance->setParameter("roughness", params.roughness); - materialInstance->setParameter("metallic", params.metallic); - if (!hasRefraction) { - materialInstance->setParameter("reflectance", params.reflectance); - } - materialInstance->setParameter("clearCoat", params.clearCoat); - materialInstance->setParameter("clearCoatRoughness", params.clearCoatRoughness); - materialInstance->setParameter("anisotropy", params.anisotropy); - - if (params.currentBlending != BLENDING_OPAQUE) { - materialInstance->setParameter("alpha", params.alpha); - } - - if (hasRefraction) { - math::float3 color = Color::toLinear(params.transmittanceColor); - materialInstance->setParameter("absorption", - Color::absorptionAtDistance(color, params.distance)); - materialInstance->setParameter("ior", params.ior); - materialInstance->setParameter("transmission", params.transmission); - materialInstance->setParameter("thickness", params.thickness); - } - } - - if (params.currentMaterialModel == MATERIAL_MODEL_SPECGLOSS) { - materialInstance->setParameter("glossiness", params.glossiness); - materialInstance->setParameter("specularColor", params.specularColor); - materialInstance->setParameter("reflectance", params.reflectance); - materialInstance->setParameter("clearCoat", params.clearCoat); - materialInstance->setParameter("clearCoatRoughness", params.clearCoatRoughness); - materialInstance->setParameter("anisotropy", params.anisotropy); - } - - if (params.currentMaterialModel == MATERIAL_MODEL_SUBSURFACE) { - materialInstance->setParameter("roughness", params.roughness); - materialInstance->setParameter("metallic", params.metallic); - materialInstance->setParameter("reflectance", params.reflectance); - materialInstance->setParameter("thickness", params.thickness); - materialInstance->setParameter("subsurfacePower", params.subsurfacePower); - materialInstance->setParameter("subsurfaceColor", RgbType::sRGB, params.subsurfaceColor); - } - - if (params.currentMaterialModel == MATERIAL_MODEL_CLOTH) { - materialInstance->setParameter("roughness", params.roughness); - materialInstance->setParameter("sheenColor", RgbType::sRGB, params.sheenColor); - materialInstance->setParameter("subsurfaceColor", RgbType::sRGB, params.subsurfaceColor); - } - - if (params.currentMaterialModel != MATERIAL_MODEL_UNLIT) { - materialInstance->setSpecularAntiAliasingVariance(params.specularAntiAliasingVariance); - materialInstance->setSpecularAntiAliasingThreshold(params.specularAntiAliasingThreshold); - } - - return materialInstance; -} - #endif // TNT_FILAMENT_SAMPLES_MATERIAL_SANDBOX_H diff --git a/shaders/src/shading_unlit.fs b/shaders/src/shading_unlit.fs index 58a654fb6e..a0c5a2b276 100644 --- a/shaders/src/shading_unlit.fs +++ b/shaders/src/shading_unlit.fs @@ -1,3 +1,14 @@ +void addEmissive(const MaterialInputs material, inout vec4 color) { + #if defined(MATERIAL_HAS_EMISSIVE) + // The emissive property applies independently of the shading model + // It is defined as a color + exposure compensation + highp vec4 emissive = material.emissive; + highp float attenuation = computePreExposedIntensity( + pow(2.0, frameUniforms.ev100 + emissive.w - 3.0), frameUniforms.exposure); + color.rgb += emissive.rgb * attenuation; + #endif +} + /** * Evaluates unlit materials. In this lighting model, only the base color and * emissive properties are taken into account: @@ -21,9 +32,7 @@ vec4 evaluateMaterial(const MaterialInputs material) { } #endif -#if defined(MATERIAL_HAS_EMISSIVE) - color.rgb += material.emissive.rgb; -#endif + addEmissive(material, color); #if defined(HAS_DIRECTIONAL_LIGHTING) #if defined(HAS_SHADOWING)