When dealing with thin objects we really have two thicknesses to consider, the thickness in the direction of the normal, which corresponds to the value used for solid objects, and the thickness of the object's walls, which generally is a constant. Reusing thickness in the later case is problematic for assets that have a thickness map, but are rendered hollow. In the future we can even imagine handling double-sided hollow objects by using the thickness information -- e.g. a hollow cube.
149 lines
3.6 KiB
GLSL
149 lines
3.6 KiB
GLSL
// Decide if we can skip lighting when dot(n, l) <= 0.0
|
|
#if defined(SHADING_MODEL_CLOTH)
|
|
#if !defined(MATERIAL_HAS_SUBSURFACE_COLOR)
|
|
#define MATERIAL_CAN_SKIP_LIGHTING
|
|
#endif
|
|
#elif defined(SHADING_MODEL_SUBSURFACE)
|
|
// Cannot skip lighting
|
|
#else
|
|
#define MATERIAL_CAN_SKIP_LIGHTING
|
|
#endif
|
|
|
|
struct MaterialInputs {
|
|
vec4 baseColor;
|
|
#if !defined(SHADING_MODEL_UNLIT)
|
|
#if !defined(SHADING_MODEL_SPECULAR_GLOSSINESS)
|
|
float roughness;
|
|
#endif
|
|
#if !defined(SHADING_MODEL_CLOTH) && !defined(SHADING_MODEL_SPECULAR_GLOSSINESS)
|
|
float metallic;
|
|
float reflectance;
|
|
#endif
|
|
float ambientOcclusion;
|
|
#endif
|
|
vec4 emissive;
|
|
|
|
float clearCoat;
|
|
float clearCoatRoughness;
|
|
|
|
float anisotropy;
|
|
vec3 anisotropyDirection;
|
|
|
|
#if defined(SHADING_MODEL_SUBSURFACE) || defined(HAS_REFRACTION)
|
|
float thickness;
|
|
#endif
|
|
#if defined(SHADING_MODEL_SUBSURFACE)
|
|
float subsurfacePower;
|
|
vec3 subsurfaceColor;
|
|
#endif
|
|
|
|
#if defined(SHADING_MODEL_CLOTH)
|
|
vec3 sheenColor;
|
|
#if defined(MATERIAL_HAS_SUBSURFACE_COLOR)
|
|
vec3 subsurfaceColor;
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(SHADING_MODEL_SPECULAR_GLOSSINESS)
|
|
vec3 specularColor;
|
|
float glossiness;
|
|
#endif
|
|
|
|
#if defined(MATERIAL_HAS_NORMAL)
|
|
vec3 normal;
|
|
#endif
|
|
#if defined(MATERIAL_HAS_CLEAR_COAT) && defined(MATERIAL_HAS_CLEAR_COAT_NORMAL)
|
|
vec3 clearCoatNormal;
|
|
#endif
|
|
|
|
#if defined(MATERIAL_HAS_POST_LIGHTING_COLOR)
|
|
vec4 postLightingColor;
|
|
#endif
|
|
|
|
#if defined(HAS_REFRACTION)
|
|
#if defined(MATERIAL_HAS_ABSORPTION)
|
|
vec3 absorption;
|
|
#endif
|
|
#if defined(MATERIAL_HAS_TRANSMISSION)
|
|
float transmission;
|
|
#endif
|
|
#if defined(MATERIAL_HAS_IOR)
|
|
float ior;
|
|
#endif
|
|
#if defined(MATERIAL_HAS_MICRO_THICKNESS) && (REFRACTION_TYPE == REFRACTION_TYPE_THIN)
|
|
float microThickness;
|
|
#endif
|
|
#endif
|
|
};
|
|
|
|
void initMaterial(out MaterialInputs material) {
|
|
material.baseColor = vec4(1.0);
|
|
#if !defined(SHADING_MODEL_UNLIT)
|
|
#if !defined(SHADING_MODEL_SPECULAR_GLOSSINESS)
|
|
material.roughness = 1.0;
|
|
#endif
|
|
#if !defined(SHADING_MODEL_CLOTH) && !defined(SHADING_MODEL_SPECULAR_GLOSSINESS)
|
|
material.metallic = 0.0;
|
|
material.reflectance = 0.5;
|
|
#endif
|
|
material.ambientOcclusion = 1.0;
|
|
#endif
|
|
material.emissive = vec4(0.0);
|
|
|
|
#if defined(MATERIAL_HAS_CLEAR_COAT)
|
|
material.clearCoat = 1.0;
|
|
material.clearCoatRoughness = 0.0;
|
|
#endif
|
|
|
|
#if defined(MATERIAL_HAS_ANISOTROPY)
|
|
material.anisotropy = 0.0;
|
|
material.anisotropyDirection = vec3(1.0, 0.0, 0.0);
|
|
#endif
|
|
|
|
#if defined(SHADING_MODEL_SUBSURFACE) || defined(HAS_REFRACTION)
|
|
material.thickness = 0.5;
|
|
#endif
|
|
#if defined(SHADING_MODEL_SUBSURFACE)
|
|
material.subsurfacePower = 12.234;
|
|
material.subsurfaceColor = vec3(1.0);
|
|
#endif
|
|
|
|
#if defined(SHADING_MODEL_CLOTH)
|
|
material.sheenColor = sqrt(material.baseColor.rgb);
|
|
#if defined(MATERIAL_HAS_SUBSURFACE_COLOR)
|
|
material.subsurfaceColor = vec3(0.0);
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(SHADING_MODEL_SPECULAR_GLOSSINESS)
|
|
material.glossiness = 0.0;
|
|
material.specularColor = vec3(0.0);
|
|
#endif
|
|
|
|
#if defined(MATERIAL_HAS_NORMAL)
|
|
material.normal = vec3(0.0, 0.0, 1.0);
|
|
#endif
|
|
#if defined(MATERIAL_HAS_CLEAR_COAT) && defined(MATERIAL_HAS_CLEAR_COAT_NORMAL)
|
|
material.clearCoatNormal = vec3(0.0, 0.0, 1.0);
|
|
#endif
|
|
|
|
#if defined(MATERIAL_HAS_POST_LIGHTING_COLOR)
|
|
material.postLightingColor = vec4(0.0);
|
|
#endif
|
|
|
|
#if defined(HAS_REFRACTION)
|
|
#if defined(MATERIAL_HAS_ABSORPTION)
|
|
material.absorption = vec3(0.0);
|
|
#endif
|
|
#if defined(MATERIAL_HAS_TRANSMISSION)
|
|
material.transmission = 1.0;
|
|
#endif
|
|
#if defined(MATERIAL_HAS_IOR)
|
|
material.ior = 1.5;
|
|
#endif
|
|
#if defined(MATERIAL_HAS_MICRO_THICKNESS) && (REFRACTION_TYPE == REFRACTION_TYPE_THIN)
|
|
material.microThickness = 0.0;
|
|
#endif
|
|
#endif
|
|
}
|