diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index 75b18af69a..24c34a123f 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -42,6 +42,8 @@ set(MATERIAL_SRCS materials/sandboxLit.mat materials/sandboxLitFade.mat materials/sandboxLitTransparent.mat + materials/sandboxLitThinRefraction.mat + materials/sandboxLitSolidRefraction.mat materials/sandboxSpecGloss.mat materials/sandboxSubsurface.mat materials/sandboxUnlit.mat diff --git a/samples/material_sandbox.cpp b/samples/material_sandbox.cpp index c26789a4ba..da420a21f7 100644 --- a/samples/material_sandbox.cpp +++ b/samples/material_sandbox.cpp @@ -284,7 +284,7 @@ static void gui(filament::Engine* engine, filament::View*) { if (params.currentMaterialModel == MATERIAL_MODEL_LIT) { ImGui::Combo("blending", ¶ms.currentBlending, - "opaque\0transparent\0fade\0\0"); + "opaque\0transparent\0fade\0thin refraction\0solid refraction\0\0"); } ImGui::ColorEdit3("baseColor", ¶ms.color.r); @@ -320,6 +320,15 @@ static void gui(filament::Engine* engine, filament::View*) { ImGui::ColorEdit3("sheenColor", ¶ms.sheenColor.r); ImGui::ColorEdit3("subsurfaceColor", ¶ms.subsurfaceColor.r); } + + bool hasRefraction = params.currentBlending == BLENDING_THIN_REFRACTION || + params.currentBlending == BLENDING_SOLID_REFRACTION; + if (hasRefraction) { + ImGui::SliderFloat("ior", ¶ms.ior, 1.0f, 3.0f); + ImGui::SliderFloat("transmission", ¶ms.transmission, 0.0f, 1.0f); + ImGui::SliderFloat("thickness", ¶ms.thickness, 0.0f, 1.0f); + ImGui::ColorEdit3("absorption", ¶ms.absorption.r); + } } } diff --git a/samples/material_sandbox.h b/samples/material_sandbox.h index 399140c178..2d1da00078 100644 --- a/samples/material_sandbox.h +++ b/samples/material_sandbox.h @@ -37,18 +37,22 @@ constexpr uint8_t MATERIAL_MODEL_SUBSURFACE = 2; constexpr uint8_t MATERIAL_MODEL_CLOTH = 3; constexpr uint8_t MATERIAL_MODEL_SPECGLOSS = 4; -constexpr uint8_t MATERIAL_UNLIT = 0; -constexpr uint8_t MATERIAL_LIT = 1; -constexpr uint8_t MATERIAL_SUBSURFACE = 2; -constexpr uint8_t MATERIAL_CLOTH = 3; -constexpr uint8_t MATERIAL_SPECGLOSS = 4; -constexpr uint8_t MATERIAL_TRANSPARENT = 5; -constexpr uint8_t MATERIAL_FADE = 6; -constexpr uint8_t MATERIAL_COUNT = 7; +constexpr uint8_t MATERIAL_UNLIT = 0; +constexpr uint8_t MATERIAL_LIT = 1; +constexpr uint8_t MATERIAL_SUBSURFACE = 2; +constexpr uint8_t MATERIAL_CLOTH = 3; +constexpr uint8_t MATERIAL_SPECGLOSS = 4; +constexpr uint8_t MATERIAL_TRANSPARENT = 5; +constexpr uint8_t MATERIAL_FADE = 6; +constexpr uint8_t MATERIAL_THIN_REFRACTION = 7; +constexpr uint8_t MATERIAL_SOLID_REFRACTION = 8; +constexpr uint8_t MATERIAL_COUNT = 9; -constexpr uint8_t BLENDING_OPAQUE = 0; -constexpr uint8_t BLENDING_TRANSPARENT = 1; -constexpr uint8_t BLENDING_FADE = 2; +constexpr uint8_t BLENDING_OPAQUE = 0; +constexpr uint8_t BLENDING_TRANSPARENT = 1; +constexpr uint8_t BLENDING_FADE = 2; +constexpr uint8_t BLENDING_THIN_REFRACTION = 3; +constexpr uint8_t BLENDING_SOLID_REFRACTION = 4; struct SandboxParameters { const filament::Material* material[MATERIAL_COUNT]; @@ -66,6 +70,10 @@ struct SandboxParameters { float glossiness = 0.0f; float specularAntiAliasingVariance = 0.0f; float specularAntiAliasingThreshold = 0.0f; + float transmission = 1.0f; + filament::math::float3 absorption = 0.0f; + float ior = 1.5; + filament::sRGBColor specularColor = {0.0f, 0.0f, 0.0f}; filament::sRGBColor subsurfaceColor = {0.0f}; filament::sRGBColor sheenColor = {0.83f, 0.0f, 0.0f}; @@ -123,6 +131,18 @@ inline void createInstances(SandboxParameters& params, filament::Engine& engine) params.materialInstance[MATERIAL_FADE] = params.material[MATERIAL_FADE]->createInstance(); + params.material[MATERIAL_THIN_REFRACTION] = Material::Builder() + .package(RESOURCES_SANDBOXLITTHINREFRACTION_DATA, RESOURCES_SANDBOXLITTHINREFRACTION_SIZE) + .build(engine); + params.materialInstance[MATERIAL_THIN_REFRACTION] = + params.material[MATERIAL_THIN_REFRACTION]->createInstance(); + + params.material[MATERIAL_SOLID_REFRACTION] = Material::Builder() + .package(RESOURCES_SANDBOXLITSOLIDREFRACTION_DATA, RESOURCES_SANDBOXLITSOLIDREFRACTION_SIZE) + .build(engine); + params.materialInstance[MATERIAL_SOLID_REFRACTION] = + params.material[MATERIAL_SOLID_REFRACTION]->createInstance(); + params.material[MATERIAL_SUBSURFACE] = Material::Builder() .package(RESOURCES_SANDBOXSUBSURFACE_DATA, RESOURCES_SANDBOXSUBSURFACE_SIZE) .build(engine); @@ -160,7 +180,13 @@ inline filament::MaterialInstance* updateInstances(SandboxParameters& params, if (material == MATERIAL_MODEL_LIT) { if (params.currentBlending == BLENDING_TRANSPARENT) material = MATERIAL_TRANSPARENT; if (params.currentBlending == BLENDING_FADE) material = MATERIAL_FADE; + 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]; if (params.currentMaterialModel == MATERIAL_MODEL_UNLIT) { materialInstance->setParameter("baseColor", RgbType::sRGB, params.color); @@ -169,13 +195,21 @@ inline filament::MaterialInstance* updateInstances(SandboxParameters& params, materialInstance->setParameter("baseColor", RgbType::sRGB, params.color); materialInstance->setParameter("roughness", params.roughness); materialInstance->setParameter("metallic", params.metallic); - materialInstance->setParameter("reflectance", params.reflectance); + 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) { + materialInstance->setParameter("absorption", params.absorption); + materialInstance->setParameter("ior", params.ior); + materialInstance->setParameter("transmission", params.transmission); + materialInstance->setParameter("thickness", params.thickness); + } } if (params.currentMaterialModel == MATERIAL_MODEL_SPECGLOSS) { materialInstance->setParameter("baseColor", RgbType::sRGB, params.color); diff --git a/samples/materials/sandboxLitSolidRefraction.mat b/samples/materials/sandboxLitSolidRefraction.mat new file mode 100644 index 0000000000..5517f65bcf --- /dev/null +++ b/samples/materials/sandboxLitSolidRefraction.mat @@ -0,0 +1,70 @@ +material { + name : SolidRefraction, + shadingModel : lit, + refractionType : solid, + refractionMode : cubemap, + parameters : [ + { + type : float, + name : alpha + }, + { + type : float3, + name : baseColor + }, + { + type : float, + name : roughness + }, + { + type : float, + name : metallic + }, + { + type : float, + name : clearCoat + }, + { + type : float, + name : clearCoatRoughness + }, + { + type : float, + name : anisotropy + }, + { + type : float3, + name : absorption + }, + { + type : float, + name : thickness + }, + { + type : float, + name : ior + }, + { + type : float, + name : transmission + } + ], + specularAntiAliasing : true +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor.rgb = materialParams.baseColor * materialParams.alpha; + material.baseColor.a = materialParams.alpha; + material.roughness = materialParams.roughness; + material.metallic = materialParams.metallic; + material.clearCoat = materialParams.clearCoat; + material.clearCoatRoughness = materialParams.clearCoatRoughness; + material.anisotropy = materialParams.anisotropy; + material.absorption = materialParams.absorption; + material.thickness = materialParams.thickness; + material.ior = materialParams.ior; + material.transmission = materialParams.transmission; + } +} diff --git a/samples/materials/sandboxLitThinRefraction.mat b/samples/materials/sandboxLitThinRefraction.mat new file mode 100644 index 0000000000..3ade7fc032 --- /dev/null +++ b/samples/materials/sandboxLitThinRefraction.mat @@ -0,0 +1,70 @@ +material { + name : ThinRefraction, + shadingModel : lit, + refractionType : thin, + refractionMode : cubemap, + parameters : [ + { + type : float, + name : alpha + }, + { + type : float3, + name : baseColor + }, + { + type : float, + name : roughness + }, + { + type : float, + name : metallic + }, + { + type : float, + name : clearCoat + }, + { + type : float, + name : clearCoatRoughness + }, + { + type : float, + name : anisotropy + }, + { + type : float3, + name : absorption + }, + { + type : float, + name : thickness + }, + { + type : float, + name : ior + }, + { + type : float, + name : transmission + } + ], + specularAntiAliasing : true +} + +fragment { + void material(inout MaterialInputs material) { + prepareMaterial(material); + material.baseColor.rgb = materialParams.baseColor * materialParams.alpha; + material.baseColor.a = materialParams.alpha; + material.roughness = materialParams.roughness; + material.metallic = materialParams.metallic; + material.clearCoat = materialParams.clearCoat; + material.clearCoatRoughness = materialParams.clearCoatRoughness; + material.anisotropy = materialParams.anisotropy; + material.absorption = materialParams.absorption; + material.microThickness = materialParams.thickness; + material.ior = materialParams.ior; + material.transmission = materialParams.transmission; + } +}