位置:首頁 > Java技術 > JOGL教學 > JOGL基本模板

JOGL基本模板

本章介紹了編寫JOGL基本模板的概念。

重要的接口和類

為了使程序能夠使用JOGL圖形API,需要實現GLEventListener接口。

GLEventListener接口

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

Interface: GLEventListener

Package: javax.media.opengl

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

Sr. No. 方法和說明
1

Void display(GLAutoDrawable drawable)

這就是所謂GLAutoDrawable接口的對象,由客戶機發起OpenGL渲染。也就是說,該方法包含用於繪製使用OpenGL API的圖形元素的邏輯。

2

Void dispose(GLAutoDrawable drawable)

這種方法的信號監聽執行每各GLContext,所有的OpenGL釋放資源,如內存緩衝區和GLSL程序。

3

Void init(GLAutoDrawble drawble)

這就是所謂GLAutoDrawable接口OpenGL上下文被初始化之後的對象。

4

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

第一重畫過程中它被稱為GLAutoDrawable接口的對象的組件大小後。它也被稱為每當窗口上的部件的位置變化。

GLEventListener所有的方法都需要GLAutoDrawable接口作為參數的對象。

GLAutoDrawable 接口

這個接口提供一個基於事件機製(GLEventListener),用於執行OpenGL渲染。 GLAutoDrawable自動創建一個與GLAutoDrawable為對象的生命周期相關聯的一個主要呈現上下文。

Interface: GLAutoDrawble

Package: javax.media.opengl

Sr. No. 方法和說明
1

GL getGL()

此方法返回所使用的GLAutoDrawable接口的當前對象的GL管道對象。

2

Void addGLEventListener(GLEventListener Listener)

這種方法增加了給定偵聽器到當前繪製隊列的末尾。

3

Void addGLEventListener(int index,GLEventListener listener)

這種方法增加了給定偵聽器這個隊列中繪製的給定索引處。

4

Void destroy()

這種方法會破壞GLAutoDrawable接口名為此對象,包括GLContext相關聯的所有資源。

注:有在這個包的其他方法。隻有很少的關於模板的重要方法是在此界麵中進行討論。

GLCanvas 類

GLCanvas 和 GLJpanel 是JOGL GUI兩大類實現 GLAutoDrawable 接口,這讓他們可以用作拉絲表麵的OpenGL命令。

GLCanvas是一個重量級AWT組件,它提供了OpenGL的渲染支持。這是一AWTAutoGLDrawable接口的主執行。它還是java.awt.Canvas繼承類。因為它是一個重量級的組成部分,在某些情況下,GLJCanvas可能無法與Swing組件正確地結合起來。因此,必須謹慎使用,同時它與Swing共用。每當麵臨GLJCanvas問題,那麼必須使用GLJPanel類。

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

Canvas
  • GLEventistener接口工作以及GLCanvas類,它響應變化GLCanvas類並由它們製成要求的圖紙。

  • 每當GLCanvas的類被實例化,調用GLEventListener的init()方法。可以覆蓋此方法來初始化OpenGL的狀態。

  • 每當GLCanvas的初始繪製(實例化),或調整大小,則執行GLEventListener的reshape()方法。它用來初始化OpenGL的視口和投影矩陣。它也被調用被改變來組件的位置。

  • GLEventListener()方法顯示包含渲染3D場景的代碼。它被調用時調用GLCanvas的display()方法。

class: GLCanvas

package: javax.media.opengl.awt

Contructor

GLCanvas()

它與OpenGL功能的默認設置創建一個新的GLCanvas組成部分,使用默認的OpenGL功能選擇機製,在默認的屏幕設備上。

GLCanvas(GLCapabilitiesImmutable)

它創建了一個新的GLCanvas成分與所請求的一套OpenGL的功能,使用默認的OpenGL功能選擇機製,在默認的屏幕設備上。

Sr. No. 方法及描述
1

Void addGLEventListener(GLEventListener listener)

它增加了給定偵聽器來繪製這個隊列的末尾

2

Void addGLEventListener(int indexGLEventListener listener)

它增加了給定偵聽器這個隊列中繪製的給定索引處。

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

來獲得 CapabilitiesImmutable 接口的對象的一個方式是實例 GLCapabilities 類,它實現接口。 GLCapabilities 類的實例可以用來服務。

GLCapabilities 類

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

class: GLCapabilities

package: javax.media.opengl

Constructor

GLCapabilities(GLProfile glprofile)

創建一個GLCapabilities對象。

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

