OSDN Git Service

[Qt][OpenGL][GLES] Fix TV renderer, GLES can't use Float texture.
[csp-qt/common_source_project-fm7.git] / source / src / qt / gui / gles2 / ntsc_pass2.glsl
1 // NTSC Shader - written by Hans-Kristian Arntzen
2 // License: GPLv3
3 // pulled from git://github.com/libretro/common-shaders.git on 01/30/2014
4
5 precision  mediump float;
6 uniform bool swap_byteorder;
7
8 varying mediump vec2 v_texcoord;
9
10 uniform sampler2D a_texture;
11 uniform vec4 source_size;
12 uniform vec4 target_size;
13
14 #define TAPS 24
15 uniform float luma_filter[24 + 1];
16 uniform float chroma_filter[24 + 1];
17
18 #define GAMMA_CORRECTION //comment to disable gamma correction, usually because higan's gamma correction is enabled or you have another shader already doing it
19 #define CRT_GAMMA 3.5
20 #define DISPLAY_GAMMA 2.1
21
22
23 // #include ntsc-rgbyuv.inc //
24 mat3 yiq2rgb_mat = mat3(
25    1.0, 1.0, 1.0,
26    0.956, -0.2720, -1.1060,
27    0.6210, -0.0, 1.7046
28 );
29
30 vec3 yiq2rgb(vec3 yiq)
31 {
32         return (yiq * yiq2rgb_mat);
33 }
34
35 mat3 ycbcr_mat = mat3(
36       0.29891, -0.16874,  0.50000,
37       0.58661, -0.33126, -0.41869,
38       0.11448,  0.50000, -0.08131
39 );
40 vec3 rgb2ycbcr(vec3 col)
41 {
42         vec3 ycbcr = col * ycbcr_mat;
43    return ycbcr;
44 }
45
46 mat3 ycbcr2rgb_mat = mat3(
47          1.0, 1.0, 1.0,
48          0.0, -0.34414 , 1.77200,
49          1.40200, -0.71414, 0.0
50  );
51  
52 vec3 ycbcr2rgb(vec3 ycbcr)
53 {
54         //vec3 ra = ycbcr * vec3(1.0, 0.7, 1.0);
55         return (ycbcr * ycbcr2rgb_mat);
56 }
57
58 mat3 yiq_mat = mat3(
59       0.2989, 0.5959, 0.2115,
60       0.5870, -0.2744, -0.5229,
61       0.1140, -0.3216, 0.3114
62 );
63
64 vec3 rgb2yiq(vec3 col)
65 {
66    return (col * yiq_mat);
67 }
68 // END ntsc-rgbyuv.inc //
69
70 // fixCoord moved from vertex
71 #define fixCoord (v_texcoord - vec2(0.5 / source_size.x, 0.0)) // Compensate for decimate-by-2.
72
73 #define fetch_offset(offset, one_x) \
74         texture2D(a_texture, fixCoord + vec2((offset) * (one_x), 0.0)).xyz
75
76
77 void main() {
78 // #include "ntsc-pass2-decode.inc" //
79         float one_x = 1.0 / source_size.x;
80         vec3 signal = vec3(0.0);
81         int i,j;
82         int ibegin = 1;
83 #if 0
84         for (int ii = 1; ii < TAPS; ii++)
85         {
86                 float offset = float(ii);
87                 vec3 sums = fetch_offset(offset - float(TAPS), one_x) +
88                                 fetch_offset(float(TAPS) - offset, one_x);
89                 sums = sums * vec3(3.6, 1.7, 1.7);
90                 signal += sums * vec3(luma_filter[ii], chroma_filter[ii], chroma_filter[ii]);
91         }
92 #else
93         float pos_offset = float(TAPS - ibegin) * one_x;
94         vec3 sums_p = vec3(0.0, 0.0, 0.0);
95         //vec3 sums_n[TAPS];
96         vec2 fix_coord = v_texcoord - vec2(0.5 / source_size.x, 0.0);
97         vec2 delta = vec2(one_x, 0);
98         vec3 pix_p, pix_n;
99         vec3 tmpv;
100         vec2 addr_p = fix_coord + vec2(pos_offset, 0);
101         vec2 addr_n = fix_coord - vec2(pos_offset, 0);
102
103         for(int ii = 1; ii < TAPS; ii++) {
104                 pix_p = texture2D(a_texture, addr_p).xyz;
105                 pix_n = texture2D(a_texture, addr_n).xyz;
106                 pix_p = pix_p * vec3(3.6, 1.7, 1.7);
107                 pix_n = pix_n * vec3(3.6, 1.7, 1.7);
108                 pix_p = (pix_n + pix_p) * vec3(luma_filter[ii], chroma_filter[ii], chroma_filter[ii]);
109                 signal = signal + pix_p;
110                 addr_p = addr_p - delta;
111                 addr_n = addr_n + delta;
112         }
113 #endif
114         vec3 _tmpvar = texture2D(a_texture, fixCoord).xyz;
115         // yMax = (0.299+0.587+0.114) * (+-1.0) * (BRIGHTNESS + ARTIFACTING + ARTIFACTING) * (+-1.0)
116         // CbMax = (-0.168736 -0.331264 + 0.5) * (+-1.0) * (FRINGING + 2*SATURATION) * (+-1.0)
117         // CrMax = (0.5 - 0.418688 - 0.081312) * (+-1.0) * (FRINGING + 2*SATURATION) * (+-1.0)
118         // -> y =  0 to +3.6
119         //    Cb = 0 to +1.7
120         //    Cr = 0 to +1.7
121         _tmpvar = _tmpvar * vec3(3.6, 1.7, 1.7);
122         vec3 texvar = _tmpvar;
123         signal +=  texvar * vec3(luma_filter[TAPS], chroma_filter[TAPS], chroma_filter[TAPS]);
124 // END "ntsc-pass2-decode.inc" //
125
126         vec3 rgb = ycbcr2rgb(signal);
127         rgb = rgb * vec3(0.67, 1.0, 1.0);
128 #ifdef GAMMA_CORRECTION
129    vec3 gamma = vec3(CRT_GAMMA / DISPLAY_GAMMA);
130    rgb = pow(abs(rgb), gamma.rgb);
131 #endif
132         vec4 pixel = vec4(rgb, 1.0);
133         if(swap_byteorder) {
134                 pixel.rgba = pixel.bgra;
135                 gl_FragColor = pixel;
136         } else {
137                 gl_FragColor = pixel;
138         }
139 }