鍍金池/ 教程/ Java/ JOGL基本模板
JOGL 3D圖形
JOGL基本模板
JOGL轉(zhuǎn)化對(duì)象
JOGL安裝
JOGL教程
JOGL圖形形狀

JOGL基本模板

本章介紹了編寫(xiě)JOGL基本模板的概念。

重要的接口和類

為了使程序能夠使用JOGL圖形API,需要實(shí)現(xiàn)GLEventListener接口。

GLEventListener接口

可以在javax.media.opengl包找到GLEventListener接口。

Interface: GLEventListener

Package: javax.media.opengl

下表給出了各種方法和GLEventListener接口的詳細(xì)描述:

Sr. No. 方法和說(shuō)明
1

Void display(GLAutoDrawable drawable)

這就是所謂GLAutoDrawable接口的對(duì)象,由客戶機(jī)發(fā)起OpenGL渲染。也就是說(shuō),該方法包含用于繪制使用OpenGL API的圖形元素的邏輯。

2

Void dispose(GLAutoDrawable drawable)

這種方法的信號(hào)監(jiān)聽(tīng)執(zhí)行每各GLContext,所有的OpenGL釋放資源,如內(nèi)存緩沖區(qū)和GLSL程序。

3

Void init(GLAutoDrawble drawble)

這就是所謂GLAutoDrawable接口OpenGL上下文被初始化之后的對(duì)象。

4

Void reshape(GLAutoDrawble drawble,in tx,int y,int width ,int height)

第一重畫(huà)過(guò)程中它被稱為GLAutoDrawable接口的對(duì)象的組件大小后。它也被稱為每當(dāng)窗口上的部件的位置變化。

GLEventListener所有的方法都需要GLAutoDrawable接口作為參數(shù)的對(duì)象。

GLAutoDrawable 接口

這個(gè)接口提供一個(gè)基于事件機(jī)制(GLEventListener),用于執(zhí)行OpenGL渲染。 GLAutoDrawable自動(dòng)創(chuàng)建一個(gè)與GLAutoDrawable為對(duì)象的生命周期相關(guān)聯(lián)的一個(gè)主要呈現(xiàn)上下文。

Interface: GLAutoDrawble

Package: javax.media.opengl

Sr. No. 方法和說(shuō)明
1

GL getGL()

此方法返回所使用的GLAutoDrawable接口的當(dāng)前對(duì)象的GL管道對(duì)象。

2

Void addGLEventListener(GLEventListener Listener)

這種方法增加了給定偵聽(tīng)器到當(dāng)前繪制隊(duì)列的末尾。

3

Void addGLEventListener(int index,GLEventListener listener)

這種方法增加了給定偵聽(tīng)器這個(gè)隊(duì)列中繪制的給定索引處。

4

Void destroy()

這種方法會(huì)破壞GLAutoDrawable接口名為此對(duì)象,包括GLContext相關(guān)聯(lián)的所有資源。

注:有在這個(gè)包的其他方法。只有很少的關(guān)于模板的重要方法是在此界面中進(jìn)行討論。

GLCanvas 類

GLCanvas 和 GLJpanel 是JOGL GUI兩大類實(shí)現(xiàn) GLAutoDrawable 接口,這讓他們可以用作拉絲表面的OpenGL命令。

GLCanvas是一個(gè)重量級(jí)AWT組件,它提供了OpenGL的渲染支持。這是一AWTAutoGLDrawable接口的主執(zhí)行。它還是java.awt.Canvas繼承類。因?yàn)樗且粋€(gè)重量級(jí)的組成部分,在某些情況下,GLJCanvas可能無(wú)法與Swing組件正確地結(jié)合起來(lái)。因此,必須謹(jǐn)慎使用,同時(shí)它與Swing共用。每當(dāng)面臨GLJCanvas問(wèn)題,那么必須使用GLJPanel類。

GLCanvas類的分層圖可以如下所示:

