100 lines
3.0 KiB
GLSL
100 lines
3.0 KiB
GLSL
#if !defined(HAS_CUSTOM_OUTPUT)
|
|
layout(location = 0) out vec4 fragColor;
|
|
#else
|
|
vec4 fragColor;
|
|
#endif
|
|
#if defined(MATERIAL_HAS_POST_LIGHTING_COLOR)
|
|
void blendPostLightingColor(const MaterialInputs material, inout vec4 color) {
|
|
vec4 blend = color;
|
|
#if defined(POST_LIGHTING_BLEND_MODE_OPAQUE)
|
|
blend = material.postLightingColor;
|
|
#elif defined(POST_LIGHTING_BLEND_MODE_TRANSPARENT)
|
|
blend = material.postLightingColor + color * (1.0 - material.postLightingColor.a);
|
|
#elif defined(POST_LIGHTING_BLEND_MODE_ADD)
|
|
blend += material.postLightingColor;
|
|
#elif defined(POST_LIGHTING_BLEND_MODE_MULTIPLY)
|
|
blend *= material.postLightingColor;
|
|
#elif defined(POST_LIGHTING_BLEND_MODE_SCREEN)
|
|
blend += material.postLightingColor * (1.0 - color);
|
|
#endif
|
|
color = mix(color, blend, material.postLightingMixFactor);
|
|
}
|
|
#endif
|
|
#if defined(BLEND_MODE_MASKED)
|
|
void applyAlphaMask(inout vec4 baseColor) {
|
|
baseColor.a = (baseColor.a - getMaskThreshold()) / max(fwidth(baseColor.a), 1e-3) + 0.5;
|
|
if (baseColor.a <= getMaskThreshold()) {
|
|
discard;
|
|
}
|
|
}
|
|
#else
|
|
void applyAlphaMask(inout vec4 baseColor) {}
|
|
#endif
|
|
void main() {
|
|
filament_lodBias = frameUniforms.lodBias;
|
|
#if defined(FILAMENT_HAS_FEATURE_INSTANCING)
|
|
logical_instance_index = instance_index;
|
|
#endif
|
|
initObjectUniforms();
|
|
computeShadingParams();
|
|
MaterialInputs inputs;
|
|
initMaterial(inputs);
|
|
material(inputs);
|
|
applyAlphaMask(inputs.baseColor);
|
|
fragColor = evaluateMaterial(inputs);
|
|
#if defined(MATERIAL_HAS_POST_LIGHTING_COLOR) && !defined(MATERIAL_HAS_REFLECTIONS)
|
|
blendPostLightingColor(inputs, fragColor);
|
|
#endif
|
|
#if defined(VARIANT_HAS_FOG)
|
|
highp vec3 view = getWorldPosition() - getWorldCameraPosition();
|
|
view = frameUniforms.fogFromWorldMatrix * view;
|
|
#if MATERIAL_FEATURE_LEVEL > 0
|
|
# if defined (FILAMENT_LINEAR_FOG)
|
|
vec4 fogColor = fogLinear(view, sampler0_fog);
|
|
# else
|
|
vec4 fogColor = fog(view, sampler0_fog);
|
|
# endif
|
|
#else
|
|
vec4 fogColor = fogLinear(view);
|
|
#endif
|
|
# if defined(BLEND_MODE_OPAQUE)
|
|
# elif defined(BLEND_MODE_TRANSPARENT)
|
|
fogColor.rgb *= fragColor.a;
|
|
# elif defined(BLEND_MODE_ADD)
|
|
fogColor.rgb = vec3(0.0);
|
|
# elif defined(BLEND_MODE_MASKED)
|
|
# elif defined(BLEND_MODE_MULTIPLY)
|
|
# elif defined(BLEND_MODE_SCREEN)
|
|
#endif
|
|
fragColor.rgb = fragColor.rgb * (1.0 - fogColor.a) + fogColor.rgb;
|
|
#endif
|
|
#if defined(VARIANT_HAS_SHADOWING) && defined(VARIANT_HAS_DIRECTIONAL_LIGHTING)
|
|
if (CONFIG_DEBUG_DIRECTIONAL_SHADOWMAP) {
|
|
float a = fragColor.a;
|
|
highp vec4 p = getShadowPosition(getShadowCascade());
|
|
p.xy = p.xy * (1.0 / p.w);
|
|
if (p.xy != saturate(p.xy)) {
|
|
vec4 c = vec4(1.0, 0, 1.0, 1.0) * a;
|
|
fragColor = mix(fragColor, c, 0.2);
|
|
} else {
|
|
highp vec2 size = vec2(textureSize(sampler0_shadowMap, 0));
|
|
highp int ix = int(floor(p.x * size.x));
|
|
highp int iy = int(floor(p.y * size.y));
|
|
float t = float((ix ^ iy) & 1) * 0.2;
|
|
vec4 c = vec4(vec3(t * a), a);
|
|
fragColor = mix(fragColor, c, 0.5);
|
|
}
|
|
}
|
|
#endif
|
|
#if MATERIAL_FEATURE_LEVEL == 0
|
|
if (CONFIG_SRGB_SWAPCHAIN_EMULATION) {
|
|
if (frameUniforms.rec709 != 0) {
|
|
fragColor.rgb = pow(fragColor.rgb, vec3(0.45454));
|
|
}
|
|
}
|
|
#endif
|
|
#if defined(HAS_CUSTOM_OUTPUT)
|
|
FRAG_OUTPUT_AT0 = inputs.FRAG_OUTPUT0;
|
|
#endif
|
|
}
|