Изменение размера GLJPanel с помощью JOGL приводит к исчезновению моей модели - PullRequest
4 голосов
/ 06 марта 2010

Я переключился на использование GLJPanel из GLCanvas, чтобы избежать некоторых мерцающих проблем, однако это привело к нескольким непредвиденным последствиям.

Из того, что я до сих пор выяснил, GLJPanel вызывает GLEventListener.init() каждый раз, когда он изменяет свой размер, который либо сбрасывает различные функции openGL, которые я включил в init () (тест глубины, освещение и т. д.), если мне повезет, либо полностью стирает мою модель, если я не везу.

Я пытался отладить его, но не могу исправить это поведение.Это моя функция 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

Есть ли способ обойти это, кроме удаления всего из init (), добавления его в мою функцию display ()?Учитывая поведение init () и reshape () для GLJPanel, я не уверен, что это тоже исправит.

Ответы [ 2 ]

3 голосов
/ 08 июня 2010

От gljpanel doc :

Обратите внимание, что поскольку этот компонент пытается использовать pbuffers для рендеринга и поскольку pbuffers не могут быть изменены, может произойти несколько неожиданное поведение во время операций изменения размера; метод GLEventListener.init (net.java.games.jogl.GLDrawable) может вызываться несколько раз, так как размер pbuffer изменяется, чтобы покрывать размер GLJPanel. Это правильное поведение, , так как текстуры и списки отображения для GLJPanel будут потеряны во время операции изменения размера . Приложение должно попытаться сделать свои методы GLEventListener.init () максимально без побочных эффектов.

Да, Это отстой . Потому что вам нужно хранить ваши данные вершин и другие данные в маленькой памяти JVM. На самом деле я ищу, почему они не используют один и тот же контекст.

3 голосов
/ 06 марта 2010

GLJPanel и CLCanvas практически идентичны по своим функциям в том, что касается JOGL. Единственное отличие состоит в том, что GLJPanel является JComponent и легковесным, тогда как GLCanvas является Компонентом и тяжеловесом. Вполне вероятно, что любые проблемы, с которыми вы сталкиваетесь, не связаны с этими различиями (хотя JOGL не является самой стабильной частью Java и может иметь место «недокументированное» отличие).

Исчезающая модель, вероятно, связана с тем, что на самом деле не вызывается код отрисовки или что-то неправильно установлено в инициализации GL (очень легко сделать). Я бы порекомендовал перенести все в функцию display (). Если это исправляет, это перемещает вещи назад по одному (это только проблема производительности).

Сказав, что я не вижу, чтобы вы устанавливали размер области просмотра в init (). Это одна из вещей, которую необходимо выполнять каждый раз, когда изменяется размер окна.

...