Canvas
  • GLEventistener接口工作以及GLCanvas類,它響應(yīng)變化GLCanvas類并由它們制成要求的圖紙。

  • 每當(dāng)GLCanvas的類被實(shí)例化,調(diào)用GLEventListener的init()方法??梢愿采w此方法來(lái)初始化OpenGL的狀態(tài)。

  • 每當(dāng)GLCanvas的初始繪制(實(shí)例化),或調(diào)整大小,則執(zhí)行GLEventListener的reshape()方法。它用來(lái)初始化OpenGL的視口和投影矩陣。它也被調(diào)用被改變來(lái)組件的位置。

  • GLEventListener()方法顯示包含渲染3D場(chǎng)景的代碼。它被調(diào)用時(shí)調(diào)用GLCanvas的display()方法。

class: GLCanvas

package: javax.media.opengl.awt

Contructor

GLCanvas()

它與OpenGL功能的默認(rèn)設(shè)置創(chuàng)建一個(gè)新的GLCanvas組成部分,使用默認(rèn)的OpenGL功能選擇機(jī)制,在默認(rèn)的屏幕設(shè)備上。

GLCanvas(GLCapabilitiesImmutable)

它創(chuàng)建了一個(gè)新的GLCanvas成分與所請(qǐng)求的一套OpenGL的功能,使用默認(rèn)的OpenGL功能選擇機(jī)制,在默認(rèn)的屏幕設(shè)備上。

Sr. No. 方法及描述
1

Void addGLEventListener(GLEventListener listener)

它增加了給定偵聽(tīng)器來(lái)繪制這個(gè)隊(duì)列的末尾

2

Void addGLEventListener(int indexGLEventListener listener)

它增加了給定偵聽(tīng)器這個(gè)隊(duì)列中繪制的給定索引處。

要實(shí)例化GLCanvas類,需要GLCapabilitiesImmutable接口,它指定一個(gè)不可變的集合的OpenGL性能的目的。

來(lái)獲得 CapabilitiesImmutable 接口的對(duì)象的一個(gè)方式是實(shí)例 GLCapabilities 類,它實(shí)現(xiàn)接口。 GLCapabilities 類的實(shí)例可以用來(lái)服務(wù)。

GLCapabilities 類

此類指定一組的OpenGL性能。它需要GLCapabilities對(duì)象作為參數(shù)。該GLCapabilities類描述渲染上下文必須支持所期望的功能,例如OpenGL的輪廓。

class: GLCapabilities

package: javax.media.opengl

Constructor

GLCapabilities(GLProfile glprofile)

創(chuàng)建一個(gè)GLCapabilities對(duì)象。

要實(shí)例化GLCanvas類,需要GLCapabilitiesImmutable接口,它指定一個(gè)不可變的集合的OpenGL性能的目的。

獲得CapabilitiesImmutable接口的對(duì)象的一種方式是實(shí)例化GLCapabilities類并實(shí)現(xiàn)接口。 GLCapabilities類的實(shí)例,可以用來(lái)以服務(wù)為目的。

GLCapabilities 類

此類指定一組OpenGL性能。它需要GLCapabilities對(duì)象作為參數(shù)。GLCapabilities類描述渲染上下文必須支持所期望的功能,例如OpenGL的輪廓。

class: GLCapabilities

package: javax.media.opengl

Constructor

GLCapabilities(GLProfile glprofile)

GLCapabilities類又需要GLProfile對(duì)象。

GLProfile 類

由于幾個(gè)版本的OpenGL API發(fā)布,需要指定OpenGL的API確切版本被用在你的程序到Java虛擬機(jī)(JVM)。這是通過(guò)使用GLProfile類。這個(gè)類的get()方法接受不同的預(yù)定義的String對(duì)象作為參數(shù)。每一個(gè)String對(duì)象是一個(gè)接口的名稱,每個(gè)接口支持OpenGL的某些版本。如果初始化這個(gè)類的靜態(tài)和單例,這個(gè)類提供了每個(gè)可用JOGL單例GLProfile對(duì)象。

class: GLProfile

package: javax.media.opengl

Method and 描述

Static GLProfile get(String profile)

使用默認(rèn)設(shè)備。

