2012-05-11 1 views
1

В настоящее время я экспериментирую с JOGL, и у меня возникла проблема, которая для меня совершенно новая. После запуска программы я вижу пустое окно. После изменения размера я обычно вижу его содержимое, или я делаю минимизацию/восстановление. Я полагаю, что есть что-то с событиями. init() не вызывается после создания окна, но после первого триггера с изменением размера или сведением к минимуму.JFrame + JOGL отображает контент только при изменении размера или сведении к минимуму + максимальный

Вот код, что я использую для создания окна и настройки OpenGL:

package com.cogwheel.framework.graphics; 

import java.awt.BorderLayout; 

import javax.media.opengl.GL; 
import javax.media.opengl.GL2; 
import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLCapabilities; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.awt.*; 
import javax.swing.JFrame; 

import com.cogwheel.framework.init.CWGPreferences; 
import com.cogwheel.framework.util.CWGDebug; 
import com.jogamp.opengl.util.Animator; 

public class CWGOpenGLScreen extends JFrame implements GLEventListener { 
private static final String TAG = "CWGOpenGLScreen"; 

private GLCanvas mCanvas; 
private long fpsLast = System.currentTimeMillis(); 

public CWGOpenGLScreen(){ 
    this.setTitle(CWGPreferences.WINDOW_NAME); 
    this.setSize(CWGPreferences.WINDOW_SIZE); 
    this.setLayout(new BorderLayout()); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    ///this.setResizable(false); 
    this.setVisible(true); 

    CWGDebug.info(TAG, "Window created!"); 

    CWGSetupGL(); 
} 
private void CWGSetupGL(){ 
    GLCapabilities mCaps = new GLCapabilities(null); 
    mCaps.setHardwareAccelerated(true); 
    mCaps.setDoubleBuffered(true); 

    mCanvas = new GLCanvas(mCaps); 
    mCanvas.addGLEventListener(this); 

    this.add(mCanvas, BorderLayout.CENTER); 

    Animator animator = new Animator(mCanvas); 
    animator.start(); 
} 

public void CWGDrawScene(GLAutoDrawable drawable) 
{ 
    CWGCalculateFPS(); 

    GL2 gl = drawable.getGL().getGL2(); 
    gl.glClear(GL.GL_COLOR_BUFFER_BIT); 
    gl.glLoadIdentity(); 


    gl.glBegin(GL.GL_TRIANGLES); 
     gl.glColor3f(1.0f, 0.0f, 0.0f); 
     gl.glVertex3f(1.0f/5 , 0.0f, 0.0f); 

     gl.glColor3f(0.0f, 1.0f, 0.0f); 
     gl.glVertex3f(1.0f/5, 1.0f/5, 0.0f); 

     gl.glColor3f(0.0f, 0.0f, 1.0f); 
     gl.glVertex3f(0.0f, 1.0f/5, 1.0f/5); 
    gl.glEnd(); 
    gl.glFlush(); 
} 

public void CWGCalculateFPS(){ 
    this.setTitle(CWGPreferences.WINDOW_NAME + " [" + 1000/(System.currentTimeMillis() - fpsLast) + "]"); 
    fpsLast = System.currentTimeMillis(); 
} 

public void init(GLAutoDrawable drawable){ 
     /*GL2 gl = drawable.getGL().getGL2(); 

     gl.glClearColor(0, 0, 0, 0); 
     gl.glMatrixMode(GL2.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glOrtho(0, 1, 0, 1, -1, 1); 
     */ 
     CWGDebug.info(TAG, "Init called!"); 
} 
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height){} 
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged){} 
public void display(GLAutoDrawable drawable){ CWGDrawScene(drawable); } 
public void dispose(GLAutoDrawable drawable){} 

}

качество кода беден, я знаю, не было времени на уборку еще. Извините за это.

Редактировать: возникла проблема, JFrame не должен отображаться до тех пор, пока GLEventListener не будет инициализирован.

ответ

0

Я нашел вашу ошибку (она не имеет отношения к eclipse): вы должны настроить окно просмотра (вызов glViewport) всякий раз, когда размер холста изменяется =>, поэтому вы вызываете glViewport (x, y, widht, height) в методе reshape() GLEventListener. Так что OpenGL всегда знает, где рисовать сцену, а не только при изменении размера рамки.

