2010-03-05 8 views
4

Je suis passé à l'utilisation d'un GLJPanel d'un GLCanvas pour éviter certains problèmes de scintillement, mais cela a créé plusieurs conséquences inattendues. D'après ce que j'ai glané jusqu'ici, GLJPanel appelle GLEventListener.init() chaque fois qu'il est redimensionné, ce qui réinitialise différentes fonctions OpenGL que j'ai activées dans init() (test de profondeur, éclairage, etc ...) si J'ai de la chance, ou efface complètement mon modèle si je ne le suis pas.Redimensionner un GLJPanel avec JOGL fait disparaître mon modèle

J'ai essayé de le déboguer mais je ne suis pas capable de corriger ce comportement. Ceci est ma fonction init():

gl.glShadeModel(GL.GL_SMOOTH); 

    gl.glEnable(GL.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL.GL_LEQUAL); 
    gl.glDepthRange(zNear, zFar); 

    gl.glDisable(GL.GL_LINE_SMOOTH); 
    gl.glEnable(GL.GL_NORMALIZE); 

    gl.glEnable(GL.GL_BLEND); 
    gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); 

    // set up the background color 
    gl.glClearColor(((float)backColor.getRed ()/255.0f), 
        ((float)backColor.getGreen()/255.0f), 
        ((float)backColor.getBlue()/255.0f), 1.0f); 

    gl.glEnable (GL.GL_LIGHTING); 
    gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, Constants.AMBIENT_LIGHT, 0); 
    gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, Constants.DIFFUSE_LIGHT, 0); 

    gl.glEnable (GL.GL_LIGHT0); 

    gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_MODULATE); 
    gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); 

    // code to generate model 

Est-il possible autour de cette autre que d'enlever tout de init(), ajoutant à ma fonction d'affichage()? Étant donné le comportement de init() et reshape() pour GLJPanel, je ne suis pas sûr que cela le corrigera non plus.

Répondre

3

GLJPanel et CLCanvas sont essentiellement identiques dans leur fonction, en ce qui concerne JOGL. La seule différence est que GLJPanel est JComponent et léger, alors que GLCanvas est un composant et un poids lourd. Il est probable que tous les problèmes que vous voyez ne sont pas dus à ces différences (bien que JOGL ne soit pas la partie la plus stable de Java, et il pourrait y avoir une différence «non documentée»).

Un modèle disparaissant est probablement dû soit à l'absence d'appel réel du code de dessin, soit à un mauvais réglage de l'initialisation GL (très facile à faire). Je recommande de tout transférer à la fonction display(). Si cela résout le problème, déplacez les choses une à la fois (ce n'est qu'un problème de performance). Cela dit, je ne vous vois pas régler la taille de la fenêtre dans init(). C'est l'une des choses à faire chaque fois que la taille de la fenêtre change.

+0

Cher dieu, je pense que ça pourrait être, viewport est défini dans ma fonction Display and Reshape, donc je suppose que je n'ai pas pensé à l'inclure dans ma fonction init(). – badcodenotreat

3

De gljpanel doc:

Notez que parce que cette composante tente d'utiliser pbuffers pour le rendu, et parce que pbuffers ne peuvent être redimensionnées, le comportement quelque peu surprenant peut se produire lors des opérations de redimensionnement; La méthode GLEventListener.init (net.java.games.jogl.GLDrawable) peut être appelée plusieurs fois lorsque le paramètre pbuffer est redimensionné pour pouvoir couvrir la taille du GLJPanel. Ce comportement est correct, car les textures et les listes d'affichage pour le GLJPanel auront été perdues lors de l'opération de redimensionnement. L'application doit essayer de rendre ses méthodes GLEventListener.init() aussi exemptes d'effets secondaires que possible.

Oui, Il suce. Parce que vous avez besoin de stocker vos données de vertex et autres dans la petite mémoire JVM. En fait, je cherche pourquoi ils ne réutilisent pas le même contexte.