<@if not FORWARD_BUFFER_WRITE_SLH@> <@def FORWARD_BUFFER_WRITE_SLH@> <@include ForwardBuffer.slh@> layout(location = 0) out vec4 _fragColor0; // the alpha threshold const float alphaThreshold = 0.5; float evalOpaqueFinalAlpha(float alpha, float mapAlpha) { return mix(alpha, 1.0 - alpha, step(mapAlpha, alphaThreshold)); } const float DEFAULT_ROUGHNESS = 0.9; const float DEFAULT_SHININESS = 10.0; const float DEFAULT_METALLIC = 0.0; const vec3 DEFAULT_SPECULAR = vec3(0.1); const vec3 DEFAULT_EMISSIVE = vec3(0.0); const float DEFAULT_OCCLUSION = 1.0; const float DEFAULT_SCATTERING = 0.0; const vec3 DEFAULT_FRESNEL = DEFAULT_EMISSIVE; void packForwardFragment(vec3 normal, float alpha, vec3 albedo, float roughness, float metallic, vec3 emissive, float occlusion, float scattering) { if (alpha != 1.0) { discard; } _fragColor0 = vec4(albedo, ((scattering > 0.0) ? packScatteringMetallic(metallic) : packShadedMetallic(metallic))); } void packForwardFragmentLightmap(vec3 normal, float alpha, vec3 albedo, float roughness, float metallic, vec3 fresnel, vec3 lightmap) { if (alpha != 1.0) { discard; } _fragColor0 = vec4(albedo, packLightmappedMetallic(metallic)); } void packForwardFragmentUnlit(vec3 normal, float alpha, vec3 color) { if (alpha != 1.0) { discard; } _fragColor0 = vec4(color, packUnlit()); } void packForwardFragmentTranslucent(vec3 normal, float alpha, vec3 albedo, vec3 fresnel, float roughness) { if (alpha <= 0.0) { discard; } _fragColor0 = vec4(albedo.rgb, alpha); } <@endif@>