HorizontalFlipPostEffectShader::HorizontalFlipPostEffectShader() :
        program_(0), a_position_(0), a_tex_coord_(0), u_texture_(0) {
    deleter_ = getDeleterForThisThread();

    program_ = new GLProgram(VERTEX_SHADER, FRAGMENT_SHADER);
    a_position_ = glGetAttribLocation(program_->id(), "a_position");
    a_tex_coord_ = glGetAttribLocation(program_->id(), "a_tex_coord");
    u_texture_ = glGetUniformLocation(program_->id(), "u_texture");
    vaoID_ = 0;
}
CustomPostEffectShader::CustomPostEffectShader(std::string vertex_shader,
        std::string fragment_shader) :
        program_(0), a_position_(0), a_tex_coord_(0), u_texture_(0), texture_keys_(), float_keys_(), vec2_keys_(), vec3_keys_(), vec4_keys_(), mat4_keys_() {
    deleter_ = getDeleterForThisThread();

    program_ = new GLProgram(vertex_shader.c_str(), fragment_shader.c_str());
    a_position_ = glGetAttribLocation(program_->id(), "a_position");
    checkGlError("glGetAttribLocation");
    a_tex_coord_ = glGetAttribLocation(program_->id(), "a_tex_coord");
    checkGlError("glGetAttribLocation");
    u_texture_ = glGetUniformLocation(program_->id(), "u_texture");
    checkGlError("glGetUniformLocation");
    u_projection_matrix_ = glGetUniformLocation(program_->id(), "u_projection_matrix");
    checkGlError("glGetUniformLocation");
    u_right_eye_ = glGetUniformLocation(program_->id(), "u_right_eye");
    checkGlError("glGetUniformLocation");

    vaoID_ = 0;

}