JOGL - 绘图基础

OpenGL API 提供了绘制基本图形元素(如点、顶点、线等)的原始方法。使用这些方法,您可以绘制三角形、多边形和圆形等形状。既有 2D 维度,也有 3D 维度。本章将教您如何在 Java 程序中使用 JOGL 绘制基本线条。

绘图对象

为了访问特定于硬件和操作系统平台的程序以及使用其他语言(如 C 和 C++(本机应用程序))编写的库,Java 使用一种称为 Java 本机接口 (JNI) 的编程框架。 JOGL 内部使用此接口来访问 OpenGL 函数,如下图所示。

JNI

GLEventListener 接口的所有四个方法都有代码(java JOGL 方法)来内部调用 OpenGL 函数。这些 JOGL 方法的命名也类似于 OpenGL 的命名约定。如果 OpenGL 中的函数名称是 glBegin(),则将其用作 gl.glBegin()

每当调用 java JOGL 的 gl.glBegin() 方法时,它都会内部调用 OpenGL 的 glBegin() 方法。这就是在安装 JOGL 时在用户系统上安装本机库文件的原因。

Display() 方法

这是一个重要的方法,它保存了开发图形的代码。它 需要 GLAutoDrawable 接口对象作为其参数。

display() 方法最初使用 GL 接口的对象获取 OpenGL 上下文(GL 继承了 GLBase 接口,该接口包含生成所有 OpenGL 上下文对象的方法)。由于本教程是关于 JOGL2 的,让我们生成一个 GL2 对象。

以下代码片段显示了如何生成 GL2 对象 −

//生成 GL 对象
GL gl = drawable.getGL();
GL gl = drawable.getGL();

//使用此方法获取 Gl2 对象
//这可以写成一行,例如
final GL2 gl = drawable.getGL().getGL2();

使用 GL2 接口的对象,可以访问此接口的成员, 进而提供对 OpenGL [1.0... 3.0] 函数的访问。

绘制线条

GL2 接口包含大量方法,但这里讨论的是三个主要的重要方法,即 glBegin()glVertex()glEnd()

Sr.No. 方法和说明
1

glBegin()

此方法启动绘制线条的过程。它以预定义的字符串整数"GL_LINES"作为参数,该参数继承自 GL 接口。

2

glVertex3f()/glVertex2f()

此方法创建顶点,我们必须将坐标作为参数 3f 和 2f 传递,它们分别表示三维浮点坐标和二维浮点坐标。

3

glEnd()

结束线条

下面给出的是使用 JOGL 绘制基本线条的程序 −

import javax.media.opengl.GL2;
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 Line implements GLEventListener {

   @Override
   public void display(GLAutoDrawable drawable) {
      final GL2 gl = drawable.getGL().getGL2();
            
      gl.glBegin (GL2.GL_LINES);//static field
      gl.glVertex3f(0.50f,-0.50f,0);
      gl.glVertex3f(-0.50f,0.50f,0);
      gl.glEnd();

   }
            
   @Override
   public void dispose(GLAutoDrawable arg0) {
      //method body
   }
            
   @Override
   public void init(GLAutoDrawable arg0) {
      // method body
   }
	
   public static void main(String[] args) {

        //获取 GL2 配置文件的功能对象
        final GLProfile profile = GLProfile.get(GLProfile.GL2);
        GLCapabilities capabilities = new GLCapabilities(profile);
        
        // 画布
        final GLCanvas glcanvas = new GLCanvas(capabilities);
        Line l = new Line();
        glcanvas.addGLEventListener(l);
        glcanvas.setSize(400, 400);
        
        //创建框架
        final JFrame frame = new JFrame ("straight Line");
        
        //将画布添加到框架
        frame.getContentPane().add(glcanvas);
        
        frame.setSize(frame.getContentPane().getPreferredSize());
        frame.setVisible(true);
      
   }//end of main
	
}//end of classimport javax.media.opengl.GL2;
Line