Skip to content

Commit 1a8de1f

Browse files
committed
sharpening filter
1 parent 1af605f commit 1a8de1f

File tree

8 files changed

+79
-3
lines changed

8 files changed

+79
-3
lines changed

data/cage/shader/effects/effects.assets

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ gaussianBlur.glsl
1414
luminanceApply.glsl
1515
luminanceCollection.glsl
1616
luminanceHistogram.glsl
17-
ssaoResolve.glsl
17+
sharpening.glsl
1818
ssaoGenerate.glsl
19+
ssaoResolve.glsl
1920
tonemap.glsl

data/cage/shader/effects/effects.pack

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ gaussianBlur.glsl
99
luminanceApply.glsl
1010
luminanceCollection.glsl
1111
luminanceHistogram.glsl
12-
ssaoResolve.glsl
12+
sharpening.glsl
1313
ssaoGenerate.glsl
14+
ssaoResolve.glsl
1415
tonemap.glsl
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
$include vertex.glsl
2+
3+
$define shader fragment
4+
5+
layout(binding = 0) uniform sampler2D texColor;
6+
7+
layout(std140, binding = 2) uniform Sharpening
8+
{
9+
vec4 params; // strength
10+
};
11+
12+
out vec3 outColor;
13+
14+
void main()
15+
{
16+
ivec2 coord = ivec2(gl_FragCoord.xy);
17+
vec3 center = texelFetch(texColor, coord, 0).rgb;
18+
vec3 up = texelFetch(texColor, coord + ivec2(0, 1), 0).rgb;
19+
vec3 down = texelFetch(texColor, coord + ivec2(0, -1), 0).rgb;
20+
vec3 left = texelFetch(texColor, coord + ivec2(-1, 0), 0).rgb;
21+
vec3 right = texelFetch(texColor, coord + ivec2(1, 0), 0).rgb;
22+
float strength = params.x;
23+
vec3 sharpenedColor = center * (1 + 4 * strength) - (up + down + left + right) * strength;
24+
outColor = clamp(sharpenedColor, 0, 1);
25+
}

sources/include/cage-engine/sceneScreenSpaceEffects.h

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ namespace cage
1515
ToneMapping = 1 << 5,
1616
GammaCorrection = 1 << 6,
1717
AntiAliasing = 1 << 7,
18+
Sharpening = 1 << 8,
1819
Default = AmbientOcclusion | Bloom | ToneMapping | GammaCorrection | AntiAliasing,
1920
};
2021

@@ -24,6 +25,7 @@ namespace cage
2425
ScreenSpaceBloom bloom;
2526
ScreenSpaceEyeAdaptation eyeAdaptation;
2627
ScreenSpaceDepthOfField depthOfField;
28+
ScreenSpaceSharpening sharpening;
2729
Real gamma = 2.2;
2830
ScreenSpaceEffectsFlags effects = ScreenSpaceEffectsFlags::Default;
2931
};

sources/include/cage-engine/screenSpaceEffects.h

+7
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,20 @@ namespace cage
6262
TextureHandle outColor;
6363
};
6464

65+
struct CAGE_ENGINE_API ScreenSpaceSharpeningConfig : public ScreenSpaceCommonConfig, public ScreenSpaceSharpening
66+
{
67+
TextureHandle inColor;
68+
TextureHandle outColor;
69+
};
70+
6571
CAGE_ENGINE_API void screenSpaceAmbientOcclusion(const ScreenSpaceAmbientOcclusionConfig &config);
6672
CAGE_ENGINE_API void screenSpaceDepthOfField(const ScreenSpaceDepthOfFieldConfig &config);
6773
CAGE_ENGINE_API void screenSpaceEyeAdaptationPrepare(const ScreenSpaceEyeAdaptationConfig &config);
6874
CAGE_ENGINE_API void screenSpaceBloom(const ScreenSpaceBloomConfig &config);
6975
CAGE_ENGINE_API void screenSpaceEyeAdaptationApply(const ScreenSpaceEyeAdaptationConfig &config);
7076
CAGE_ENGINE_API void screenSpaceTonemap(const ScreenSpaceTonemapConfig &config);
7177
CAGE_ENGINE_API void screenSpaceFastApproximateAntiAliasing(const ScreenSpaceFastApproximateAntiAliasingConfig &config);
78+
CAGE_ENGINE_API void screenSpaceSharpening(const ScreenSpaceSharpeningConfig &config);
7279
}
7380

