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 类
GLCanvas 和 GLJpanel 是 JOGL GUI 的两个主要类,它们实现了 GLAutoDrawable 接口,可用作 OpenGL 命令的绘图表面。
GLCanvas 是一个重量级的 AWT 组件,它提供 OpenGL 渲染支持。这是 AWTAutoGLDrawable 接口的主要实现。它还继承了 java.awt.Canvas 类。由于它是一个重量级组件,在某些情况下,GLJCanvas 可能无法与 swing 组件正确集成。因此,在与 Swing 一起使用时必须小心。每当您在使用 GLJCanvas 时遇到问题时,您都必须使用 GLJPanel 类。
类 GLCanvas 的层次结构图如下所示 −

GLEventistener 接口与 GLCanvas 类一起工作。它响应 GLCanvas 类中的更改以及它们发出的绘制请求。
每当实例化 GLCanvas 类时,就会调用 GLEventListener 的 init() 方法。您可以重写此方法来初始化 OpenGL 状态。
每当首次绘制(实例化)或调整 GLCanvas 大小时,都会执行 GLEventListener 的 reshape() 方法。它用于初始化 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 类的类层次结构。

下面给出了 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) 此方法将给定的侦听器添加到此可绘制队列的给定索引处。 |