2012-05-11 2 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

나는 이클립스와 관련이 없다는 오류를 발견했다 : 캔버스가 크기가 조정될 때마다 뷰포트 (glViewport에 대한 호출)를 설정해야합니다. => 그래서 glViewport (x, y, widht, 높이)를 GLEventListener의 reshape() 메서드에서 반환합니다. 따라서 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){} 
} 

감사합니다 :)

편집 : 사과하겠습니다. 편집을 통해 자신의 질문에 자신이 답장하는 것을 보지 못했습니다. 어쨌든, 나는 여전히 당신이 reshape() 메소드에서 glViewport를 호출하는 것이 더 좋다고 생각한다.

관련 문제