JOGL - 基本模板的 API

使用 JOGL 编程,可以绘制各种图形形状,如直线、三角形、3D 形状,包括特殊效果,如旋转、照明、颜色等。要在 JOGL 中绘制对象,首先我们必须构建一个基本的 JOGL 框架。下面给出了构建基本框架所需的类。

GLEventListener 接口

要使您的程序能够使用 JOGL 图形 API,您需要实现 GLEventListener 接口。您可以在 javax.media.opengl 包中找到 GLEventListener 接口。

下表提供了 GLEventListener 接口的各种方法和说明的详细信息 −

Sr.No. 方法和说明
1

Void display(GLAutoDrawable drawable)

它由 GLAutoDrawable 接口的对象调用,以由客户端启动 OpenGL 渲染。即该方法包含使用 OpenGL API 绘制图形元素的逻辑。

2

Void dispose(GLAutoDrawable drawable)

该方法向侦听器发出信号,要求其释放每个 GLContext 中的所有 OpenGL 资源,例如内存缓冲区和 GLSL 程序。

3

Void init(GLAutoDrawble drawable)

在 OpenGL 上下文初始化后,GLAutoDrawable 接口的对象会立即调用该方法。

4

Void reshape(GLAutoDrawble drawble, int x, int y, int width, int height)

组件调整大小后,第一次重新绘制时,GLAutoDrawable 接口的对象会调用此方法。每当组件在窗口上的位置发生变化时,也会调用此方法。

GLEventListener 的所有方法都需要 GLAutoDrawable 接口的对象作为参数。

GLAutoDrawable 接口

此接口提供基于事件的机制 (GLEventListener),用于执行 OpenGL 渲染。 GLAutoDrawable 自动创建一个主渲染上下文,该上下文在对象的生命周期内与 GLAutoDrawable 相关联。

下表提供了 GLAutoDrawable 接口的各种方法和说明的详细信息 −

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 类

GLCanvasGLJpanel 是 JOGL GUI 的两个主要类,它们实现了 GLAutoDrawable 接口,可用作 OpenGL 命令的绘图表面。

GLCanvas 是一个重量级的 AWT 组件,它提供 OpenGL 渲染支持。这是 AWTAutoGLDrawable 接口的主要实现。它还继承了 java.awt.Canvas 类。由于它是一个重量级组件,在某些情况下,GLJCanvas 可能无法与 swing 组件正确集成。因此,在与 Swing 一起使用时必须小心。每当您在使用 GLJCanvas 时遇到问题时,您都必须使用 GLJPanel 类。

GLCanvas 的层次结构图如下所示 −

Canvas
  • GLEventistener 接口与 GLCanvas 类一起工作。它响应 GLCanvas 类中的更改以及它们发出的绘制请求。

  • 每当实例化 GLCanvas 类时,就会调用 GLEventListenerinit() 方法。您可以重写此方法来初始化 OpenGL 状态。

  • 每当首次绘制(实例化)或调整 GLCanvas 大小时,都会执行 GLEventListenerreshape() 方法。它用于初始化 OpenGL 视口和投影矩阵。每当组件的位置发生变化时,也会调用该方法。

  • GLEventListener 的 display() 方法包含用于渲染 3D 场景的代码。每当调用 GLCanvas 的 display() 方法时,都会调用它。

下面给出了实例化 GLCanvas 类所需的构造函数。

Sr.No 构造函数和说明
1

GLCanvas()

它在默认屏幕设备上使用默认的 OpenGL 功能选择机制,创建一个具有一组默认 OpenGL 功能的新 GLCanvas 组件。

2

GLCanvas(GLCapabilitiesImmutable)

它创建一个新的 GLCanvas 组件使用默认屏幕设备上的默认 OpenGL 功能选择机制,使用请求的 OpenGL 功能集。

下面给出了用于 GLCanvas 类事件处理的方法。

Sr.编号 方法和说明
1