因?yàn)檫@是一個(gè)靜態(tài)方法,需要使用類名來(lái)調(diào)用它,它需要一個(gè)預(yù)定義的靜態(tài)字符串變量作為參數(shù)。有在這12級(jí)這樣的變量,分別代表GL接口的獨(dú)立實(shí)現(xiàn)。

GLProfile.get(GLProfile.GL2);

下表顯示GLProfile類的get()方法的字符串參數(shù):

Sr. No. 預(yù)定義的字符串值(接口名稱)和描述
1

GL2

這種接口包含所有的OpenGL[1.0 ...3.0]的方法,以及它的大多數(shù)擴(kuò)展中定義在本說(shuō)明書(shū)中的時(shí)間。

2

GLES1

這種接口包含所有的OpenGL ES[1.0 ...1.1]的方法,以及它的大多數(shù)擴(kuò)展中定義在本說(shuō)明書(shū)中的時(shí)間

3

GLES2

這種接口包含所有的OpenGL ES 2.0的方法,以及它的大部分在本說(shuō)明書(shū)中的時(shí)間定義的擴(kuò)展。

4

GLES3

這種接口包含所有的OpenGL ES3.0的方法,以及它的大部分在本說(shuō)明書(shū)中的時(shí)間定義的擴(kuò)展。

5

GL2ES1

此接口包含GL2和GLES1的公共子集。

6

GL2ES2

此接口包含GL3,GL2和GLES2的公共子集。

7

GL2GL3

此接口包含核心GL3(OpenGL的3.1+)和GL2的公共子集。

8

GL3

這種接口包含所有的OpenGL[3.1...3.3]核心方法,以及它的大部分在本說(shuō)明書(shū)中的時(shí)間定義的擴(kuò)展。

9

GL3bc

這種接口包含所有的OpenGL[3.1...3.3]的相容性的方法,以及它的大部分在本說(shuō)明書(shū)中的時(shí)間定義的擴(kuò)展。

10

GL3ES3

接口含有核心GL3(OpenGL的3.1+)和GLES3(OpenGL ES3.0)的公共子集。

11

GL4

這種接口包含所有的OpenGL[4.0...4.3]核心方法,以及它的大部分在本說(shuō)明書(shū)中的時(shí)間定義的擴(kuò)展。

12

GL4bc

這種接口包含所有的OpenGL[4.0...4.3]相容性分布,以及它的大部分在本說(shuō)明書(shū)中的時(shí)間定義的擴(kuò)展。

13

GL4ES3

接口含有核心GL4(OpenGL的4.0+)和GLES3(OpenGL ES3.0)的公共子集。

現(xiàn)在一切都被設(shè)置在使用JOGL的第一個(gè)程序中。

使用畫(huà)布與AWT的基本模板

使用JOGL的編程,可以繪制各種圖形形狀,例如直線,三角形,三維形狀,包括特殊效果,如旋轉(zhuǎn),照明,色彩等。

JOGL編程的基本模板如下:

步驟1:創(chuàng)建一個(gè)類

最初創(chuàng)建一個(gè)實(shí)現(xiàn) GlEventListener 接口的類,并導(dǎo)入包 javax.media.opengl。實(shí)現(xiàn)所有四種方法 display(), dispose(), reshape(), init()。由于這是基本框架,基本任務(wù),如創(chuàng)建Canvas類,將其添加到框架進(jìn)行了討論。所有GLEVentListener接口的方法留下未實(shí)現(xiàn)。

第二步:準(zhǔn)備畫(huà)布

(a)構(gòu)建GLCanvas類和對(duì)象

final GLCanvas glcanvas = new GLCanvas( xxxxxxx );

  //here capabilities obj should be passed as parameter

(b) 實(shí)例化GLCapabilities類

GLCapabilities capabilities = new GLCapabilities( xxxxx );

   //here profile obj should be passed as parameter

生成GLProfile對(duì)象

因?yàn)檫@是靜態(tài)方法,它是使用類名調(diào)用。由于本教程是關(guān)于JOGL2,產(chǎn)生GL2接口對(duì)象。

final