獲得CapabilitiesImmutable接口的對象的一種方式是實例化GLCapabilities類並實現接口。 GLCapabilities類的實例,可以用來以服務為目的。

GLCapabilities 類

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

class: GLCapabilities

package: javax.media.opengl

Constructor

GLCapabilities(GLProfile glprofile)

GLCapabilities類又需要GLProfile對象。

GLProfile 類

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

class: GLProfile

package: javax.media.opengl

Method and 描述

Static GLProfile get(String profile)

使用默認設備。

因為這是一個靜態方法,需要使用類名來調用它,它需要一個預定義的靜態字符串變量作為參數。有在這12級這樣的變量,分彆代表GL接口的獨立實現。

GLProfile.get(GLProfile.GL2);

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

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

GL2

這種接口包含所有的OpenGL[1.0 ...3.0]的方法,以及它的大多數擴展中定義在本說明書中的時間。

2

GLES1

這種接口包含所有的OpenGL ES[1.0 ...1.1]的方法,以及它的大多數擴展中定義在本說明書中的時間

3

GLES2

這種接口包含所有的OpenGL ES 2.0的方法,以及它的大部分在本說明書中的時間定義的擴展。

4

GLES3

這種接口包含所有的OpenGL ES3.0的方法,以及它的大部分在本說明書中的時間定義的擴展。

5

GL2ES1

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

6

GL2ES2

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

7

GL2GL3

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

8

GL3

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

9

GL3bc

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

10

GL3ES3

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

11

GL4

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

12

GL4bc

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

13

GL4ES3

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

現在一切都被設置在使用JOGL的第一個程序中。

使用畫布與AWT的基本模板

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

JOGL編程的基本模板如下:

步驟1:創建一個類

最初創建一個實現 GlEventListener 接口的類,並導入包 javax.media.opengl。實現所有四種方法 display(), dispose(), reshape(), init()。由於這是基本框架,基本任務,如創建Canvas類,將其添加到框架進行了討論。所有GLEVentListener接口的方法留下未實現。

第二步:準備畫布

(a)構建GLCanvas類和對象

final GLCanvas glcanvas = new GLCanvas( xxxxxxx );

  //here capabilities obj should be passed as parameter

(b) 實例化GLCapabilities類

GLCapabilities capabilities = new GLCapabilities( xxxxx );

   //here profile obj should be passed as parameter

生成GLProfile對象

因為這是靜態方法,它是使用類名調用。由於本教學是關於JOGL2,產生GL2接口對象。

final GLProfile profile = GLProfile.get( GLProfile.GL2 );
// both, variable and method are static hence both are called using class name.

讓我們看到了代碼片段畫布

//getting the capabilities object of GL2 profile					
final GLProfile profile = GLProfile.get(GLProfile.GL2);
GLCapabilities capabilities = new GLCapabilities(profile);
// The canvas 
final GLCanvas glcanvas = new GLCanvas(capabilities);

現在,使用方法addGLEventListener()添加GLEventListener到畫布。此方法需要GLEventListener接口參數的對象。因此,通過實現GLEventListener類的對象。

BasicFrame basicframe=newBasic Frame( );// class which implements
GLEventListener interface
glcanvas.addGLEventListener( basicframe );

使用setSize()方法繼承自javax.media.opengl.awt.AWTGLAutoDrawable GLCanvas框架設置大小。

  glcanvas.setSize( 400, 400 );

現在,還可以用GLCanvas。

第三步:創建框架

通過實例JSE AWT框架組件的Frame類對象創建的框架。

添加畫布,使框架可見。

//creating frame
 final Frame frame = new frame( " Basic Frame" );
  //adding canvas to frame  
 frame.add( glcanvas );
  frame.setVisible( true );   

第4步:在全屏觀看幀

對於幀的全屏視圖,使用java.awt.Toolkit中的類得到默認的屏幕大小。現在,使用這些默認的屏幕大小尺寸,使用setSize()方法設置幀的大小。

 Dimension screenSize = 
 Toolkit.getDefaultToolkit().getScreenSize();
 frame.setSize(screenSize.width, screenSize.height);

讓我們通過在程序使用AWT來生成基本的框架:

