[lwjgl] Rendering to texture with framebuffer object

Hi,

I’m trying to render to a texture with a frame buffer object like in this tutorial (i’m using lwjgl): FBO

I guess I made some mistakes because it’s not working well.

Here is my code:

import static org.lwjgl.opengl.EXTFramebufferObject.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL20.*;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.util.vector.Vector3f;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;

public class FBO {

	//window size
	final int WIDTH = 640;
	final int HEIGHT = 480;
	
	//texture
	Texture box;
	Texture light;
	
	//frame buffer
	int fbo;
	int depthbuffer;
	int fb_texture;
	
	public void start(){
		setUpDisplay();
		setUpGL();
		loadTextures();
		createFBO();
		
		while(!Display.isCloseRequested()){
			render();
			Display.update();
			Display.sync(60);
		}
	}
	
	private void render(){
		//render to fbo
		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
		glPushAttrib(GL_VIEWPORT_BIT);
		glViewport(0, 0, WIDTH, HEIGHT);
		
		glBindTexture(GL_TEXTURE_2D, light.getTextureID());
		drawTexture(0, 0, 64, 64);
		glBindTexture(GL_TEXTURE_2D, 0);
		
		glPopAttrib();
		
		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
		
		//render the texture
		glBindTexture(GL_TEXTURE_2D, fb_texture);
		drawTexture(0, 0, WIDTH, HEIGHT);
		glBindTexture(GL_TEXTURE_2D, 0);
		
	}
	
	private void drawTexture(float x, float y, int width, int height){
		glBegin(GL_QUADS);
		glTexCoord2f(0f, 0f);
		glVertex2f(x, y);
		
		glTexCoord2f(1f, 0f);
		glVertex2f(x + width, y);
		
		glTexCoord2f(1f, 1f);
		glVertex2f(x + width, y + height);
		
		glTexCoord2f(0f, 1f);
		glVertex2f(x, y + height);
		glEnd();
	}
	
	private void createFBO() {
		
		//frame buffer
		fbo = glGenFramebuffersEXT();
		glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
		
		//depth buffer
		depthbuffer = glGenRenderbuffersEXT();
		glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthbuffer);
		
		//allocate space for the renderbuffer
		glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, WIDTH, HEIGHT);
		
		//attach depth buffer to fbo
		glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthbuffer);
		
		//create texture to render to
		fb_texture = glGenTextures();
		glBindTexture(GL_TEXTURE_2D, fb_texture);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, WIDTH, HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, (java.nio.ByteBuffer)null);
		
		//attach texture to the fbo
		glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, fb_texture, 0);
		
		//check completeness
		if(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) == GL_FRAMEBUFFER_COMPLETE_EXT){
			System.out.println("Frame buffer created sucessfully.");
		}
		else
			System.out.println("An error occured creating the frame buffer.");
		
	}
	
	
	

	private void loadTextures(){
		try {
			box = TextureLoader.getTexture("PNG", getClass().getResourceAsStream("/box.png"), GL_NEAREST);
			light = TextureLoader.getTexture("PNG", getClass().getResourceAsStream("/light.png"), GL_NEAREST);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	private void setUpGL() {
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		glOrtho(0, WIDTH, HEIGHT, 0, 1, -1);
		glMatrixMode(GL_MODELVIEW);
		glViewport(0, 0, Display.getWidth(), Display.getHeight());
		glEnable(GL_TEXTURE_2D);
		glEnable(GL_BLEND);
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
		glClearColor(0f, 0f, 0f, 0f);
		
	}


	private void setUpDisplay() {
		try {
			Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT));
			Display.setTitle("FBO Test");
			Display.create();
		} catch (LWJGLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}


	public static void main(String[] args){
		new FBO().start();
	}
}

I just obtain a white screen (meaning the rendered to texture is empty).
Any idea what am I doing wrong?

Finally fixed it.
I was missing glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); after line 100 when I bind the texture.