title: OpenGL Framebuffer Render to Texture not Working
body: <p>I'm experimenting with framebuffers to create a glow effect using Java and JOGL, but I am having problems. At the moment, my goal is to render my spaceship model, textured with an illumination texture, to a framebuffer texture and then draw the framebuffer texture to a triangle fan quad. I'm running with OpenGL 2.1 and/or 2.0 Here is my code for generating the framebuffer and its texture:</p>
  
  <pre><code>private int createFrameBuffer(GL2GL3 gl) {
      _frameBufferTextureId = GLHelper.makeTextureBuffer(gl, GL2GL3.GL_RGBA, _width / 2, _height / 2, 0, GL2GL3.GL_RGBA,
              GL2GL3.GL_UNSIGNED_BYTE, GL2GL3.GL_TEXTURE_MIN_FILTER, GL2GL3.GL_TEXTURE_MIN_FILTER, GL2GL3.GL_REPEAT, null);
      int frameBufferId = GLHelper.makeFrameBuffer(gl, _frameBufferTextureId, _width / 2, _height / 2);
      return frameBufferId;
  }
  
  public static int makeTextureBuffer(GL2GL3 gl, int glEnumInternalFormat, int width, int height, int border,
          int glEnumPixelFormat, int glEnumPixelType, int glEnumMinFilter, int glEnumMagFilter, int glEnumWrapMode,
          File textureFile) {
      ByteBuffer textureDataBuffer = null;
      if (textureFile != null) {
          String filePath = textureFile.getPath();
          String extension = filePath.substring(filePath.lastIndexOf('.') + 1, filePath.length());
          TextureData textureData = null;
          try {
              textureData = TextureIO.newTextureData(gl.getGLProfile(), textureFile, false, extension);
          } catch (IOException e) {
              throw new RuntimeException("Error reading texture");
          }
          textureDataBuffer = getProperlyFormattedBuffer(textureData);
      }
      IntBuffer texture = IntBuffer.allocate(1);
      gl.glGenTextures(1, texture);
      gl.glBindTexture(GL2GL3.GL_TEXTURE_2D, texture.get(0));
      gl.glTexParameteri(GL2GL3.GL_TEXTURE_2D, GL2GL3.GL_TEXTURE_MIN_FILTER, glEnumMinFilter);
      gl.glTexParameteri(GL2GL3.GL_TEXTURE_2D, GL2GL3.GL_TEXTURE_MAG_FILTER, glEnumMagFilter);
      gl.glTexParameteri(GL2GL3.GL_TEXTURE_2D, GL2GL3.GL_TEXTURE_WRAP_S, glEnumWrapMode);
      gl.glTexParameteri(GL2GL3.GL_TEXTURE_2D, GL2GL3.GL_TEXTURE_WRAP_T, glEnumWrapMode);
      gl.glTexImage2D(GL2GL3.GL_TEXTURE_2D, 0, glEnumInternalFormat, width, height, border, glEnumPixelFormat, glEnumPixelType,
              textureDataBuffer);
      gl.glBindTexture(GL2GL3.GL_TEXTURE_2D, 0);
      return texture.get(0);
  }
  
  public static int makeFrameBuffer(GL2GL3 gl, int textureBufferId, int width, int height) {
      IntBuffer frameBuffer = IntBuffer.allocate(1);
      gl.glGenFramebuffers(1, frameBuffer);
      gl.glBindFramebuffer(GL2GL3.GL_FRAMEBUFFER, frameBuffer.get(0));
      gl.glFramebufferTexture2D(GL2GL3.GL_FRAMEBUFFER, GL2GL3.GL_COLOR_ATTACHMENT0, GL2GL3.GL_TEXTURE_2D, textureBufferId, 0);
      verifyFrameBuffer(gl);
      gl.glBindFramebuffer(GL2GL3.GL_FRAMEBUFFER, 0);
      return frameBuffer.get(0);
  }
  
  private void drawTextureQuad(GL2GL3 gl) {
      _glowShader.bind(gl);
      int textureLocation = _glowShader.getUniformFields().getIlluminationTextureLocation();
      gl.glUniform1i(textureLocation, 0);
      gl.glActiveTexture(GL2GL3.GL_TEXTURE0);
      gl.glBindTexture(GL2GL3.GL_TEXTURE_2D, _frameBufferTextureId);
  
      int vertexLocation = _glowShader.getAttributeFields().getVertexLocation();
      gl.glBindBuffer(GL2GL3.GL_ARRAY_BUFFER, _textureQuadId);
      gl.glVertexAttribPointer(vertexLocation, 3, GL2GL3.GL_FLOAT, false, 0, 0);
      gl.glEnableVertexAttribArray(vertexLocation);
  
      int textureCoordLocation = _glowShader.getAttributeFields().getVertexTextureCoordinateLocation();
      gl.glBindBuffer(GL2GL3.GL_ARRAY_BUFFER, _textureQuadCoordsId);
      gl.glVertexAttribPointer(textureCoordLocation, 2, GL2GL3.GL_FLOAT, false, 0, 0);
      gl.glEnableVertexAttribArray(textureCoordLocation);
  
      gl.glDrawArrays(GL2GL3.GL_TRIANGLE_FAN, 0, 4);
      _glowShader.unbind(gl);
  }
  </code></pre>
  
  <p>In my render loop, I am doing the following:</p>
  
  <pre><code>_glowShader.bind(gl);// bind my Shader object.
  gl.glUniformMatrix4fv(_glowShader.getUniformFields().getProjectionMatrixLocation(), 1, true, _projectionMatrix.getBuffer());
  gl.glUniformMatrix4fv(_glowShader.getUniformFields().getModelViewMatrixLocation(), 1, true, _modelViewMat.getBuffer());
  gl.glBindFramebuffer(GL.GL_FRAMEBUFFER, _framebufferId);
  gl.glDrawBuffers(1, _frameBufferAttachmentss); //contains GL_COLOR_ATTACHMENT0
  gl.glViewport(0, 0, _width / 2, _height / 2); // same size as texture
  _spaceship.draw(gl, _glowShader);// draw method in my ModelObject class
  gl.glBindFramebuffer(GL.GL_FRAMEBUFFER, 0);
  _glowShader.unbind(gl);
  
  drawTextureQuad(gl);
  </code></pre>
  
  <p>When I run this, my quad is drawn as it should, but the texture is all black. When I comment out any framebuffer bindings in my render loop, the model is rendered as it should, so I know that there is nothing wrong with my shader code. When I replace _frameBufferTextureId with another texture loaded from a file, that texture is properly drawn, so I know my texture coordinates are working and, again, my shader code is correct. Whenever I bind my frame buffer though, I don't get anything I expect. I'm also verifying my framebuffer and it is GL_FRAMEBUFFER_COMPLETE.</p>
  
  <p>I've read countless tutorials and posts here on stackoverflow, but I can't for the life of me figure out what I'm doing wrong. Any help would be great! Thanks.</p>