2008年3月20日 星期四

JOGL - Java與OpenGl(一)

在這篇文章裡,摘錄了《學習Java對於OpenGL的綁定》。作者Gene Davis解釋了如何開始用Java對於OpenGl的綁定開發圖形增強的程式。

這些年來,為了創建一個圖形增強的程式,從而出售給使用各種不同操作系統的用戶,程式員有一個選擇——OpenGL。GL代表圖形庫(graphics library)。OpenGL是SGI(美國圖形工作站生產廠商)的註冊商標。OpenGL顯示了它是一個跨平台的C語言編程API。但是事實上,在程式介面上,它是一個獨立於硬體的規格。

OpenGL用於繪圖,速度非常快。大多數場合下,它使用硬體加速。似乎OpenGL可以實現一切你想要完成的圖形界面。

不幸的是,OpenGL是為C語言而寫的。不得不承認,C語言不是用來編寫複雜應用程式的流行語言。關於OpenGL一個最大的缺點就是:如果你不創建一個視窗(用來把你的圖形放入其中),你就什麼都做不了。但是OpenGL沒有提供給你創建視窗的方法。這使得OpenGL對於初學者來說顯得比較難。

幸運地是,出現了GLUT (OpenGL Utility Toolkit)(OpenGL工具包)。它被用來輕鬆應對視窗、按鈕以及使用者事件。儘管如此,對於想要使用物件導向的程式員來說,學習用C或者C++來寫OpenGL程式仍然是一件痛苦的事。


然後出現了JOGL

Java 也許是最流行的真正物件導向程式語言。有許多用Java去結合OpenGL的嘗試,但是第一個被大家認可並注意的OpenGL的Java綁定 (Java Bindings for OpenGL), 或者稱為JOGL。因為它得到Sun(Java的創建者)和SGI(OpenGL的創建者)的支持。

如今,Sun的遊戲開發小組正在開發JOGL。它以肯·拉塞爾和克里斯·克蘭開發的Jungle開始。拉塞爾是Sun的員工,研發「HotSpot虛擬機器」,擁有多年的3D經驗。克蘭則研發「荒謬的遊戲」,對3D圖學也相當有經驗。

我個人對他們以及所有其它在JOGL上工作的人表示感謝。曾經有許多人嘗試通過友好的Java API來使用OpenGL——其中包括Java 3D, OpenGL for Java Technology (gl4java)(給Java技術的OpenGL),Lightweight Java Game Library (LWJGL)(輕量級的Java遊戲庫)。JOGL第一個使我感到滿意。

JOGL是由Sun支持的、OpenGL的Java class綁定。哇!這句話說得太妙了。

OpenGL 被用來展示3D模型。它強大、快速,而且可能是自Swing出現以來最棒的一樣東西。通過JOGL來使用OpenGL,你可以製作出很酷的遊戲或是模型位置什麼的,而在這之前創建它們需要非常昂貴的成本。有人寫了很厚很厚的書來描述OpenGL,當你熟悉了它們以後這些書會很有用,但現在不行。你必須學習 展現在你面前的OpenGL是如何使用Java API的。同樣你還得看一下關於javax.media.opengl的基礎介紹,可能還得複習一下數學知識。



獲取JOGL?

如果你想使用JOGL,你需要jogl.jar以及附帶的Native code。我希望有一天它可以成為Java的標準,但現在它只是一個夢想。

第一步要找到你的作業系統對應的壓縮檔,並進行解壓縮。我是在https://jogl.dev.java.net/上找到的。不同的作業系統有所區別,但需要安裝2個部分。系統的環境變數classpath裡 一定要有jogl.jargluegen-rt.jar。我們的第一個sample code特別用來測試環境是否安裝正確,所以對於測試安裝你不必緊張。
(按:這裡已經修改為2008新版JOGL安裝方法)


JOGL的Javadocs

同樣可以在和JOGL的發佈位置獲得Javadocs。Javadocs會命名成類似jogl-1.0-usrdoc.tar的名字。

如果你瀏覽一下Package:javax.media.opengl,你很快會注意到有些class非常大。GL便是一個顯著的例子。別被嚇跑了,你很快會發現只需一點點JOGL的知識,就可以完成一些相當複雜的事了。現在你需要掃視一下的class有:
*GLDrawable
*GLCanvas
*GLJPanel
*GLCapabilities
*GLDrawableFactory

這些是進入圖形世界基本介面。如果你還記得,前面我提到初學OpenGL的人有一個大麻煩,那就是缺乏標準的視窗系統。對於C語言,GLUT起了相當大作用。而我們則有Swing和AWT。很可能你已經用過AWT或者Swing了,所以你不會覺得自己從頭學起。這非常好。在很短的介紹,關於把JOGL組件放到屏幕上以後,我們不需要多長時間就可以跑一個相當酷而且流行的程式了。


GlueGen...幾乎和JOGL一樣酷?

你應該意識到,OpenGL是為了C程式員而寫的。這意味著 Java 要利用它,必須要用到本機介面。用不怎麼有趣的 JNI (Java本機介面) 進行連接。然而 OpenGL太大了,手寫所有的連接太費時。想稍微做出一點複雜的程式,有許多特別的特性,OpenGL則保持改進,那意味著得有相應的變化來 跟上OpenGL的步伐。簡而言之,對於任何試著寫與OpenGL保持同步,包含所有Java到本機介面的程式碼的嘗試,非常困難。

讓我們進入JOGL家族看看。他們打算利用C頭文件寫一些程式碼來實現一切 JNI 做的事。他們管這個叫做 GlueGen。GlueGen解析C頭文件然後魔法般地創建出Java和JNI代碼以便連接到本機函數庫。這意味著OpenGL的升級可以迅速地在JOGL裡體現。