2017-01-04 1 views
0

Je fais une animation avec JOGL. J'ai besoin de dessiner quelques éléments mais certains d'entre eux sont toujours les mêmes avec les mêmes propriétés et aucun autre objet ne va bouger dans ces régions. C'est pourquoi je suis d'accord avec l'implémentation de glScissor. Donc, mon idée est la suivante: je déclare une variable booléenne comme vraie et je fais une instruction if qui ne sera vraie que pour la première image. À l'intérieur de la déclaration if, j'appelle une fonction qui va peindre tout ce dont j'ai besoin comme constante, puis j'active glScissors. Mon problème est que même si je vois que seulement dans la zone avec des ciseaux, l'image est en train d'être changée, dans la région extérieure, je peux voir un scintillement. C'est comme s'il y avait des cadres noirs entre les autres avec l'image correcte. Pourquoi? Qu'est-ce que je fais mal?glScissors me produit scintillement avec des animations (JOGL)

boolean first = true;  

public void init(GLAutoDrawable drawable) { 
    final GL2 gl = (GL2) drawable.getGL(); 

    // Enable z- (depth) buffer for hidden surface removal. 
    gl.glEnable(GL.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL.GL_LEQUAL); 

    // Enable smooth shading. 
    gl.glShadeModel(GL2.GL_SMOOTH); 

    // Define "clear" color. 
    gl.glClearColor(1f, 1f, 1f, 1f); 

    // We want a nice perspective. 
    gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); 

    // Create GLU. 
    glu = new GLU(); 
    GLProfile profile = GLProfile.get(GLProfile.GL2); 

    gl.glPixelStorei(gl.GL_PACK_ALIGNMENT, 1); 
} 

public void display(GLAutoDrawable drawable) { 

    final GL2 gl = (GL2) drawable.getGL(); 

    // Clear screen. 
    gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 

    // Set camera. 
    setCamera(gl, glu, 30); 

    // Prepare light parameters. 
    float SHINE_ALL_DIRECTIONS = 1; 
    float[] lightPos = {0, 0, 0, SHINE_ALL_DIRECTIONS}; 
    float[] lightColorAmbient = {1f, 1f, 1f, 1f}; 
    float[] lightColorSpecular = {1f, 1f, 1f, 1f}; 

    // Set light parameters. 
    gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_POSITION, lightPos, 0); 
    gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_AMBIENT, lightColorAmbient, 0); 
    gl.glLightfv(GL2.GL_LIGHT1, GL2.GL_SPECULAR, lightColorSpecular, 0); 

    // Enable lighting in GL. 
    gl.glEnable(GL2.GL_LIGHT1); 
    gl.glEnable(GL2.GL_LIGHTING); 
    if (first==true){ 
     first=false; 
     //inside plot_constant_object I don't change anything related with lighting 
     Plot_constant_objects(drawable, gl); 
     gl.glScissor(100, 100, 500, 500); 
     gl.glEnable(gl.GL_SCISSOR_TEST); 
    } 
    //Draw other stuff 

} 
+0

Vous ne devriez pas utiliser [OpenGL Obsolète] (https://www.khronos.org/opengl/wiki/Legacy_OpenGL) – elect

+0

Je vous conseille de regarder le travail exemple ici: http://www.java-gaming.org/index.php/topic,13652. En passant, veuillez remplacer "glu = new GLU()" par "glu = GLU.createGLU (gl)". – gouessej

+0

Quelle est la différence goussej? Les deux ont travaillé pour moi (à propos de GLU je veux dire). A propos de cette page, ça n'a pas marché! J'espère avoir trouvé une solution :) –

Répondre

0

Après http://anirudhsasikumar.net/blog/2006.03.04.html il vous suffit de:

a) écrire glDrawBuffer (GL_FRONT_AND_BACK) dans init()

OU

b) copie la mémoire tampon avant vers le tampon arrière. Si vous modifiez le tampon de dessin par défaut ou l'opération de logique par défaut, vous souhaiterez également les enregistrer et les restaurer. Le code comme indiqué dans cette page est:

void copy_buffer() 
{ 
    static GLint viewport[4]; 
    static GLfloat raster_pos[4]; 

    glGetIntegerv(GL_VIEWPORT, viewport); 

    /* set source buffer */ 
    glReadBuffer(GL_FRONT); 

    /* set projection matrix */ 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity() ; 
    gluOrtho2D(0, viewport[2], 0, viewport[3]); 

    /* set modelview matrix */ 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    glLoadIdentity(); 

    /* save old raster position */ 
    glGetFloatv(GL_CURRENT_RASTER_POSITION, raster_pos); 

    /* set raster position */ 
    glRasterPos4f(0.0, 0.0, 0.0, 1.0); 

    /* copy buffer */ 
    glCopyPixels(0, 0, viewport[2], viewport[3], GL_COLOR); 

    /* restore old raster position */ 
    glRasterPos4fv(raster_pos); 

    /* restore old matrices */ 
    glPopMatrix(); 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_MODELVIEW); 

    /* restore source buffer */ 
    glReadBuffer(GL_BACK); 
}