implemented SDL3 as an option for window manager
This commit is contained in:
80
TSE_OpenGlImpl/src/shader/ditheringShaderGLSL.hpp
Normal file
80
TSE_OpenGlImpl/src/shader/ditheringShaderGLSL.hpp
Normal file
@@ -0,0 +1,80 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
inline const char* vertD = R"(
|
||||
#version 330 core
|
||||
|
||||
layout (location = 0) in vec3 position;
|
||||
layout (location = 1) in vec4 color;
|
||||
|
||||
uniform mat4 prMatrix;
|
||||
uniform mat4 camMatrix;
|
||||
|
||||
out DATA
|
||||
{
|
||||
vec4 color_out;
|
||||
} vs_out;
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = prMatrix * camMatrix * vec4(position, 1.0);
|
||||
vs_out.color_out = color;
|
||||
}
|
||||
)";
|
||||
|
||||
inline const char* fragD = R"(
|
||||
#version 330 core
|
||||
|
||||
layout (location = 0) out vec4 color;
|
||||
|
||||
in DATA
|
||||
{
|
||||
vec4 color_out;
|
||||
} fs_in;
|
||||
|
||||
// 8x8 Bayer-Matrix (0..63), als Schwellwerttabelle
|
||||
float bayer8(vec2 fragXY)
|
||||
{
|
||||
int x = int(mod(fragXY.x, 8.0));
|
||||
int y = int(mod(fragXY.y, 8.0));
|
||||
int idx = x + y * 8;
|
||||
|
||||
// Werte aus klassischer 8x8 Ordered-Dithering-Matrix
|
||||
int m[64] = int[64](
|
||||
0, 48, 12, 60, 3, 51, 15, 63,
|
||||
32, 16, 44, 28, 35, 19, 47, 31,
|
||||
8, 56, 4, 52, 11, 59, 7, 55,
|
||||
40, 24, 36, 20, 43, 27, 39, 23,
|
||||
2, 50, 14, 62, 1, 49, 13, 61,
|
||||
34, 18, 46, 30, 33, 17, 45, 29,
|
||||
10, 58, 6, 54, 9, 57, 5, 53,
|
||||
42, 26, 38, 22, 41, 25, 37, 21
|
||||
);
|
||||
|
||||
// +0.5, damit die Schwellen mittig zwischen Stufen liegen
|
||||
return (float(m[idx]) + 0.5) / 64.0;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 c = fs_in.color_out;
|
||||
|
||||
// alpha == 0 -> nichts rendern
|
||||
if (c.a <= 0.0)
|
||||
discard;
|
||||
|
||||
// Für alpha < 1 verwenden wir Ordered Dithering
|
||||
if (c.a < 1.0)
|
||||
{
|
||||
float threshold = bayer8(gl_FragCoord.xy);
|
||||
// ist der Schwellenwert größer als alpha? -> Pixel auslassen
|
||||
if (threshold > c.a)
|
||||
discard;
|
||||
}
|
||||
|
||||
// Wenn wir bis hier nicht verworfen haben, zeichnen wir den Pixel.
|
||||
// Typischerweise setzt man die ausgegebene Alpha dann auf 1.0,
|
||||
// weil die Transparenz bereits über das Dithering realisiert wurde.
|
||||
color = vec4(c.rgb, 1.0);
|
||||
}
|
||||
)";
|
||||
Reference in New Issue
Block a user