Java OpenGL | это... Что такое Java OpenGL? (original) (raw)

Java OpenGL (JSR-231)

JOGL Refrection Demo Screenshot.png Скриншот, демонстрирующий преломление в реальном времени с использованием JOGL на Mac OS X
Тип библиотека
Разработчик JogAmp Community
Написана на Java
Операционная система кроссплатформенный
Последняя версия 1.1.1 (22 мая 2008 года)
Тестовая версия 2.0-rc9 (20 июня 2012 года)
Лицензия BSD
Сайт http://jogamp.org (англ.)

Java OpenGL (JOGL) — библиотека, представляющая собой прямую привязку функций OpenGL к языку программирования Java. Является эталонной реализацией спецификации JSR-231 (Java Bindings to OpenGL). Отмечена независимым сообществом opengl.org (см. Programming Language Bindings to OpenGL). Изначально библиотека разрабатывалась Кеннетом Бредли Расселом и Кристофером Джоном Клайном, а позже группой Game Technology Group компании Sun Microsystems. В настоящее время является независимым открытым проектом.

JOGL предоставляет программисту доступ ко всем возможностям API OpenGL спецификации 2.0 и ко всем расширениям OpenGL от ведущих производителей[1]. JOGL предоставляет доступ и к двум основным дополнениям OpenGL — ко вспомогательной библиотеке OpenGL (GLU) и к инструментарию разработчика на OpenGL (GLUT) (за исключением возможностей GLUT, связанных с оконной системой, так как Java имеет свою кроссплатформенную высокоуровневую оконную систему AWT и Swing).

Также библиотека JOGL содержит несколько дополнительных классов, не описанных в спецификации JSR-231, служащих для удобства обработки данных для команд OpenGL и связанных с особенностями языка Java (такими как файловый ввод-вывод данных OpenGL, подготовка текстур, подготовка массивов данных для OpenGL).

Содержание

Решение

JOGL реализует доступ к низкоуровневому API библиотеки OpenGL, написанной на языке Си, посредством интерфейса JNI. Для корректной работы JOGL предполагается, что программное и аппаратное окружение поддерживает OpenGL.

JOGL отличается от других OpenGL оболочек тем, что, по сути, просто предоставляет программисту возможность работать с API OpenGL посредством обращения к командам OpenGL через вызовы соответствующих методов с привычными Java-разработчику типами аргументов, размещённых в нескольких классах, вместо инкапсулирования функциональных возможностей OpenGL в какую-либо объектно-ориентированную парадигму. Действительно, большинство внутреннего кода JOGL сгенерировано автоматически по заголовочным файлам языка Си специальной утилитой Gluegen, специально написанной, чтобы облегчить создание JOGL.

Такое решение имеет свои преимущества и недостатки. Особенности архитектуры OpenGL, представляющего собой, с одной стороны, дискретный автомат, а с другой — процедурный API, не соответствует подходу к программированию на Java. Однако прямое отображение OpenGL API на множество методов Java заметно упрощает перенос уже написанного на Си OpenGL-кода на Java. Малый уровень абстракции JOGL даёт возможность построения довольно эффективных с точки зрения скорости выполнения программ, но вместе с тем усложняет процесс программирования по сравнению с более высокого уровня абстракции и по-настоящему объектно-ориентированными библиотеками-оболочками над OpenGL для Java (например такими, как Java3D). Также, поскольку существенная доля внутреннего кода сгенерирована автоматически, любые изменения в OpenGL (такие как развитие библиотеки или появление новых расширений) могут быть оперативно добавлены в JOGL его разработчиками.

Состояние разработки и стандартизация

По уверениям разработчиков, на 2007 год JOGL поддерживает полный доступ ко всем возможностям спецификации OpenGL 2.0.

Последний стабильный релиз JOGL версии 1.1.0 есть реализация спецификации (англ. reference implementation) JSR-231 (Java Bindings for OpenGL).

Предстоящий релиз 1.1.1 должен будет обеспечить работу с надстройкой GLU NURBS, (рисование кривых линий и поверхностей через стандартный GLU API).

Спецификация JSR-231: сопряжение Java с API OpenGL

Спецификация JSR-231: сопряжение Java с API OpenGL (англ. Java(TM) binding to the OpenGL(R) API), — определяет модель привязки собственной реализации библиотеки OpenGL (реализации под конкретную операционную систему) к языку программирования Java.

Спецификация JSR-231 определяет два пакета:

(В JOGL оба пакета размещены в библиотеке в jar-файле jogl.jar)

Взаимодействие Java 2D и OpenGL

Начиная с Java Standard Edition версии 1.6, Java 2D API и OpenGL могут взаимодействовать посредством JOGL:

Пример построения тетраэдра

3D Tetrahedron Example

Программа показывает пример простейшей отрисовки тетраэдра с использованием JOGL.

Класс JavaRenderer — использует GLAutoDrawable для отрисовки 3D-сцены.

import javax.media.opengl.GL; import javax.media.opengl.GLEventListener; import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.glu.GLU; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;

