mirror of
https://github.com/barkeser2002/flower.git
synced 2026-09-25 14:56:14 +03:00
66 lines
3.1 KiB
GLSL
66 lines
3.1 KiB
GLSL
#version 460
|
|
#extension GL_GOOGLE_include_directive : enable
|
|
#extension GL_EXT_samplerless_texture_functions : enable
|
|
#extension GL_ARB_separate_shader_objects : enable
|
|
#extension GL_EXT_nonuniform_qualifier : enable
|
|
|
|
#include "common/shared_functions.glsl"
|
|
|
|
layout (set = 0, binding = 0, rgba8) uniform image2D inoutLdrColor;
|
|
layout (set = 0, binding = 1) uniform texture2D inMask;
|
|
layout (set = 0, binding = 2) uniform utexture2D inSceneNodeIdTexture;
|
|
layout (set = 0, binding = 3) uniform UniformFrameData { PerFrameData frameData; };
|
|
layout (set = 0, binding = 4) uniform texture2D inAdaptedLumTex;
|
|
|
|
#define SHARED_SAMPLER_SET 1
|
|
#include "common/shared_sampler.glsl"
|
|
|
|
layout (local_size_x = 8, local_size_y = 8) in;
|
|
void main()
|
|
{
|
|
uvec2 groupThreadId = remap8x8(gl_LocalInvocationIndex);
|
|
uvec2 dispatchId = groupThreadId + gl_WorkGroupID.xy * 8;
|
|
ivec2 workPos = ivec2(dispatchId);
|
|
ivec2 workSize = imageSize(inoutLdrColor);
|
|
|
|
// border check.
|
|
if(workPos.x >= workSize.x || workPos.y >= workSize.y)
|
|
{
|
|
return;
|
|
}
|
|
|
|
|
|
vec2 uvDt = 1.0f / vec2(frameData.renderWidth, frameData.renderHeight);
|
|
const vec2 cancelJitter = -frameData.jitterData.xy * uvDt;
|
|
|
|
vec4 resultColor = imageLoad(inoutLdrColor, workPos);
|
|
|
|
const int distanceDiff = 3;
|
|
|
|
float TL = texture(sampler2D(inMask, linearClampEdgeSampler), uvDt * (workPos + 0.5 + distanceDiff * ivec2(-1, 1)) - cancelJitter).r;
|
|
float TM = texture(sampler2D(inMask, linearClampEdgeSampler), uvDt * (workPos + 0.5 + distanceDiff * ivec2( 0, 1)) - cancelJitter).r;
|
|
float TR = texture(sampler2D(inMask, linearClampEdgeSampler), uvDt * (workPos + 0.5 + distanceDiff * ivec2( 1, 1)) - cancelJitter).r;
|
|
float ML = texture(sampler2D(inMask, linearClampEdgeSampler), uvDt * (workPos + 0.5 + distanceDiff * ivec2(-1, 0)) - cancelJitter).r;
|
|
float MR = texture(sampler2D(inMask, linearClampEdgeSampler), uvDt * (workPos + 0.5 + distanceDiff * ivec2( 1, 0)) - cancelJitter).r;
|
|
float BL = texture(sampler2D(inMask, linearClampEdgeSampler), uvDt * (workPos + 0.5 + distanceDiff * ivec2(-1, -1)) - cancelJitter).r;
|
|
float BM = texture(sampler2D(inMask, linearClampEdgeSampler), uvDt * (workPos + 0.5 + distanceDiff * ivec2( 0, -1)) - cancelJitter).r;
|
|
float BR = texture(sampler2D(inMask, linearClampEdgeSampler), uvDt * (workPos + 0.5 + distanceDiff * ivec2( 1, -1)) - cancelJitter).r;
|
|
|
|
float gradX = -TL + TR - 2.0 * ML + 2.0 * MR - BL + BR;
|
|
float gradY = TL + 2.0 * TM + TR - BL - 2.0 * BM - BR;
|
|
float diff = gradX * gradX + gradY * gradY;
|
|
|
|
uint bSelected = unpackToSceneNodeSelected(texture(usampler2D(inSceneNodeIdTexture, pointClampEdgeSampler), uvDt * (workPos + 0.5) - cancelJitter).r);
|
|
|
|
float mixDensity = saturate(smoothstep(0.0, 16.0, diff)) * (bSelected != 0 ? 1.0 : 0.3);
|
|
vec3 mixColor = bSelected != 0 ? vec3(1.0, 0.5, 0.0) : vec3(0.6, 0.2, 0.0);
|
|
mixColor = pow(mixColor, vec3(2.2));
|
|
|
|
mixColor /= max(1e-5f, getExposure(frameData, inAdaptedLumTex).r);
|
|
|
|
resultColor.xyz = mix(resultColor.xyz, mixColor, mixDensity);
|
|
|
|
imageStore(inoutLdrColor, workPos, resultColor);
|
|
}
|
|
|