import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.swing.JFrame;
public class BasicFrame implements GLEventListener{
   @Override
   public void display(GLAutoDrawable arg0) {
      // method body
   }
   @Override
   public void dispose(GLAutoDrawable arg0) {
      //method body
   }
   @Override
   public void init(GLAutoDrawable arg0) {
      // method body
   }
   @Override
   public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3,int arg4) {
      // method body
   }
   public static void main(String[] args) {
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);
      // The canvas 
      final GLCanvas glcanvas = new GLCanvas(capabilities);
      BasicFrame b = new BasicFrame();
      glcanvas.addGLEventListener(b);
      glcanvas.setSize(400, 400);
      //creating frame
      final JFrame frame = new JFrame (" Basic Frame");
      //adding canvas to frame
      frame.getContentPane().add(glcanvas);
      frame.setSize(frame.getContentPane().getPreferredSize());
      frame.setVisible(true);
   }
}

如果編譯並執行上述程序,將生成以下輸出。它顯示了當我們用GLCanvas類與AWT形成一個基本的框架:

Basic Frame

使用畫布與Swing

使用Canvas與AWT提供了一個圖形化的框架與重量級的功能。對於具有輕量級的圖形框架,同時采用GLCanvas與Swing,可以將GLCanvas會在窗口JFrame直接使用,也可以將其添加到JPanel中。

下麵的程序將生成使用GLCanvas與Swing窗口的基本框架:

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

public class BasicFrame implements GLEventListener{
   @Override
   public void display(GLAutoDrawable arg0) {
      // method body
   }
   @Override
   public void dispose(GLAutoDrawable arg0) {
      //method body
   }
   @Override
   public void init(GLAutoDrawable arg0) {
      // method body
   }
   @Override
   public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, int arg4) {
      // method body
   }
   public static void main(String[] args) {
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);
      // The canvas 
      final GLCanvas glcanvas = new GLCanvas(capabilities);
      BasicFrame b = new BasicFrame();
      glcanvas.addGLEventListener(b);
      glcanvas.setSize(400, 400);
      //creating frame
      final JFrame frame = new JFrame (" Basic Frame");
      //adding canvas to it
      frame.getContentPane().add(glcanvas);
      frame.setSize(frame.getContentPane().getPreferredSize());
      frame.setVisible(true);
   }//end of main
}//end of classimport

如果編譯並執行上述程序,將生成以下輸出。它顯示了當我們用GLCanvas與Swing窗口形成一個基本的框架。

Basic Frame

GLJPanel 類

它是一個輕量級的Swing組件,它提供了OpenGL的渲染支持。它提供了與Swing的兼容性。

GLJPanel類層次結構

GLJPanel

class: GLJPanel

package: javax.media.opengl.awt

Contructors

 GJPanel()

創建一個用 OpenGL 功能的默認設置一個新的GLJPanel組成部分。

 (GLCapabilitiesImmutable)

創建一個具有指定一組OpenGL性能的新 GLJPanel 組件。

 GLJPanel(GLCapabilitiesImmutable userCapsRequest, 
 GLCapabilitiesChooser chooser) 

創建一個新的GLJPanel組件。

方法及描述

Void addGLEventListener(GLEventListener listener)

此方法將給定的偵聽器,以這種繪製隊列的末尾。

Void addGLEventListener(int indexGLEventListener listener)

這種方法繪製該隊列的特定索引處添加指定的偵聽器。

使用GLJPanel與Swing窗口

讓我們來看看生成使用GLJPanel與Swing窗口基本框架方案:

 
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.swing.JFrame;
public class BasicFrame implements GLEventListener{
   @Override
   public void display(GLAutoDrawable arg0) {
      // method body
   }
   @Override
   public void dispose(GLAutoDrawable arg0) {
      //method body
   }
   @Override
   public void init(GLAutoDrawable arg0) {
      // method body
   }
   @Override
   public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3,
      int arg4) {
      // method body
   }
   public static void main(String[] args) {
      //getting the capabilities object of GL2 profile
      final GLProfile profile = GLProfile.get(GLProfile.GL2);
      GLCapabilities capabilities = new GLCapabilities(profile);
      // The canvas 
      final GLCanvas glcanvas = new GLCanvas(capabilities);
      BasicFrame b = new BasicFrame();
      glcanvas.addGLEventListener(b);
      glcanvas.setSize(400, 400);
      //creating frame
      final JFrame frame = new JFrame (" Basic Frame");
      //adding canvas to it
      frame.getContentPane().add(glcanvas);
      frame.setSize(frame.getContentPane().getPreferredSize());
      frame.setVisible(true);
   }//end of main
}//end of classimport

如果編譯並執行上述程序,將生成以下輸出。這表明,當我們使用GLJPanel swing窗口形成一個基本框架:

Basic Frame