public class JavaRenderer implements GLEventListener, KeyListener { private float rotateT = 0.0f; private static final GLU glu = new GLU();

public void display(GLAutoDrawable gLDrawable) {
    final GL gl = gLDrawable.getGL();
    gl.glClear(GL.GL_COLOR_BUFFER_BIT);
    gl.glClear(GL.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();
    gl.glTranslatef(0.0f, 0.0f, -5.0f);

    gl.glRotatef(rotateT, 1.0f, 0.0f, 0.0f);
    gl.glRotatef(rotateT, 0.0f, 1.0f, 0.0f);
    gl.glRotatef(rotateT, 0.0f, 0.0f, 1.0f);
    gl.glRotatef(rotateT, 0.0f, 1.0f, 0.0f);

    gl.glBegin(GL.GL_TRIANGLES);

    // Front
    gl.glColor3f(0.0f, 1.0f, 1.0f); 
    gl.glVertex3f(0.0f, 1.0f, 0.0f);
    gl.glColor3f(0.0f, 0.0f, 1.0f); 
    gl.glVertex3f(-1.0f, -1.0f, 1.0f);
    gl.glColor3f(0.0f, 0.0f, 0.0f); 
    gl.glVertex3f(1.0f, -1.0f, 1.0f);

    // Right Side Facing Front
    gl.glColor3f(0.0f, 1.0f, 1.0f); 
    gl.glVertex3f(0.0f, 1.0f, 0.0f);
    gl.glColor3f(0.0f, 0.0f, 1.0f); 
    gl.glVertex3f(1.0f, -1.0f, 1.0f);
    gl.glColor3f(0.0f, 0.0f, 0.0f); 
    gl.glVertex3f(0.0f, -1.0f, -1.0f);

    // Left Side Facing Front
    gl.glColor3f(0.0f, 1.0f, 1.0f); 
    gl.glVertex3f(0.0f, 1.0f, 0.0f);
    gl.glColor3f(0.0f, 0.0f, 1.0f); 
    gl.glVertex3f(0.0f, -1.0f, -1.0f);
    gl.glColor3f(0.0f, 0.0f, 0.0f); 
    gl.glVertex3f(-1.0f, -1.0f, 1.0f);

    // Bottom
    gl.glColor3f(0.0f, 0.0f, 0.0f); 
    gl.glVertex3f(-1.0f, -1.0f, 1.0f);
    gl.glColor3f(0.1f, 0.1f, 0.1f); 
    gl.glVertex3f(1.0f, -1.0f, 1.0f);
    gl.glColor3f(0.2f, 0.2f, 0.2f); 
    gl.glVertex3f(0.0f, -1.0f, -1.0f);

    gl.glEnd();

    rotateT += 0.2f;
}

public void displayChanged(GLAutoDrawable gLDrawable, 
  boolean modeChanged, boolean deviceChanged) {
}

public void init(GLAutoDrawable gLDrawable) {
    final GL gl = gLDrawable.getGL();
    gl.glShadeModel(GL.GL_SMOOTH);
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    gl.glClearDepth(1.0f);
    gl.glEnable(GL.GL_DEPTH_TEST);
    gl.glDepthFunc(GL.GL_LEQUAL);
    gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, 
    GL.GL_NICEST);
    gLDrawable.addKeyListener(this);
}

public void reshape(GLAutoDrawable gLDrawable, int x, 
int y, int width, int height) {
    final GL gl = gLDrawable.getGL();
    if(height <= 0) {
        height = 1;
    }
    final float h = (float)width / (float)height;
    gl.glMatrixMode(GL.GL_PROJECTION);
    gl.glLoadIdentity();
    glu.gluPerspective(50.0f, h, 1.0, 1000.0);
    gl.glMatrixMode(GL.GL_MODELVIEW);
    gl.glLoadIdentity();
}

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_ESCAPE) {
        JavaDia.bQuit = true;
        JavaDia.displayT = null;
        System.exit(0);
    }
}

public void keyReleased(KeyEvent e) {
}

public void keyTyped(KeyEvent e) {
}

}

JavaDia класс—Основной класс отвечающий за вызов выполнение JavaRenderer. Код рисует 3D-сцену в GLCanvas'е.

import javax.media.opengl.GLCanvas; import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;

public class JavaDia implements Runnable { private static Thread displayT = new Thread(new JavaDia()); private static boolean bQuit = false;

 public static void main(String[] args) {
     displayT.start();
 }

 public void run() {
     Frame frame = new Frame("Jogl 3D Shape/Rotation");
     GLCanvas canvas = new GLCanvas();
     canvas.addGLEventListener(new JavaRenderer());
     frame.add(canvas);
     frame.setSize(640, 480);
     frame.setUndecorated(true);
     int size = frame.getExtendedState();
     size |= Frame.MAXIMIZED_BOTH;
     frame.setExtendedState(size);

     frame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) {
             bQuit = true;
         }
     });
     frame.setVisible(true);

// frame.show(); canvas.requestFocus(); while( !bQuit ) { canvas.display(); } } }

Инсталляция, подключение и использование

Поставка JOGL включает следующие части:

Каждая часть библиотеки JOGL поставляется разработчиком в отдельном zip архиве. В имени zip-архива отражено название части, информация о версии JOGL, а также информация о программно-аппаратной платформе, если часть, содержит нативные компоненты.

Примечания

  1. По информации независимого сообщества opengl.org, см. Programming Language Bindings to OpenGL

См. также

Ссылки