2010-04-16 4 views
3

Ok, donc j'essaye de rendre une scène à une petite texture 32x32 et j'ai rencontré des problèmes. Je reçois une erreur "opération de framebuffer invalide" quand j'essaye de dessiner quelque chose à la texture. J'ai simplifié le code ci-dessous pour qu'il essaie simplement de rendre un quad à une texture et ensuite lie ce quad comme texture pour un autre quadruplé qui est rendu à l'écran. Donc, ma question est la suivante ... où est l'erreur? Ceci utilise JOGL 1.1.1. L'erreur se produit à Checkpoint2 dans le code.Problème avec JOGL et Framebuffer Rendu-à-texture: Erreur d'opération de framebuffer non valide

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{ 


/* GL related variables */ 
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(); 
} 

/* creates OpenGL window */ 
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(); 
} 

/* gl display function */ 
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.glTexCoord2f(0.0f, 0.0f); 
     gl.glColor3f(1.f, 0.f, 0.f); 
     gl.glVertex3f(0.0f, 1.0f, 1.0f); 
     //gl.glTexCoord2f(1.0f, 0.0f); 
     gl.glColor3f(1.f, 1.f, 0.f); 
     gl.glVertex3f(1.0f, 1.0f, 1.0f); 
     //gl.glTexCoord2f(1.0f, 1.0f); 
     gl.glColor3f(1.f, 1.f, 1.f); 
     gl.glVertex3f(1.0f, 0.0f, 1.0f); 
     //gl.glTexCoord2f(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(); //Here I get an invalid framebuffer operation 

    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.glColor3f(1.f, 0.f, 0.f); 
     gl.glVertex3f(0.0f, 1.0f, 1.0f); 
     gl.glTexCoord2f(1.0f, 0.0f); 
     //gl.glColor3f(1.f, 1.f, 0.f); 
     gl.glVertex3f(1.0f, 1.0f, 1.0f); 
     gl.glTexCoord2f(1.0f, 1.0f); 
     //gl.glColor3f(1.f, 1.f, 1.f); 
     gl.glVertex3f(1.0f, 0.0f, 1.0f); 
     gl.glTexCoord2f(0.0f, 1.0f); 
     //gl.glColor3f(1.f, 0.f, 1.f); 
     gl.glVertex3f(0.0f, 0.0f, 1.0f); 
    } 
    gl.glEnd(); 
} 

/* initialize GL */ 
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); 

    //Set up the 32x32 texture 
    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); 
    //gl.glDrawBuffer(GL.GL_COLOR_ATTACHMENT0_EXT); 

    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]; 
} 

/* mouse and keyboard callback functions */ 
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { 
    winW = width; 
    winH = height; 

    gl.glViewport(0, 0, width, height); 
} 

//Sorry about these, I just had to delete massive amounts of code to boil this thing down and these are hangers-on 
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) { } 

} 
+0

J'ai aussi ajouter ceci: gl.glEnable (GL.GL_TEXTURE_2D); – peterk

Répondre

3

Essayez un autre format interne pour texRender_32x32. Je pense que cela doit être un format RGBA et pas seulement RVB.

EDIT: Ok, je pense que je l'ai trouvé. Vous utilisez les min-filtres par défaut pour la texture qui impliquerait mipmapping. Ajoutez cette ligne après la création & liant la texture et tout devrait fonctionner:

gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); 
+0

Ok, j'ai changé la ligne en gl.glTexImage2D (GL.GL_TEXTURE_2D, 0, GL.GL_RGBA_FLOAT32_ATI, 32, 32, 0, GL.GL_RGBA, GL.GL_FLOAT, null); mais toujours pas de chance. – jcb

+0

Sweet. C'était ça. – jcb

0

J'ai eu des problèmes avec cet exemple aussi. L'erreur était

gl.glBindTexture(GL.GL_TEXTURE_1D, this.texRender_32x32); 

devrait être

gl.glBindTexture(GL.GL_TEXTURE_2D, this.texRender_32x32); 
Questions connexes