void addGLEventListener(GLEventListener listener)

将给定的侦听器添加到此可绘制队列的末尾。

2

void addGLEventListener(int indexGLEventListener listener)

将给定的侦听器添加到此可绘制队列的给定索引处。

要实例化 GLCanvas 类,您需要 GLCapabilitiesImmutable 接口的对象,该接口指定一组不可变的 OpenGL 功能。

获取对象的方法之一CapabilitiesImmutable 接口用于实例化实现该接口的 GLCapabilities 类。可以使用 GLCapabilities 类的实例来实现此目的。

GLCapabilities 类

此类指定一组 OpenGL 功能。它以 GLCapabilities 对象作为参数。GLCapabilities 类描述了渲染上下文必须支持的所需功能,例如 OpenGL 配置文件。

下面给出了一个用于实例化 GLCapabilities 类的构造函数

Sr. No. 方法和说明
1

GLCapabilities(GLProfile glprofile)

它创建一个 GLCapabilities 对象。

要实例化 GLCanvas 类,您需要一个 GLCapabilitiesImmutable 接口的对象,该接口指定一组不可变的 OpenGL 功能。

获取 CapabilitiesImmutable 接口对象的方法之一是实例化实现该接口的 GLCapabilities 类。 GLCapabilities 类的实例可用于实现此目的。

GLCapabilities 类又需要一个 GLProfile 对象。

GLProfile 类

由于发布了多个版本的 OpenGL API;您需要向 Java 虚拟机 (JVM) 指定程序中使用的 OpenGL API 的确切版本。这可以使用 GLProfile 类来完成。

此类的 get() 方法接受不同的预定义 String 对象作为参数。每个 String 对象都是一个接口的名称,每个接口都支持某些版本的 OpenGL。如果您将此类初始化为静态和单例,它将为每个可用的 JOGL 配置文件提供单例 GLProfile 对象。

下面给出了 GLProfile 类的 get 方法的原型。

Sr.No. 方法和说明
1

Static GLProfile get(String profile)

使用默认设备。

由于这是一个静态方法,您需要使用类名来调用它,并且它 需要一个预定义的静态字符串变量作为参数。此类中有 12 个这样的变量,每个变量代表 GL 接口的一个单独实现。

GLProfile.get(GLProfile.GL2);

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 ES 3.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 ES 3.0)。

11

GL4

此接口包含所有 OpenGL [4.0 ... 4.3] 核心 方法,以及本规范发布时定义的大多数扩展。

12

GL4bc

此接口包含所有 OpenGL [4.0 ... 4.3] 兼容性配置文件,以及本规范发布时定义的大多数扩展规范。

13

GL4ES3

包含核心 GL4 (OpenGL 4.0+) 和 GLES3 (OpenGL ES 3.0) 的通用子集的接口。

GLJPanel 类

它是一个轻量级的 Swing 组件,提供 OpenGL 渲染支持。它 是为了与 Swing 兼容而提供的。

GLJPanel 类层次结构

下面给出的图表表示 GLJPanel 类的类层次结构。

GJPanel

下面给出了 GLJPanel 类的各种构造函数。

Sr.编号 构造函数和说明
1

GJPanel()

它创建一个具有一组默认 OpenGL 功能的新 GLJPanel 组件。

2

(GLCapabilitiesImmutable)

它创建一个具有一组请求的 OpenGL 功能的新 GLJPanel 组件。

3

GLJPanel(GLCapabilitiesImmutable userCapsRequest, GLCapabilitiesChooser chooser)

它创建一个新的 GLJPanel组件。

下面给出了 GLJPanel 类的方法。

Sr.No. 方法和说明
1

void addGLEventListener(GLEventListener listener)

此方法将给定的侦听器添加到此可绘制队列的末尾。

2

void addGLEventListener(int indexGLEventListener listener)

此方法将给定的侦听器添加到此可绘制队列的给定索引处。