Ok, so I'm trying to make the scene a small 32x32 texture and run into problems. I get an “invalid framebuffer” error when I try to draw something texture. I simplified the code below to just try to display a square of the texture, and then snap this square as a texture to the other quad that appears on the screen. So my question is ... where is the mistake? It uses JOGL 1.1.1. The error occurs in Checkpoint2 in the code.
import java.awt.event.*;
import javax.media.opengl.*;
import javax.media.opengl.glu.*;
import javax.swing.JFrame;
import java.nio.*;
public class Main extends JFrame implements GLEventListener, KeyListener, MouseListener, MouseMotionListener, ActionListener{
private final GLCanvas canvas;
private GL gl;
private GLU glu;
private int winW = 600, winH = 600;
private int texRender_FBO;
private int texRender_RB;
private int texRender_32x32;
public static void main(String args[]) {
new Main();
}
public Main() {
super("Problem Child");
canvas = new GLCanvas();
canvas.addGLEventListener(this);
canvas.addKeyListener(this);
canvas.addMouseListener(this);
canvas.addMouseMotionListener(this);
getContentPane().add(canvas);
setSize(winW, winH);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
canvas.requestFocus();
}
public void display(GLAutoDrawable drawable) {
gl.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, this.texRender_FBO);
gl.glPushAttrib(GL.GL_VIEWPORT_BIT);
gl.glViewport(0, 0, 32, 32);
gl.glClearColor(1.f, 0.f, 0.f, 1.f);
System.out.print("Checkpoint1: "); outputError();
gl.glBegin(GL.GL_QUADS);
{
gl.glColor3f(1.f, 0.f, 0.f);
gl.glVertex3f(0.0f, 1.0f, 1.0f);
gl.glColor3f(1.f, 1.f, 0.f);
gl.glVertex3f(1.0f, 1.0f, 1.0f);
gl.glColor3f(1.f, 1.f, 1.f);
gl.glVertex3f(1.0f, 0.0f, 1.0f);
gl.glColor3f(1.f, 0.f, 1.f);
gl.glVertex3f(0.0f, 0.0f, 1.0f);
}
gl.glEnd(); System.out.print("Checkpoint2: "); outputError();
gl.glPopAttrib();
gl.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, 0);
gl.glClearColor(0.f, 0.f, 0.f, 1.f);
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glColor3f(1.f, 1.f, 1.f);
gl.glBindTexture(GL.GL_TEXTURE_1D, this.texRender_32x32);
gl.glBegin(GL.GL_QUADS);
{
gl.glTexCoord2f(0.0f, 0.0f);
gl.glVertex3f(0.0f, 1.0f, 1.0f);
gl.glTexCoord2f(1.0f, 0.0f);
gl.glVertex3f(1.0f, 1.0f, 1.0f);
gl.glTexCoord2f(1.0f, 1.0f);
gl.glVertex3f(1.0f, 0.0f, 1.0f);
gl.glTexCoord2f(0.0f, 1.0f);
gl.glVertex3f(0.0f, 0.0f, 1.0f);
}
gl.glEnd();
}
public void init(GLAutoDrawable drawable) {
gl = drawable.getGL();
glu = new GLU();
gl.glClearColor(.3f, .3f, .3f, 1f);
gl.glClearDepth(1.0f);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrtho(0, 1, 0, 1, -10, 10);
gl.glMatrixMode(GL.GL_MODELVIEW);
this.texRender_FBO = genFBO(gl);
gl.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, this.texRender_FBO);
this.texRender_32x32 = genTexture(gl);
gl.glBindTexture(GL.GL_TEXTURE_2D, this.texRender_32x32);
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB_FLOAT32_ATI, 32, 32, 0, GL.GL_RGB, GL.GL_FLOAT, null);
gl.glFramebufferTexture2DEXT(GL.GL_FRAMEBUFFER_EXT, GL.GL_COLOR_ATTACHMENT0_EXT, GL.GL_TEXTURE_2D, this.texRender_32x32, 0);
this.texRender_RB = genRB(gl);
gl.glBindRenderbufferEXT(GL.GL_RENDERBUFFER_EXT, this.texRender_RB);
gl.glRenderbufferStorageEXT(GL.GL_RENDERBUFFER_EXT, GL.GL_DEPTH_COMPONENT24, 32, 32);
gl.glFramebufferRenderbufferEXT(GL.GL_FRAMEBUFFER_EXT, GL.GL_DEPTH_ATTACHMENT_EXT, GL.GL_RENDERBUFFER_EXT, this.texRender_RB);
gl.glBindFramebufferEXT(GL.GL_FRAMEBUFFER_EXT, 0);
gl.glBindRenderbufferEXT(GL.GL_RENDERBUFFER_EXT, 0);
outputError();
}
private void outputError() {
int c;
if ((c = gl.glGetError()) != GL.GL_NO_ERROR)
System.out.println(glu.gluErrorString(c));
}
private int genRB(GL gl) {
int[] array = new int[1];
IntBuffer ib = IntBuffer.wrap(array);
gl.glGenRenderbuffersEXT(1, ib);
return ib.get(0);
}
private int genFBO(GL gl) {
int[] array = new int[1];
IntBuffer ib = IntBuffer.wrap(array);
gl.glGenFramebuffersEXT(1, ib);
return ib.get(0);
}
private int genTexture(GL gl) {
final int[] tmp = new int[1];
gl.glGenTextures(1, tmp, 0);
return tmp[0];
}
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
winW = width;
winH = height;
gl.glViewport(0, 0, width, height);
}
public void mousePressed(MouseEvent e) {}
public void mouseDragged(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void keyPressed(KeyEvent e) {}
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) { }
public void keyTyped(KeyEvent e) { }
public void keyReleased(KeyEvent e) { }
public void mouseMoved(MouseEvent e) { }
public void actionPerformed(ActionEvent e) { }
public void mouseClicked(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
}