Note that there are some explanatory texts on larger screens.

plurals
  1. POOpenGL Framebuffer Render to Texture not Working
    text
    copied!<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>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload