jogl入門

openkk 12年前發布 | 5K 次閱讀

1、jogl是什么?

jogl是Java OpenGL的簡稱,想真正的了解它,就需要了解OpenGL,OpenGL是Open Graphics Library,它是個定義了一個跨編程語言、跨平臺的編程接口的規格,它用于三維圖象(二維的亦可)。OpenGL是個專業的圖形程序接口,是一個功能 強大,調用方便的底層圖形庫,請參考http://baike.baidu.com/view/9222.htm,他其實是一個命令的的集合,300多 條,算不上編程語言,他最難的在于計算機圖形學的知識,而jogl是用java通過jni調用,對openGL的一個封裝,所以速度上并不比c慢多少,并 且加上java特有的面向對象的特性,來開發游戲比直接用c有過之而無不及!

2、jogl的安裝配置;

下載地址:如果去官方下載,就直接在他的svn中checkout下來,去里面的項目找, http://jogl .dev.java.net,

 為了方便我直接上傳了一份;

eclipse下配置:jar包放在build-path下,dll文件,可以在項目下建立個native文件夾,把jogl.jar的NativeLibraryLocation位置選中native就行了

3、驗證配置,可以用下面代碼

public class Validate {

    public static void main(String[] args) {
        try {
            System.loadLibrary("jogl");
            System.out.println("正確配置");
        } catch (Exception e) {
            System.out.println("沒有正確配置:" + e.getMessage());
        }

    }

}
沒有正確配置的話會有下面異常
Exception in thread "main" java.lang.UnsatisfiedLinkError: no jogl in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1709)
    at java.lang.Runtime.loadLibrary0(Runtime.java:823)
    at java.lang.System.loadLibrary(System.java:1030)
    at org.ligson.jogl.test.Validate.main(Validate.java:7)

 4、OpenGL開發前需要知道的

OpenGL為了兼容各種環境,沒有實現窗口,但是他畫圖又必須在窗口下畫,在C庫中依賴于glut,在Java中就依賴于swing了,所以第一步應該建立一個窗口extends JFrame,

5、先看一個Hello,World!

package org.ligson.jogl.test;

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

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

public class Pointer extends JFrame implements GLEventListener, Runnable {

    // gl庫的handler,相當于畫筆
    GL gl;
    // 畫布,跟html5的Canvas一樣,
    GLCanvas canvas;
    // 指定了一套OpenGL的功能:渲染內容必須支持,如色彩深度,以及立體是否已啟用。
    GLCapabilities capabilities;

    Thread thread = new Thread(this);


    public Pointer() {
        super("Demo4");
        this.setSize(500, 500);
        this.setLocationRelativeTo(null);

        capabilities = new GLCapabilities();
        canvas = new GLCanvas(capabilities);

        canvas.addGLEventListener(this);

        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        this.add(canvas, BorderLayout.CENTER);

        thread.start();
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            canvas.display();
        }
    }

    @Override
    public void display(GLAutoDrawable drawable) {
        gl.glClear(GL.GL_COLOR_BUFFER_BIT);
        gl.glColor3f(1.0f, 0.0f, 0.0f);

        gl.glPointSize(10.0f);
        gl.glBegin(GL.GL_POINTS);
            gl.glVertex3f(50.0f, 50.0f, 50.0f);
        gl.glEnd();
        gl.glFlush();
    }

    @Override
    public void displayChanged(GLAutoDrawable drawable, boolean arg1,
            boolean arg2) {

    }

    @Override
    public void init(GLAutoDrawable drawable) {
        gl = drawable.getGL();
        gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
    }

    @Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
        if (h == 0) {
            h = 1;
        }

        int windowWidth;
        int windowHeight;

        gl.glViewport(0, 0, w, h);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();

        if (w <= h) {
            windowWidth = 250;
            windowHeight = 250 * h / w;
        } else {
            windowWidth = 250 * w / h;
            windowHeight = 250;
        }
        gl.glOrtho(0 - windowWidth, windowWidth, 0 - windowHeight,
                windowHeight, 250.0f, -250.0f);
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();

    }

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

}
6、上面的hello,world嚇住你了嗎?太長了吧,我剛開始跟你一樣!先說上面是干嘛的?他其實就是先空間畫一個10.0f像素的點(glPonitSize(10.0f));了解幾個函數
public void init(GLAutoDrawable drawable) {
初始化時調用,給GL 賦值
@Override
    public void display(GLAutoDrawable drawable) {
每次顯示時都會調用的,他一般在一個線程里,不停的畫,因為他只顯示一次,當屏幕進行刷新時就沒有了,
@Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
當窗口大小進行改變時調用,初次顯示也算,
@Override
    public void displayChanged(GLAutoDrawable drawable, boolean arg1,
            boolean arg2) {

顯示改變時調用,,具體的不知道,我也沒有用過

7、后續。。。。。。

    <ul><li><a href="/misc/goto?guid=5033827848810612821" target="_blank">jogl.zip</a> (1 MB)</li>

  • 描述: jogl常用jar包和dll庫
  • </ul>

    轉自:http://ligson.iteye.com/blog/1331528

     本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!