7481
#endif // guard_screenSpaceEffects_h_xcfvh241448960sdrt

sources/include/cage-engine/screenSpaceEffectsProperties.h

+5
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ namespace cage
4545
uint32 blurPasses = 5;
4646
Real threshold = 1;
4747
};
48+
49+
struct CAGE_ENGINE_API ScreenSpaceSharpening
50+
{
51+
Real strength = 1;
52+
};
4853
}
4954

5055
#endif // guard_screenSpaceEffectsProperties_h_0156sdrf4treth1

sources/libengine/graphics/renderPipeline.cpp

+13-1
Original file line numberDiff line numberDiff line change
@@ -1199,7 +1199,7 @@ namespace cage
11991199
std::swap(texSource, texTarget);
12001200
}
12011201

1202-
// final screen effects
1202+
// tonemap & gamma correction
12031203
if (any(effects.effects & (ScreenSpaceEffectsFlags::ToneMapping | ScreenSpaceEffectsFlags::GammaCorrection)))
12041204
{
12051205
ScreenSpaceTonemapConfig cfg;
@@ -1223,6 +1223,18 @@ namespace cage
12231223
std::swap(texSource, texTarget);
12241224
}
12251225

1226+
// sharpening
1227+
if (any(effects.effects & ScreenSpaceEffectsFlags::Sharpening) && effects.sharpening.strength > 1e-3)
1228+
{
1229+
ScreenSpaceSharpeningConfig cfg;
1230+
(ScreenSpaceCommonConfig &)cfg = commonConfig;
1231+
cfg.inColor = texSource;
1232+
cfg.outColor = texTarget;
1233+
cfg.strength = effects.sharpening.strength;
1234+
screenSpaceSharpening(cfg);
1235+
std::swap(texSource, texTarget);
1236+
}
1237+
12261238
// blit to destination
12271239
if (texSource != colorTexture)
12281240
{

sources/libengine/graphics/screenSpaceEffects.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -351,4 +351,27 @@ namespace cage
351351
q->bind(config.assets->get<AssetSchemeIndexShaderProgram, MultiShaderProgram>(HashString("cage/shader/effects/fxaa.glsl"))->get(0));
352352
q->draw(config.assets->get<AssetSchemeIndexModel, Model>(HashString("cage/model/square.obj")));
353353
}
354+
355+
void screenSpaceSharpening(const ScreenSpaceSharpeningConfig &config)
356+
{
357+
RenderQueue *q = config.queue;
358+
const auto graphicsDebugScope = q->namedScope("sharpening");
359+
360+
q->viewport(Vec2i(), config.resolution);
361+
FrameBufferHandle fb = config.provisionals->frameBufferDraw("graphicsEffects");
362+
q->bind(fb);
363+
364+
struct Shader
365+
{
366+
Vec4 params; // strength
367+
} s;
368+
s.params[0] = config.strength;
369+
q->universalUniformStruct(s, 2);
370+
371+
q->colorTexture(fb, 0, config.outColor);
372+
q->checkFrameBuffer(fb);
373+
q->bind(config.inColor, 0);
374+
q->bind(config.assets->get<AssetSchemeIndexShaderProgram, MultiShaderProgram>(HashString("cage/shader/effects/sharpening.glsl"))->get(0));
375+
q->draw(config.assets->get<AssetSchemeIndexModel, Model>(HashString("cage/model/square.obj")));
376+
}
354377
}

0 commit comments

Comments
 (0)