본문 바로가기
JAVA

1. Getting started with JOGL

by windrises 2007. 7. 16.
JOGL을 사용해서 간단한 프로그램을 만들어 보겠습니다.

package main;

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLCapabilities;
import javax.swing.JFrame;

public class TestMain {
    public static void main(String[] args) {
        JFrame testFrame = new JFrame("Test");
        testFrame.setSize( 640, 480 );

        GLCapabilities glCaps = new GLCapabilities();
        glCaps.setRedBits(8);
        glCaps.setBlueBits(8);
        glCaps.setGreenBits(8);
        glCaps.setAlphaBits(8);

       
        GLCanvas canvas = new GLCanvas( glCaps );
       
        testFrame.add( canvas );
       
        canvas.addGLEventListener( new TestRenderer() );
        testFrame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
       
        testFrame.setVisible( true );
    }
}
-TestMain.java-

package main;

import javax.media.opengl.DebugGL;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLDrawable;
import javax.media.opengl.GLEventListener;

public class TestRenderer implements GLEventListener
{
   private GL              gl;
   private GLDrawable      glDrawable;

   public void display(GLAutoDrawable drawable) {
       gl.glClear(GL.GL_COLOR_BUFFER_BIT
                           | GL.GL_DEPTH_BUFFER_BIT );
       gl.glLoadIdentity();

       gl.glColor3f(1.0f, 0.0f, 0.0f );

       gl.glBegin( GL.GL_TRIANGLES );
           gl.glVertex3f( 0.0f, 0.0f, 0.0f );
           gl.glVertex3f( 1.0f, 0.0f, 0.0f );
           gl.glVertex3f( 1.0f, 1.0f, 0.0f );
       gl.glEnd();
   }

   public void displayChanged(GLAutoDrawable drawable,
            boolean modeChanged, boolean deviceChanged) {
   }

   public void init(GLAutoDrawable drawable) {
       this.gl = drawable.getGL();
       this.glDrawable = drawable;
       drawable.setGL( new DebugGL(drawable.getGL() ));
       System.out.println("Init GL is " + gl.getClass().getName());
   }
   public void reshape(GLAutoDrawable drawable,
                            int x, int y, int width, int height) {
   }
}

-TestRender.java-


 뭐 특별한건 없어 보이죠?

 결과는 대충 예상하시겠지만 위에 표시된 빨간색 부분 내용처럼 나오게 됩니다.


일단 Hello Wrold ! 아무 생각없이 해봤습니다.
swing으로 창을 만들구 그속에 그림을 넣었다는 것 뿐입니다.
별 다른것은 없었습니다.

이제 처음부터 차근차근 살펴보도록 하겠습니다.

1. JAVA SWING 사용하는 부분입니다.
JFrame testFrame = new JFrame("Test");
testFrame.setSize( 640, 480 );
         JFrame(String title)으로 되어있습니다.
         setSize는 width, height 혹은 Dimension을 사용이 가능합니다.
         ( setSize( new Dimension( 640, 480 ) )

2. Cavas 생성하기

 저번 버전까지는 GLCanvas를 직접생성하는 것을 허용하지 않고 있었습니다.
 팩토리 패턴을 사용해서 받아오도록 되어있었습니다.
 GLCanvas canvas = GLDrawableFactory.getFactory().createGLCanvas( new GLCapabilities() );
그래서 이전 버전에서 코딩된 소스를 보시면 이렇게 되어있는 것들을 볼 수 있습니다.
그렇지만 API Doc를 읽어보시면 직접 생성이 가능하게 바뀌어 있는 것을 확인할 수 있습니다.

GLCapabilities glCaps = new GLCapabilities();
glCaps.setRedBits(8);
glCaps.setBlueBits(8);
glCaps.setGreenBits(8);
glCaps.setAlphaBits(8);

GLCanvas canvas = new GLCanvas( glCaps );
이런 식으로 기본 Capabilities를 세팅한 후 Canvas를 생성합니다.
그리고 특별한 세팅 예를 들어 buffers, bitdepths등을 설정하고 싶으면 이 부분에서 설정을 변경하면 됩니다.

3. Canvas와 JFrame 연결
자 이제 할일은 간단하게 지금 만든 Canvas를 JFrame에 연결 시키는 것입니다.

testFrame.add( canvas );

testFrame.setVisible( true );
testFrame.setVisible( true )는 윈도우를 시작하는 부분입니다.
JAVA 버전이 올라가면서 show를 setVisible로 대체했습니다. 추천하는 방법을 사용하는게 좋을것 같습니다.
(이클립스에서 쓰지말라고 그래서 -_-;;;)

4. Event Listener 달기

canvas.addGLEventListener( new TestRenderer() );
testFrame.addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e) {
      System.exit(0);
   }
});
리스너를 달았습니다. windowClose event가 들어오면 프로그램을 끝내게 만들어주는 것입니다.

