const char *code = "uniform sampler2D ytex, utex, vtex;\n" "void main(void) {\n" " float r, g, b, y, u, v;\n" " y = texture2D(ytex, gl_TexCoord[0].st).r;\n" " u = texture2D(utex, gl_TexCoord[0].st).r;\n" " v = texture2D(vtex, gl_TexCoord[0].st).r;\n" " y = (y - 0.0625) * 1.164;\n" " u = u - 0.5;\n" " v = v - 0.5;\n" " r = y + (1.402 * v);\n" " g = y - (0.34414 * u) - (0.71414 * v);\n" " b = y + (1.772 * u);\n" " gl_FragColor = vec4(r, g, b, 1.0);\n" "}\n"; glShaderSourceARB(fshad, 1, &code, NULL); glCompileShaderARB(fshad); glAttachObjectARB(tex->prog, fshad); glLinkProgramARB(tex->prog); glEnable(GL_TEXTURE_2D); texfmt = GL_LUMINANCE; glGenTextures(1, &(tex->texture)); glUniform1iARB(glGetUniformLocationARB(tex->prog, "ytex", 0)); glBindTexture(GL_TEXTURE_2D, tex->texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, texfmt, tw, th, 0, texfmt, GL_UNSIGNED_BYTE, rows[0]); glGenTextures(1, &(tex->texture2)); glUniform1iARB(glGetUniformLocationARB(tex->prog, "utex", 1)); glBindTexture(GL_TEXTURE_2D, tex->texture2); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, texfmt, tw / 2, th / 2, 0, texfmt, GL_UNSIGNED_BYTE, rows[th]); glGenTextures(1, &(tex->texture3)); glUniform1iARB(glGetUniformLocationARB(tex->prog, "vtex", 2)); glBindTexture(GL_TEXTURE_2D, tex->texture3); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexImage2D(GL_TEXTURE_2D, 0, texfmt, tw / 2, th / 2, 0, texfmt, GL_UNSIGNED_BYTE, rows[th + (th / 2)]);