title: GLSL Render to Texture not working
body: <p>I'm trying to do a compute pass where I render to a texture that will be used in a draw pass later on. My initial implementation was based on shader storage buffer objects and was working nicely. But I want to apply a computation method that is going to take advantage of the blend hardware of the GPU so I started porting the SSBO implementation to RTT one. Unfortunately the code has stopped working. Now when I read back the texture it is getting wrong values.</p>
  
  <p>Here is my texture and frame buffer setup code:</p>
  
  <pre><code>glGenFramebuffers(1, &amp;m_fbo);
  glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
  
  // Create render textures
  glGenTextures(NUM_TEX_OUTPUTS, m_renderTexs);
  m_texSize = square_approximation(m_numVertices);
  cout &lt;&lt; "Textures size: " &lt;&lt; glm::to_string(m_texSize) &lt;&lt; endl;
  GLenum drawBuffers[NUM_TEX_OUTPUTS];
  for (int i = 0 ; i &lt; NUM_TEX_OUTPUTS; ++i)
  {
      glBindTexture(GL_TEXTURE_2D, m_renderTexs[i]);
      // 1st 0: level, 2nd 0: no border, 3rd 0: no initial data
      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_texSize.x, m_texSize.y, 0, GL_RGBA, GL_FLOAT, 0);
      // XXX: do we need this?
      // Poor filtering. Needed !
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
      glBindTexture(GL_TEXTURE_2D, 0);
  
      // 0: level
      glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, m_renderTexs[i], 0);
      drawBuffers[i] = GL_COLOR_ATTACHMENT0 + i;
  }
  glDrawBuffers(NUM_TEX_OUTPUTS, drawBuffers);
  if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
  {
      cout &lt;&lt; "Error when setting frame buffer" &lt;&lt; endl;
      // throw exception?
  }
  glBindFramebuffer(GL_FRAMEBUFFER, 0);
  </code></pre>
  
  <p>And this is the code to start the compute pass:</p>
  
  <pre><code>m_shaderProgram.use();
  
  // setup openGL
  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  glDisable(GL_CULL_FACE);
  glDisable(GL_DEPTH_TEST);
  glViewport(0, 0, m_texSize.x, m_texSize.y); // setup viewport (equal to textures size)
  // make a single patch have the vertex, the bases and the neighbours
  glPatchParameteri(GL_PATCH_VERTICES, m_maxNeighbours + 5);
  
  // Wait all writes to shader storage to finish
  glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
  
  glUniform1i(m_shaderProgram.getUniformLocation("curvTex"), m_renderTexs[2]);
  glUniform2i(m_shaderProgram.getUniformLocation("size"), m_texSize.x, m_texSize.y);
  glUniform2f(m_shaderProgram.getUniformLocation("vertexStep"), (umax - umin)/divisoes,
              (vmax-vmin)/divisoes);
  
  // Bind buffers 
  glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
  glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
  glBindBufferBase(GL_UNIFORM_BUFFER, m_mvp_location, m_mvp_ubo);
  
  // Make textures active
  for (int i = 0; i &lt; NUM_TEX_OUTPUTS; ++i)
  {
      glActiveTexture(GL_TEXTURE0 + i);
      glBindTexture(GL_TEXTURE_2D, m_renderTexs[i]);
  }
  
  // no need to pass index array 'cause ibo is bound already
  glDrawElements(GL_PATCHES, m_numElements, GL_UNSIGNED_INT, 0);
  </code></pre>
  
  <p>I then read back the textures using the following:</p>
  
  <pre><code>bool readTex(GLuint tex, void *dest)
  {
      glBindTexture(GL_TEXTURE_2D, tex);
      glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, dest);
      glBindTexture(GL_TEXTURE_2D, 0);
  
      // TODO: check glGetTexImage return values for error
      return true;
  }
  
  for (int i = 0; i &lt; NUM_TEX_OUTPUTS; ++i)
  {
      if (m_tensors[i] == NULL) {
          m_tensors[i] = new glm::vec4[m_texSize.x*m_texSize.y];
      }
      memset(m_tensors[i], 0, m_texSize.x*m_texSize.y*sizeof(glm::vec4));
      readTex(m_renderTexs[i], m_tensors[i]);
  }
  </code></pre>
  
  <p>Finally, the fragment shader code is:</p>
  
  <pre><code>#version 430
  #extension GL_ARB_shader_storage_buffer_object: require
  
  layout(pixel_center_integer) in vec4 gl_FragCoord;
  
  layout(std140, binding=6) buffer EvalBuffer {
      vec4 evalDebug[];
  };
  
  uniform ivec2 size;
  
  in TEData {
      vec4 _a;
      vec4 _b;
      vec4 _c;
      vec4 _d;
      vec4 _e;
  };
  
  layout(location = 0) out vec4 a;
  layout(location = 1) out vec4 b;
  layout(location = 2) out vec4 c;
  layout(location = 3) out vec4 d;
  layout(location = 4) out vec4 e;
  
  void main()
  {
      a= _a;
      b= _b;
      c= _c;
      d= _d;
      e= _e;
      evalDebug[gl_PrimitiveID] = gl_FragCoord;
  }
  </code></pre>
  
  <p>The fragment coordinates are correct (each fragment is pointing to a x,y coordinate in the texture), so are all the input values (_a to _e), but I do not see them outputted correctly to the textures when reading back. I also tried accessing the texture in the shader to see if it was only a read-back error, but my debug SSBO returned all zeroes.</p>
  
  <p>Am I missing some setup step?
  I've tested both on linux and windows (titan and 540M geforces) and I'm using openGL 4.3.</p>