5. Renderer 구현

 Renderer는 Interface GLEventListener를 구현해야 됩니다.
 인터페이스의 내용을 살펴보면,

    void     display(GLAutoDrawable drawable)
              Called by the drawable to initiate OpenGL rendering by the client.
    void     displayChanged(GLAutoDrawable drawable,
            boolean modeChanged, boolean deviceChanged)

              Called by the drawable when the display mode or the display device
             associated with the     GLAutoDrawable has changed.
    void     init(GLAutoDrawable drawable)
              Called by the drawable immediately after the OpenGL context is initialized.
    void     reshape(GLAutoDrawable drawable,
           int x, int y, int width, int height)

              Called by the drawable during the first repaint after the component has been resized.

위에 나온 것처럼 4개의 메소드를 구현해야 합니다.
그런데 displayChanged의 경우는 할 필요가 없습니다. 아직 jogl에서 구현을 하지 못했기 때문입니다.
전체 화면에서 창화면 혹은 그 반대의 변화가 아직까지는 구현이 안되어있으니 아쉽기는 합니다만,
금방 구현이 되지 않을까 생각됩니다.

이름만 보시면 어떻게 동작하는 것인지는 쉽게 이해할수 있을것입니다.
WinAPI 로 OpenGL해보신 경험이 있다면 CallBack함수 구현이라고 생각하시면 됩니다.
(리스너 패턴을 사용해서 만들지 않았을까 하는 작은 상상을 해봅니다. ^^;)

init 부분은 OpenGL설정을 위해서 사용됩니다.
NeHe 강좌를 보시면 쉐이딩, 버퍼크기, 등등을 설정하는데 사용되고 있습니다.

위의 소스에는 없지만 사용을 해보시고 싶으시면

        gl.glShadeModel(GL.GL_SMOOTH);              // Enable Smooth Shading
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    // Black Background
이렇게 테스트 해보시면 됩니다.

reshape는 창의 크기가 변했을 때 사용되는 것입니다. 예는 NeHe소스를 가지고 장난쳐 보는
다음 시간에 이야기 하도록하겠습니다.

자 대망의 display부분입니다.
사실 별거 없습니다. 그냥 drawScene라고 생각하시면 됩니다.
매 시간 불리우면서 화면에 뿌려주는 놈입니다. ^-^;

       gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT );
       gl.glLoadIdentity();

       gl.glColor3f(1.0f, 0.0f, 0.0f );

       gl.glBegin( GL.GL_TRIANGLES );
           gl.glVertex3f( 0.0f, 0.0f, 0.0f );
           gl.glVertex3f( 1.0f, 0.0f, 0.0f );
           gl.glVertex3f( 1.0f, 1.0f, 0.0f );
       gl.glEnd();

그냥 넘어가도록하겠습니다.
다음부터 신나게 이야기해야할 것들이기 때문입니다. ^-^;;;

밤도 늦었고 -_-; 회사도 가야하고 하니 여기까지 쿨럭;

내일은 NeHe Lib를 사용해서 만들는 JOGL이 되겠습니다.
NeHe Demo 소스를 받아 보시면 아시겠지만, 많은 부분이 구현되어있어서
렌더러 위주의 구현을 하게 되겠습니다. 그래픽스 기초정도를 생각하시면 되지 않을까 싶습니다. ㅎㅎ
그래픽스 기초에 대한 글을 빨리 끝내고 머리속에 있는 프로젝트들의 일지로 변화되는 그날이 오기를 기대하고있습니다.



사실 프로젝트 일기 느낌으로 적어가고 있어서 곧 반말과 소스 위주의 글로 변질될것같습니다. 핫핫..

오늘은 여기까지~


아...
모든 소스의 저작권은 저에게 없습니다. -_-; 헬로월드가 저작권 없듯이 그냥 헬로 월드 수준의 소스라서 ㅋㅋ

-- from

'JAVA' 카테고리의 다른 글

JME(jmonkeyengine)  (0) 2007.07.16
LWJGL  (0) 2007.07.16
0. Start of JOGL  (0) 2007.07.16
Java3d와 스윙 for layout, 문제와 해결  (0) 2007.07.16
Scene 그래프 갱신  (0) 2007.07.16