mirror of
https://github.com/italicsjenga/slang-shaders.git
synced 2025-02-17 15:37:41 +11:00
133 lines
2.4 KiB
Text
133 lines
2.4 KiB
Text
|
#version 450
|
||
|
|
||
|
layout(push_constant) uniform Push
|
||
|
{
|
||
|
vec4 SourceSize;
|
||
|
vec4 OriginalSize;
|
||
|
vec4 OutputSize;
|
||
|
uint FrameCount;
|
||
|
|
||
|
} params;
|
||
|
|
||
|
#define _ 0.0
|
||
|
#define o (1./3.)
|
||
|
#define b (2./3.)
|
||
|
#define B 1.0
|
||
|
|
||
|
#define color_enhance 1.0
|
||
|
#define SourceSize params.SourceSize
|
||
|
|
||
|
layout(std140, set = 0, binding = 0) uniform UBO
|
||
|
{
|
||
|
mat4 MVP;
|
||
|
} global;
|
||
|
|
||
|
#pragma stage vertex
|
||
|
layout(location = 0) in vec4 Position;
|
||
|
layout(location = 1) in vec2 TexCoord;
|
||
|
layout(location = 0) out vec2 vTexCoord;
|
||
|
|
||
|
void main()
|
||
|
{
|
||
|
gl_Position = global.MVP * Position;
|
||
|
vTexCoord = TexCoord*1.0001;
|
||
|
}
|
||
|
|
||
|
#pragma stage fragment
|
||
|
layout(location = 0) in vec2 vTexCoord;
|
||
|
layout(location = 0) out vec4 FragColor;
|
||
|
layout(set = 0, binding = 2) uniform sampler2D Source;
|
||
|
|
||
|
|
||
|
// Color lookup table (RGBI palette with brown fix)
|
||
|
const vec3 rgbi_palette[19] =
|
||
|
{
|
||
|
vec3(_, _, _),
|
||
|
vec3(_, _, b),
|
||
|
vec3(_, b, _),
|
||
|
vec3(_, b, _),
|
||
|
vec3(_, b, _),
|
||
|
vec3(_, b, _),
|
||
|
vec3(_, b, b),
|
||
|
vec3(b, _, _),
|
||
|
vec3(b, _, b),
|
||
|
vec3(b, o, _),
|
||
|
vec3(b, b, b),
|
||
|
vec3(o, o, o),
|
||
|
vec3(o, o, B),
|
||
|
vec3(o, B, o),
|
||
|
vec3(o, B, B),
|
||
|
vec3(B, o, o),
|
||
|
vec3(B, o, B),
|
||
|
vec3(B, B, o),
|
||
|
vec3(B, B, B),
|
||
|
};
|
||
|
|
||
|
|
||
|
// Came off the wikipedia(R) article for Ordered_Dithering
|
||
|
const int dithertable[16] =
|
||
|
{
|
||
|
1, 9, 3,11,
|
||
|
13, 5,15, 7,
|
||
|
4,12, 2,10,
|
||
|
16, 8,14, 6,
|
||
|
};
|
||
|
|
||
|
|
||
|
// Compare vector distances and return nearest RGBI color
|
||
|
vec3 nearest_rgbi (vec3 original)
|
||
|
{
|
||
|
float dst;
|
||
|
float min_dst = 2.0;
|
||
|
int idx = 0;
|
||
|
for (int i=0; i<19; i++)
|
||
|
{
|
||
|
dst = distance(original, rgbi_palette[i]);
|
||
|
if (dst < min_dst)
|
||
|
{
|
||
|
min_dst = dst;
|
||
|
idx = i;
|
||
|
}
|
||
|
}
|
||
|
return rgbi_palette[idx];
|
||
|
}
|
||
|
|
||
|
|
||
|
float modu(float x, float y)
|
||
|
{
|
||
|
return x - y * floor(x/y);
|
||
|
}
|
||
|
|
||
|
//fragment
|
||
|
void main()
|
||
|
{
|
||
|
vec3 color = texture(Source, vTexCoord.xy).rgb;
|
||
|
|
||
|
// leilei - dither
|
||
|
vec2 res;
|
||
|
vec2 tex=vTexCoord.xy;
|
||
|
res.x = SourceSize.x;
|
||
|
|
||
|
if (SourceSize.y < 900.0)
|
||
|
res.y = SourceSize.y;
|
||
|
else
|
||
|
res.y = SourceSize.y / 2.0;
|
||
|
|
||
|
int ohyes;
|
||
|
int i;
|
||
|
vec2 ditheu = tex.xy * res.xy;
|
||
|
|
||
|
int ditdex = int(modu(ditheu.x, 4))*4 + int(modu(ditheu.y, 4)); // 4x4!
|
||
|
|
||
|
// looping through a lookup table matrix
|
||
|
|
||
|
for (i = ditdex; i < (ditdex+16); i = i+1)
|
||
|
ohyes = dithertable[i-15] * 2 - 21;
|
||
|
ohyes = ohyes - 6;
|
||
|
|
||
|
color *= 255.0;
|
||
|
color += ohyes;
|
||
|
color /= 255.0;
|
||
|
FragColor = vec4(nearest_rgbi(color*color_enhance), 1.0);
|
||
|
}
|