Кроме того, не забудьте установить экран (вызов CWGSetupGL()) , прежде чем показывать его (в противном случае у вас все еще будет такая же проблема, но только на некоторое время).

Вот измененный код (я удалил звонки в CWGDebug.info, как вы не предоставили этот класс, но вы можете поместить их обратно):

package com.cogwheel.framework.graphics; 

import java.awt.BorderLayout; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.media.opengl.GL; 
import javax.media.opengl.GL2; 
import javax.media.opengl.GLAutoDrawable; 
import javax.media.opengl.GLCapabilities; 
import javax.media.opengl.GLEventListener; 
import javax.media.opengl.awt.GLCanvas; 
import javax.swing.JFrame; 

import com.jogamp.opengl.util.Animator; 

public class CWGOpenGLScreen extends JFrame implements GLEventListener { 

    public static void main(String[] args) { 
     new CWGOpenGLScreen().setVisible(true); 
    } 

private static final long serialVersionUID = 635066680731362587L; 

private static final String TAG = "CWGOpenGLScreen"; 

private GLCanvas mCanvas; 
private long fpsLast = System.currentTimeMillis(); 

public CWGOpenGLScreen(){ 
    this.setTitle(TAG); 
    this.setSize(640,480); 
    this.setLayout(new BorderLayout()); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    ///this.setResizable(false); 

    CWGSetupGL(); 
    this.setVisible(true); 

// CWGDebug.info(TAG, "Window created!"); 
} 
private void CWGSetupGL(){ 
    GLCapabilities mCaps = new GLCapabilities(null); 
    mCaps.setHardwareAccelerated(true); 
    mCaps.setDoubleBuffered(true); 

    mCanvas = new GLCanvas(mCaps); 
    mCanvas.addGLEventListener(this); 

    this.add(mCanvas, BorderLayout.CENTER); 

    final Animator animator = new Animator(mCanvas); 
    animator.start(); 

    addWindowListener(new WindowAdapter() { 

     @Override 
     public void windowClosing(WindowEvent e) { 
      animator.stop(); 
      System.exit(0); 
     } 



    }); 
} 

public void CWGDrawScene(GLAutoDrawable drawable) 
{ 
    CWGCalculateFPS(); 

    GL2 gl = drawable.getGL().getGL2(); 
    gl.glClear(GL.GL_COLOR_BUFFER_BIT); 
    gl.glLoadIdentity(); 


    gl.glBegin(GL.GL_TRIANGLES); 
     gl.glColor3f(1.0f, 0.0f, 0.0f); 
     gl.glVertex3f(1.0f/5 , 0.0f, 0.0f); 

     gl.glColor3f(0.0f, 1.0f, 0.0f); 
     gl.glVertex3f(1.0f/5, 1.0f/5, 0.0f); 

     gl.glColor3f(0.0f, 0.0f, 1.0f); 
     gl.glVertex3f(0.0f, 1.0f/5, 1.0f/5); 
    gl.glEnd(); 
    gl.glFlush(); 
} 

public void CWGCalculateFPS(){ 
    this.setTitle(TAG + " [" + 1000/(System.currentTimeMillis() - fpsLast) + "]"); 
    fpsLast = System.currentTimeMillis(); 
} 

public void init(GLAutoDrawable drawable){ 
     /*GL2 gl = drawable.getGL().getGL2(); 

     gl.glClearColor(0, 0, 0, 0); 
     gl.glMatrixMode(GL2.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glOrtho(0, 1, 0, 1, -1, 1); 
     */ 
//  CWGDebug.info(TAG, "Init called!"); 
} 
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height){ 
    GL2 gl = drawable.getGL().getGL2(); 
    gl.glViewport(x, y, width, height); 
} 
//public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged){} 
public void display(GLAutoDrawable drawable){ CWGDrawScene(drawable); } 
public void dispose(GLAutoDrawable drawable){} 
} 

Привет :)

Edit: извиняется, я не видел, чтобы вы ответили на свой вопрос, отредактировав. В любом случае, я все же думаю, что лучше вызвать glViewport в режиме reshape().

 Смежные вопросы

  • Нет связанных вопросов^_^