Add refraction to material_sandbox

This commit is contained in:
Romain Guy
2019-12-10 09:51:54 -08:00
parent 9393e1369b
commit 3fa0c2d18b
5 changed files with 198 additions and 13 deletions

View File

@@ -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

View File

@@ -284,7 +284,7 @@ static void gui(filament::Engine* engine, filament::View*) {
if (params.currentMaterialModel == MATERIAL_MODEL_LIT) {
ImGui::Combo("blending", &params.currentBlending,
"opaque\0transparent\0fade\0\0");
"opaque\0transparent\0fade\0thin refraction\0solid refraction\0\0");
}
ImGui::ColorEdit3("baseColor", &params.color.r);
@@ -320,6 +320,15 @@ static void gui(filament::Engine* engine, filament::View*) {
ImGui::ColorEdit3("sheenColor", &params.sheenColor.r);
ImGui::ColorEdit3("subsurfaceColor", &params.subsurfaceColor.r);
}
bool hasRefraction = params.currentBlending == BLENDING_THIN_REFRACTION ||
params.currentBlending == BLENDING_SOLID_REFRACTION;
if (hasRefraction) {
ImGui::SliderFloat("ior", &params.ior, 1.0f, 3.0f);
ImGui::SliderFloat("transmission", &params.transmission, 0.0f, 1.0f);
ImGui::SliderFloat("thickness", &params.thickness, 0.0f, 1.0f);
ImGui::ColorEdit3("absorption", &params.absorption.r);
}
}
}

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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;
}
}