I would like to get a possible explanation for a discrepancy in the resulting output when Blitting versus sending a texture to a shader for simple rendering.

My blit operation is simply sending fbo blit to the default framebuffer of the same dimension:
Code :
      glBlitFramebuffer(0, 0, width_, height_, 0, 0, width_, height_,
                        GL_COLOR_BUFFER_BIT, GL_NEAREST);
Everything renders fine.
The other operation, which also renders but very differently, as if the camera is looking from a different perspective, is done in the shaders

vert:
Code :
#version 450 core
layout (location = 0) in vec3 vert;
layout (location = 1) in vec2 texCoord;
out vec2 fTexCoord;
void main()
{
  fTexCoord = texCoord;
  gl_Position = vec4(vert, 1);
}

frag:
Code :
#version 450 core
uniform sampler2D tex;
in vec2 fTexCoord;
out vec4 fColor;
void main()
{
  fColor = texture(tex, fTexCoord);
}

Inputs to the shader are:

Code :
std::vector<GLfloat> verts = {0,0,0, 0,1,0, 1,1,0, 1,0,0};
std::vector<GLfloat> tex_coords = {0,0, 0,1, 1,1, 1,0};
std::vector<GLuint> indices = {0, 1, 2, 2, 3, 0};

Finally, from the vao setup
Code :
      vbos_.resize(3);
      glGenBuffers(3, vbos_.data());
      glBindBuffer(GL_ARRAY_BUFFER, vbos_[0]);
      glBufferData(GL_ARRAY_BUFFER, verts.size() * sizeof(GLfloat),
                   verts.data(), GL_DYNAMIC_DRAW);
      glEnableVertexAttribArray(0);
      glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
 
      glBindBuffer(GL_ARRAY_BUFFER, vbos_[1]);
      glBufferData(GL_ARRAY_BUFFER, tex_coords.size() * sizeof(GLfloat),
                   tex_coords.data(), GL_DYNAMIC_DRAW);
      glEnableVertexAttribArray(1);
      glVertexAttribPointer(1, 2, GL_FLOAT, GL_TRUE, 0, NULL); // normalize
 
      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos_[2]);
      glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3 * indices.size() * sizeof(GLuint),
                   indices.data(), GL_STATIC_DRAW);
      glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

I render:

Code :
        GLuint rgb_handle = get_tex_handle(); // returns the fbo texture handle
        program_->SaveBind(); // bind the program
        glEnable(GL_TEXTURE_2D);
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, rgb_handle);
        program_->SetUniform("tex", 0);
        glBindVertexArray(vao_);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos_.back());
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        glBindVertexArray(0);
        glBindTexture(GL_TEXTURE_2D, 0);

And it produces the same data, but in a different location on my main screen. Is there anything obviously wrong here?