mirror of
https://github.com/italicsjenga/slang-shaders.git
synced 2024-11-22 07:41:31 +11:00
add cmyk-halftone-dot shaders and preset
This commit is contained in:
parent
444f4772d3
commit
3b1a4b3319
80
misc/cmyk-halftone-dot.slang
Normal file
80
misc/cmyk-halftone-dot.slang
Normal file
|
@ -0,0 +1,80 @@
|
|||
#version 450
|
||||
|
||||
layout(push_constant) uniform Push
|
||||
{
|
||||
vec4 SourceSize;
|
||||
vec4 OriginalSize;
|
||||
vec4 OutputSize;
|
||||
uint FrameCount;
|
||||
float frequency;
|
||||
} params;
|
||||
|
||||
#pragma parameter frequency "CMYK HalfTone Dot Density" 275.0 50.0 500.0 25.0
|
||||
#define frequency params.frequency
|
||||
|
||||
#define mul(a,b) (b*a)
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
#pragma stage fragment
|
||||
layout(location = 0) in vec2 vTexCoord;
|
||||
layout(location = 0) out vec4 FragColor;
|
||||
layout(set = 0, binding = 2) uniform sampler2D Source;
|
||||
|
||||
void main()
|
||||
{
|
||||
// Distance to nearest point in a grid of
|
||||
// (frequency x frequency) points over the unit square
|
||||
mat2 rotation_matrix = mat2(0.707, 0.707, -0.707, 0.707);
|
||||
vec2 st2 = mul(rotation_matrix , vTexCoord);
|
||||
vec2 nearest = 2.0 * fract(frequency * st2) - 1.0;
|
||||
float dist = length(nearest);
|
||||
vec3 texcolor = texture(Source, vTexCoord).rgb; // Unrotated coords
|
||||
vec3 black = texcolor; // kinda cheating, but it makes the colors look much better
|
||||
|
||||
// Perform a rough RGB-to-CMYK conversion
|
||||
vec4 cmyk;
|
||||
cmyk.xyz = 1.0 - texcolor;
|
||||
cmyk.w = min(cmyk.x, min(cmyk.y, cmyk.z)); // Create K
|
||||
|
||||
mat2 k_matrix = mat2(0.707, 0.707, -0.707, 0.707);
|
||||
vec2 Kst = frequency * mul(k_matrix , vTexCoord);
|
||||
vec2 Kuv = 2.0 * fract(Kst) - 1.0;
|
||||
float k = step(0.0, sqrt(cmyk.w) - length(Kuv));
|
||||
mat2 c_matrix = mat2(0.966, 0.259, -0.259, 0.966);
|
||||
vec2 Cst = frequency * mul(c_matrix , vTexCoord);
|
||||
vec2 Cuv = 2.0 * fract(Cst) - 1.0;
|
||||
float c = step(0.0, sqrt(cmyk.x) - length(Cuv));
|
||||
mat2 m_matrix = mat2(0.966, -0.259, 0.259, 0.966);
|
||||
vec2 Mst = frequency * mul(m_matrix , vTexCoord);
|
||||
vec2 Muv = 2.0 * fract(Mst) - 1.0;
|
||||
float m = step(0.0, sqrt(cmyk.y) - length(Muv));
|
||||
vec2 Yst = frequency * vTexCoord; // 0 deg
|
||||
vec2 Yuv = 2.0 * fract(Yst) - 1.0;
|
||||
float y = step(0.0, sqrt(cmyk.z) - length(Yuv));
|
||||
|
||||
vec3 rgbscreen = 1.0 - vec3(c,m,y);
|
||||
rgbscreen = mix(rgbscreen, black, k);
|
||||
|
||||
float afwidth = 2.0 * frequency * length(params.OutputSize.zw);
|
||||
float blend = smoothstep(0.0, 1.0, afwidth);
|
||||
|
||||
vec4 color = vec4(mix(rgbscreen , texcolor, blend), 1.0);
|
||||
color = (max(texcolor.r, max(texcolor.g, texcolor.b)) < 0.01) ? vec4(0.,0.,0.,0.) : color; // make blacks actually black
|
||||
|
||||
FragColor = color;
|
||||
}
|
10
reshade/halftone-print.slangp
Normal file
10
reshade/halftone-print.slangp
Normal file
|
@ -0,0 +1,10 @@
|
|||
shaders = 2
|
||||
|
||||
shader0 = shaders/LUT/LUT.slang
|
||||
shader1 = ../misc/cmyk-halftone-dot.slang
|
||||
filter_linear1 = true
|
||||
|
||||
textures = SamplerLUT
|
||||
|
||||
SamplerLUT = shaders/LUT/cmyk-16.png
|
||||
SamplerLUT_linear = true
|
BIN
reshade/shaders/LUT/cmyk-16.png
Normal file
BIN
reshade/shaders/LUT/cmyk-16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.9 KiB |
Loading…
Reference in a new issue