{ \r
GL(glUseProgramObjectARB(program_)); \r
}\r
+\r
+ GLuint program() { return program_; }\r
\r
private:\r
GLuint program_;\r
" color.a = a; "\r
" "\r
" return color; "\r
- "} ";\r
+ "} "\r
+ " "\r
+ "vec4 texture2DBilinear(sampler2D sampler, vec2 uv, vec4 size) "\r
+ "{ "\r
+ " vec4 x0 = texture2D(sampler, uv + size.zw * vec2(0.0, 0.0)); "\r
+ " vec4 x1 = texture2D(sampler, uv + size.zw * vec2(1.0, 0.0)); "\r
+ " vec4 x2 = texture2D(sampler, uv + size.zw * vec2(0.0, 1.0)); "\r
+ " vec4 x3 = texture2D(sampler, uv + size.zw * vec2(1.0, 1.0)); "\r
+ " vec2 f = fract(uv.xy * size.xy ); "\r
+ " vec4 y0 = mix(x0, x1, f.x); "\r
+ " vec4 y1 = mix(x2, x3, f.x); "\r
+ " return mix(y0, y1, f.y); "\r
+ "} "\r
+ " "\r
+ "vec4 computeWeights(float x) "\r
+ "{ "\r
+ " vec4 x1 = x*vec4(1.0, 1.0, -1.0, -1.0) + vec4(1.0, 0.0, 1.0, 2.0); "\r
+ " vec4 x2 = x1*x1; "\r
+ " vec4 x3 = x2*x1; "\r
+ " "\r
+ " const float A = -0.75; " \r
+ " vec4 w; "\r
+ " w = x3 * vec2( A, A+2.0).xyyx; "\r
+ " w += x2 * vec2( -5.0*A, -(A+3.0)).xyyx; "\r
+ " w += x1 * vec2( 8.0*A, 0).xyyx; "\r
+ " w += vec2( -4.0*A, 1.0).xyyx; "\r
+ " return w; "\r
+ "} "\r
+ " "\r
+ "vec4 cubicFilter(vec4 w, vec4 c0, vec4 c1, vec4 c2, vec4 c3) "\r
+ "{ "\r
+ " return c0*w[0] + c1*w[1] + c2*w[2] + c3*w[3]; "\r
+ "} "\r
+ " "\r
+ "vec4 texture2DBicubic(sampler2D sampler, vec2 uv, vec4 size) "\r
+ "{ "\r
+ " vec2 f = fract(uv*size.xy); "\r
+ " "\r
+ " vec4 w = computeWeights(f.x); "\r
+ " vec4 t0 = cubicFilter(w, texture2D(sampler, uv + vec2(-1.0, -1.0) * size.zw),"\r
+ " texture2D(sampler, uv + vec2( 0.0, -1.0) * size.zw),"\r
+ " texture2D(sampler, uv + vec2( 1.0, -1.0) * size.zw),"\r
+ " texture2D(sampler, uv + vec2( 2.0, -1.0) * size.zw));"\r
+ " vec4 t1 = cubicFilter(w, texture2D(sampler, uv + vec2(-1.0, 0.0) * size.zw),"\r
+ " texture2D(sampler, uv + vec2( 0.0, 0.0) * size.zw),"\r
+ " texture2D(sampler, uv + vec2( 1.0, 0.0) * size.zw),"\r
+ " texture2D(sampler, uv + vec2( 2.0, 0.0) * size.zw));"\r
+ " vec4 t2 = cubicFilter(w, texture2D(sampler, uv + vec2(-1.0, 1.0) * size.zw),"\r
+ " texture2D(sampler, uv + vec2( 0.0, 1.0) * size.zw),"\r
+ " texture2D(sampler, uv + vec2( 1.0, 1.0) * size.zw),"\r
+ " texture2D(sampler, uv + vec2( 2.0, 1.0) * size.zw));"\r
+ " vec4 t3 = cubicFilter(w, texture2D(sampler, uv + vec2(-1.0, 2.0) * size.zw),"\r
+ " texture2D(sampler, uv + vec2( 0.0, 2.0) * size.zw),"\r
+ " texture2D(sampler, uv + vec2( 1.0, 2.0) * size.zw),"\r
+ " texture2D(sampler, uv + vec2( 2.0, 2.0) * size.zw));"\r
+ " "\r
+ " w = computeWeights(f.y); "\r
+ " return cubicFilter(w, t0, t1, t2, t3); "\r
+ "} ";\r
\r
shaders_[pixel_format::abgr] = common +\r
\r
"void main() "\r
"{ "\r
- "vec4 abgr = texture2D(plane[0], gl_TexCoord[0].st); "\r
+ " vec4 abgr = texture2DBicubic(plane[0], gl_TexCoord[0].st+plane_size[0].zw*0.5, plane_size[0]);"\r
"gl_FragColor = abgr.argb * gl_Color; "\r
"} ";\r
\r
\r
"void main() " \r
"{ "\r
- "vec4 argb = texture2D(plane[0], gl_TexCoord[0].st); "\r
+ "vec4 argb = texture2DBicubic(plane[0], gl_TexCoord[0].st+plane_size[0].zw*0.5, plane_size[0]);"\r
"gl_FragColor = argb.grab * gl_Color; " \r
"} ";\r
\r
\r
"void main() "\r
"{ "\r
- "vec4 bgra = texture2D(plane[0], gl_TexCoord[0].st); "\r
+ "vec4 bgra = texture2DBicubic(plane[0], gl_TexCoord[0].st+plane_size[0].zw*0.5, plane_size[0]);"\r
"gl_FragColor = bgra.rgba * gl_Color; "\r
"} ";\r
\r
\r
"void main() "\r
"{ "\r
- "vec4 rgba = texture2D(plane[0], gl_TexCoord[0].st); "\r
+ "vec4 rgba = texture2DBicubic(plane[0], gl_TexCoord[0].st+plane_size[0].zw*0.5, plane_size[0]);"\r
"gl_FragColor = rgba.bgra * gl_Color; "\r
"} ";\r
\r
\r
"void main() "\r
"{ "\r
- "float y = texture2D(plane[0], gl_TexCoord[0].st).r; "\r
- "float cb = texture2D(plane[1], gl_TexCoord[0].st).r; "\r
- "float cr = texture2D(plane[2], gl_TexCoord[0].st).r; "\r
+ "float y = texture2DBicubic(plane[0], gl_TexCoord[0].st+plane_size[0].zw*0.5, plane_size[0]).r;"\r
+ "float cb = texture2DBicubic(plane[1], gl_TexCoord[0].st+plane_size[1].zw*0.5, plane_size[1]).r;"\r
+ "float cr = texture2DBicubic(plane[2], gl_TexCoord[0].st+plane_size[2].zw*0.5, plane_size[2]).r;"\r
"float a = 1.0; " \r
"gl_FragColor = ycbcra_to_bgra(y, cb, cr, a) * gl_Color; "\r
"} ";\r
\r
"void main() "\r
"{ "\r
- "float y = texture2D(plane[0], gl_TexCoord[0].st).r; "\r
- "float cb = texture2D(plane[1], gl_TexCoord[0].st).r; "\r
- "float cr = texture2D(plane[2], gl_TexCoord[0].st).r; "\r
- "float a = texture2D(plane[3], gl_TexCoord[0].st).r; "\r
+ "float y = texture2DBicubic(plane[0], gl_TexCoord[0].st+plane_size[0].zw*0.5, plane_size[0]).r;"\r
+ "float cb = texture2DBicubic(plane[1], gl_TexCoord[0].st+plane_size[1].zw*0.5, plane_size[1]).r;"\r
+ "float cr = texture2DBicubic(plane[2], gl_TexCoord[0].st+plane_size[2].zw*0.5, plane_size[2]).r;"\r
+ "float a = texture2DBicubic(plane[3], gl_TexCoord[0].st+plane_size[3].zw*0.5, plane_size[3]).r;"\r
"gl_FragColor = ycbcra_to_bgra(y, cb, cr, a) * gl_Color; "\r
"} ";\r
}\r
void use(const pixel_format_desc& desc)\r
{\r
set_pixel_format(desc.pix_fmt);\r
+ set_planes(desc.planes);\r
}\r
\r
void set_pixel_format(pixel_format::type format)\r
shaders_[format].use();\r
}\r
\r
+ void set_planes(const std::vector<pixel_format_desc::plane>& planes)\r
+ {\r
+ for(size_t n = 0; n < planes.size(); ++n)\r
+ glUniform4f(glGetUniformLocation(shaders_[current_].program(), std::string("plane_size[" + boost::lexical_cast<std::string>(n) + "]").c_str()), \r
+ static_cast<float>(planes[n].width), static_cast<float>(planes[n].height), 1.0f/static_cast<float>(planes[n].width), 1.0f/static_cast<float>(planes[n].height));\r
+ }\r
+\r
//void set_size(pixel_format_desc& desc)\r
//{\r
// for(int n = 0; n < 4; ++n)\r