// Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors. // All rights reserved. // Code licensed under the BSD License. // http://www.anki3d.org/LICENSE #pragma anki mutator BLUE_NOISE 0 1 #pragma anki mutator BLOOM_ENABLED 0 1 #pragma anki mutator DBG_ENABLED 0 1 ANKI_SPECIALIZATION_CONSTANT_U32(LUT_SIZE, 0u); ANKI_SPECIALIZATION_CONSTANT_UVEC2(FB_SIZE, 1u); ANKI_SPECIALIZATION_CONSTANT_U32(MOTION_BLUR_SAMPLES, 3u); #pragma anki start vert #include #pragma anki end #pragma anki start frag #include #include #include layout(set = 0, binding = 0) uniform sampler u_nearestAnyClampSampler; layout(set = 0, binding = 1) uniform sampler u_linearAnyClampSampler; layout(set = 0, binding = 2) uniform sampler u_trilinearRepeatSampler; layout(set = 0, binding = 3) uniform texture2D u_lightShadingRt; layout(set = 0, binding = 4) uniform texture2D u_ppsBloomLfRt; layout(set = 0, binding = 5) uniform texture3D u_lut; layout(set = 0, binding = 6) uniform texture2D u_blueNoise; layout(set = 0, binding = 7) uniform texture2D u_motionVectorsRt; layout(set = 0, binding = 8) uniform texture2D u_depthRt; #if DBG_ENABLED layout(set = 0, binding = 9) uniform texture2D u_dbgOutlineRt; #endif layout(push_constant, row_major, std430) uniform pc_ { UVec4 u_frameCountPad3; }; layout(location = 0) in Vec2 in_uv; layout(location = 0) out Vec3 out_color; Vec3 colorGrading(Vec3 color) { const Vec3 LUT_SCALE = Vec3((F32(LUT_SIZE) - 1.0) / F32(LUT_SIZE)); const Vec3 LUT_OFFSET = Vec3(1.0 / (2.0 * F32(LUT_SIZE))); color = min(color, Vec3(1.0)); const Vec3 lutCoords = color * LUT_SCALE + LUT_OFFSET; return textureLod(u_lut, u_trilinearRepeatSampler, lutCoords, 0.0).rgb; } void main() { const Vec2 uv = in_uv.xy; if(MOTION_BLUR_SAMPLES > 0u) { out_color = motionBlur(u_motionVectorsRt, u_nearestAnyClampSampler, u_lightShadingRt, Vec2(FB_SIZE), u_linearAnyClampSampler, uv, MOTION_BLUR_SAMPLES); } else { out_color = textureLod(u_lightShadingRt, u_linearAnyClampSampler, uv, 0.0).rgb; } #if BLOOM_ENABLED const Vec3 bloom = textureLod(u_ppsBloomLfRt, u_linearAnyClampSampler, uv, 0.0).rgb; out_color += bloom; #endif out_color = colorGrading(out_color); #if BLUE_NOISE const Vec2 bnUvw = Vec2(FB_SIZE) / Vec2(64.0) * uv; Vec3 blueNoise = textureLod(u_blueNoise, u_trilinearRepeatSampler, bnUvw, 0.0).rgb; blueNoise = animateBlueNoise(blueNoise, u_frameCountPad3.x); blueNoise = blueNoise * 2.0 - 1.0; blueNoise = sign(blueNoise) * (1.0 - sqrt(1.0 - abs(blueNoise))); out_color += blueNoise / 255.0; #endif #if DBG_ENABLED const Vec4 dbg = textureLod(u_dbgOutlineRt, u_linearAnyClampSampler, uv, 0.0); out_color = mix(out_color, dbg.rgb, dbg.a); #endif } #pragma anki end