Add refraction to material_sandbox
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
70
samples/materials/sandboxLitSolidRefraction.mat
Normal file
70
samples/materials/sandboxLitSolidRefraction.mat
Normal 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;
|
||||
}
|
||||
}
|
||||
70
samples/materials/sandboxLitThinRefraction.mat
Normal file
70
samples/materials/sandboxLitThinRefraction.mat
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user