<@if not DEFERRED_BUFFER_WRITE_SLH@> <@def DEFERRED_BUFFER_WRITE_SLH@> layout(location = 0) out vec4 _fragColor0; layout(location = 1) out vec4 _fragColor1; layout(location = 2) out vec4 _fragColor2; // the glow intensity uniform float glowIntensity; // the alpha threshold uniform float alphaThreshold; uniform sampler2D normalFittingMap; vec3 bestFitNormal(vec3 normal) { vec3 absNorm = abs(normal); float maxNAbs = max(absNorm.z, max(absNorm.x, absNorm.y)); vec2 texcoord = (absNorm.z < maxNAbs ? (absNorm.y < maxNAbs ? absNorm.yz : absNorm.xz) : absNorm.xy); texcoord = (texcoord.x < texcoord.y ? texcoord.yx : texcoord.xy); texcoord.y /= texcoord.x; vec3 cN = normal / maxNAbs; float fittingScale = texture(normalFittingMap, texcoord).a; cN *= fittingScale; return (cN * 0.5 + 0.5); } float evalOpaqueFinalAlpha(float alpha, float mapAlpha) { return mix(alpha * glowIntensity, 1.0 - alpha * glowIntensity, step(mapAlpha, alphaThreshold)); } const vec3 DEFAULT_SPECULAR = vec3(0.1); const float DEFAULT_SHININESS = 10; void packDeferredFragment(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess) { if (alpha != glowIntensity) { discard; } _fragColor0 = vec4(diffuse.rgb, alpha); _fragColor1 = vec4(bestFitNormal(normal), 1.0); _fragColor2 = vec4(specular, shininess / 128.0); } void packDeferredFragmentLightmap(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess, vec3 emissive) { if (alpha != glowIntensity) { discard; } _fragColor0 = vec4(diffuse.rgb, alpha); //_fragColor1 = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); _fragColor1 = vec4(bestFitNormal(normal), 0.5); _fragColor2 = vec4(emissive, shininess / 128.0); } void packDeferredFragmentTranslucent(vec3 normal, float alpha, vec3 diffuse, vec3 specular, float shininess) { if (alpha <= alphaThreshold) { discard; } _fragColor0 = vec4(diffuse.rgb, alpha); // _fragColor1 = vec4(normal, 0.0) * 0.5 + vec4(0.5, 0.5, 0.5, 1.0); // _fragColor2 = vec4(specular, shininess / 128.0); } <@endif@>