mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-03-13 15:16:07 +09:00
108 lines
5.2 KiB
GLSL
108 lines
5.2 KiB
GLSL
/**
|
|
* Blue Noise texture created by Christoph Peters, released under CC0
|
|
* http://momentsingraphics.de/BlueNoise.html
|
|
*/
|
|
|
|
#version 120
|
|
#ifdef GL_ES
|
|
precision mediump float;
|
|
#endif
|
|
|
|
|
|
varying vec4 v_color;
|
|
varying vec2 v_texCoords;
|
|
uniform sampler2D u_texture;
|
|
|
|
int bayerR[256] = int[](
|
|
120, 34, 248, 6, 116, 70, 252, 98, 124, 52, 104, 162, 37, 128, 99, 69,
|
|
225, 85, 138, 102, 47, 209, 191, 140, 19, 181, 11, 143, 253, 24, 204, 151,
|
|
167, 16, 195, 236, 159, 26, 173, 60, 84, 202, 223, 115, 88, 183, 235, 45,
|
|
108, 62, 177, 75, 126, 89, 232, 35, 244, 154, 43, 169, 59, 76, 2, 132,
|
|
251, 210, 22, 219, 149, 1, 113, 215, 125, 71, 27, 240, 212, 148, 197, 95,
|
|
157, 53, 119, 39, 246, 200, 51, 161, 100, 194, 136, 107, 15, 122, 227, 30,
|
|
83, 189, 144, 97, 64, 184, 81, 10, 176, 18, 228, 91, 186, 40, 65, 175,
|
|
8, 241, 229, 14, 165, 134, 221, 254, 145, 66, 207, 54, 164, 247, 139, 112,
|
|
46, 129, 73, 201, 109, 29, 94, 44, 121, 33, 242, 150, 5, 78, 205, 222,
|
|
103, 170, 23, 214, 153, 58, 234, 193, 168, 86, 114, 180, 130, 96, 25, 185,
|
|
57, 147, 87, 42, 249, 178, 3, 127, 211, 72, 12, 220, 199, 38, 158, 255,
|
|
0, 218, 192, 117, 137, 77, 101, 21, 156, 230, 49, 105, 61, 237, 74, 123,
|
|
179, 231, 67, 32, 163, 198, 243, 63, 142, 187, 250, 172, 17, 141, 208, 93,
|
|
133, 20, 106, 238, 13, 50, 216, 111, 28, 41, 90, 118, 155, 190, 31, 48,
|
|
160, 80, 146, 203, 92, 131, 182, 82, 166, 206, 135, 4, 79, 233, 110, 245,
|
|
213, 188, 56, 171, 224, 36, 152, 7, 226, 239, 68, 196, 217, 55, 174, 9
|
|
);
|
|
int bayerG[256] = int[](
|
|
162, 246, 7, 109, 125, 241, 180, 198, 32, 159, 187, 18, 219, 175, 90, 200,
|
|
129, 223, 94, 54, 217, 20, 149, 98, 247, 71, 143, 104, 232, 40, 2, 114,
|
|
60, 23, 156, 196, 38, 80, 231, 58, 118, 215, 11, 204, 55, 150, 254, 186,
|
|
206, 74, 234, 139, 173, 106, 130, 3, 177, 43, 89, 164, 126, 78, 99, 29,
|
|
170, 88, 117, 12, 252, 65, 203, 161, 225, 138, 250, 191, 22, 179, 216, 142,
|
|
242, 49, 188, 31, 213, 47, 184, 26, 76, 34, 110, 64, 239, 46, 120, 8,
|
|
220, 132, 163, 102, 151, 86, 116, 244, 100, 153, 209, 15, 85, 227, 157, 68,
|
|
96, 19, 201, 72, 229, 5, 140, 218, 59, 194, 123, 172, 135, 199, 107, 36,
|
|
146, 176, 53, 249, 124, 193, 171, 21, 45, 236, 1, 93, 52, 27, 185, 245,
|
|
81, 224, 111, 16, 39, 63, 95, 158, 82, 182, 141, 253, 214, 73, 167, 6,
|
|
61, 208, 155, 137, 181, 212, 243, 128, 230, 112, 66, 37, 152, 115, 235, 127,
|
|
192, 30, 91, 238, 77, 105, 9, 33, 202, 17, 165, 222, 10, 205, 97, 44,
|
|
251, 169, 0, 50, 197, 160, 144, 57, 75, 189, 101, 131, 84, 178, 24, 145,
|
|
121, 103, 133, 221, 25, 119, 255, 174, 226, 148, 42, 248, 56, 195, 228, 70,
|
|
211, 183, 62, 233, 87, 41, 207, 92, 113, 4, 210, 168, 28, 108, 154, 14,
|
|
79, 35, 147, 190, 166, 69, 13, 134, 51, 237, 83, 122, 67, 136, 240, 48
|
|
);
|
|
int bayerB[256] = int[](
|
|
166, 21, 186, 232, 50, 196, 126, 89, 191, 71, 134, 251, 87, 205, 129, 52,
|
|
113, 70, 88, 155, 110, 78, 34, 147, 177, 107, 49, 7, 161, 103, 181, 2,
|
|
252, 198, 143, 216, 25, 170, 224, 60, 242, 29, 213, 121, 234, 35, 146, 221,
|
|
45, 122, 12, 58, 97, 247, 117, 15, 200, 95, 140, 183, 73, 194, 64, 94,
|
|
28, 160, 235, 180, 203, 136, 46, 157, 80, 167, 229, 56, 23, 245, 133, 169,
|
|
228, 82, 105, 39, 72, 0, 188, 220, 127, 9, 40, 154, 111, 86, 13, 206,
|
|
53, 142, 249, 128, 214, 151, 90, 238, 66, 104, 250, 208, 174, 223, 119, 187,
|
|
69, 6, 193, 24, 168, 55, 112, 20, 175, 192, 76, 135, 1, 47, 156, 100,
|
|
149, 210, 116, 85, 227, 33, 254, 207, 43, 144, 30, 96, 63, 199, 233, 27,
|
|
240, 41, 163, 65, 182, 138, 99, 159, 120, 231, 215, 164, 244, 125, 79, 179,
|
|
108, 217, 92, 246, 11, 197, 74, 4, 59, 84, 16, 109, 185, 38, 14, 137,
|
|
57, 18, 130, 153, 48, 123, 171, 241, 202, 132, 178, 51, 145, 222, 91, 201,
|
|
172, 75, 190, 31, 236, 218, 106, 37, 152, 26, 248, 209, 5, 68, 158, 255,
|
|
8, 225, 114, 204, 83, 22, 67, 184, 226, 93, 77, 124, 102, 239, 118, 44,
|
|
98, 148, 61, 176, 101, 162, 141, 54, 115, 165, 42, 195, 173, 32, 189, 139,
|
|
211, 243, 36, 131, 3, 253, 212, 10, 237, 17, 219, 150, 62, 19, 230, 81
|
|
);
|
|
|
|
float bayerSize = 16.0;
|
|
float bayerDivider = bayerSize * bayerSize;
|
|
|
|
float quant = 63.0; // 64 steps -> 63.0; 256 steps -> 255.0
|
|
vec4 quantizer = vec4(quant);
|
|
vec4 quantizerDivider = vec4(1.0 / quant);
|
|
|
|
vec2 boolean = vec2(0.0, 1.0);
|
|
vec4 halfvec = vec4(0.5);
|
|
|
|
vec4 gammaIn(vec4 col) {
|
|
return pow(col, vec4(2.2));
|
|
}
|
|
|
|
vec4 gammaOut(vec4 col) {
|
|
return pow(col, vec4(1.0 / 2.2));
|
|
}
|
|
|
|
vec4 nearestColour(vec4 inColor) {
|
|
return floor(quantizer * inColor + halfvec) * quantizerDivider;
|
|
}
|
|
|
|
void main(void) {
|
|
// create texture coordinates based on pixelSize //
|
|
vec4 inColor = v_color * (texture2D(u_texture, v_texCoords));
|
|
vec2 entry = mod(gl_FragCoord.xy, vec2(bayerSize, bayerSize));
|
|
|
|
vec4 bayerThreshold = vec4(
|
|
bayerR[int(entry.y) * int(bayerSize) + int(entry.x)] / bayerDivider - 0.5,
|
|
bayerG[int(entry.y) * int(bayerSize) + int(entry.x)] / bayerDivider - 0.5,
|
|
bayerB[int(entry.y) * int(bayerSize) + int(entry.x)] / bayerDivider - 0.5,
|
|
0.5
|
|
);
|
|
|
|
vec4 selvec = nearestColour(inColor + bayerThreshold * quantizerDivider);
|
|
|
|
gl_FragColor = selvec * boolean.yyyx + inColor * boolean.xxxy;
|
|
} |