123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- // NTSC Shader - written by Hans-Kristian Arntzen
- // License: GPLv3
- // pulled from git://github.com/libretro/common-shaders.git on 01/30/2014
- #version 150
- uniform sampler2D source[];
- uniform vec4 sourceSize[];
- uniform vec4 targetSize;
- uniform int phase;
- // uniforms added for compatibility
- out vec3 col;
- out float mod_phase;
- out float chroma_phase;
- #define THREE_PHASE
- #define COMPOSITE
- // #include "ntsc-param.inc" //
- #define PI 3.14159265
- #if defined(TWO_PHASE)
- #define CHROMA_MOD_FREQ (4.0 * PI / 15.0)
- #elif defined(THREE_PHASE)
- #define CHROMA_MOD_FREQ (PI / 3.0)
- #endif
- #if defined(COMPOSITE)
- #define SATURATION 1.0
- #define BRIGHTNESS 1.0
- #define ARTIFACTING 1.0
- #define FRINGING 1.0
- #elif defined(SVIDEO)
- #define SATURATION 1.0
- #define BRIGHTNESS 1.0
- #define ARTIFACTING 0.0
- #define FRINGING 0.0
- #endif
- #if defined(COMPOSITE) || defined(SVIDEO)
- mat3 mix_mat = mat3(
- BRIGHTNESS, FRINGING, FRINGING,
- ARTIFACTING, 2.0 * SATURATION, 0.0,
- ARTIFACTING, 0.0, 2.0 * SATURATION
- );
- #endif
- // END "ntsc-param.inc" //
- // moved from vertex
- #define pix_no (texCoord.xy * sourceSize[0].xy * (targetSize.xy / sourceSize[0].xy))
- in Vertex {
- vec2 texCoord;
- };
- out vec4 fragColor;
- mat3 yiq2rgb_mat = mat3(
- 1.0, 1.0, 1.0,
- 0.956, -0.2720, -1.1060,
- 0.6210, -0.6474, 1.7046
- );
- vec3 yiq2rgb(vec3 yiq)
- {
- return (yiq * yiq2rgb_mat);
- }
- mat3 yiq_mat = mat3(
- 0.2989, 0.5959, 0.2115,
- 0.5870, -0.2744, -0.5229,
- 0.1140, -0.3216, 0.3114
- );
- vec3 rgb2yiq(vec3 col)
- {
- return (col * yiq_mat);
- }
- void main() {
- // #include "ntsc-pass1-encode-demodulate.inc" //
- vec3 col = texture(source[0], texCoord).rgb;
- vec3 yiq = rgb2yiq(col);
- #if defined(TWO_PHASE)
- float chroma_phase = PI * (mod(pix_no.y, 2.0) + phase);
- #elif defined(THREE_PHASE)
- float chroma_phase = 0.6667 * PI * (mod(pix_no.y, 3.0) + phase);
- #endif
- float mod_phase = chroma_phase + pix_no.x * CHROMA_MOD_FREQ;
- float i_mod = cos(mod_phase);
- float q_mod = sin(mod_phase);
- yiq.yz *= vec2(i_mod, q_mod); // Modulate
- yiq *= mix_mat; // Cross-talk
- yiq.yz *= vec2(i_mod, q_mod); // Demodulate
- fragColor = vec4(yiq, 1.0);
- // END "ntsc-pass1-encode-demodulate.inc" //
- }
|