Java OpenGL
Java OpenGL (JSR-231) | |
---|---|
![]() Скриншот, демонстрирующий преломление в реальном времени с использованием JOGL на Mac OS X | |
Тип | библиотека |
Разработчик | JogAmp Community |
Написана на | Java |
Операционная система | кроссплатформенный |
Аппаратная платформа | Java Virtual Machine |
Последняя версия | 2.3.2 (10 октября 2015 года) |
Тестовая версия | 2.4.0 |
Лицензия | 2-пунктная лицензия BSD[вд] |
Сайт | jogamp.org/jogl/w… (англ.) |
Java OpenGL (JOGL) — библиотека, представляющая собой прямую привязку функций OpenGL к языку программирования Java. Является эталонной реализацией спецификации JSR-231 (Java Bindings to OpenGL). Отмечена независимым сообществом opengl.org[1] (см. Programming Language Bindings to OpenGL). Изначально библиотека разрабатывалась Кеннетом Бредли Расселом и Кристофером Джоном Клайном, а позже группой Game Technology Group компании Sun Microsystems. В настоящее время является независимым открытым проектом.
JOGL предоставляет программисту доступ ко всем возможностям API OpenGL спецификации 2.0 и ко всем расширениям OpenGL от ведущих производителей[2]. 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 1.1.1 и добавитьв API JSR-231 точки входа, связанные с NURBS. В версии 2.0.2 предоставляется полный доступ к OpenGL API версий 1.0 — 4.3, а также спецификациям ES 1, ES 2 and ES 3 и почти всем расширениям.
Обзор спецификации JSR-231: сопряжение Java с API OpenGL
Спецификация JSR-231: сопряжение Java с API OpenGL (англ. Java(TM) binding to the OpenGL(R) API), — определяет модель привязки собственной реализации библиотеки OpenGL (реализации под конкретную операционную систему) к языку программирования Java.
Спецификация JSR-231 определяет два пакета:
javax.media.opengl
— реализует спецификацию ядра OpenGL 2.0 с поддержкой доступных на момент написания JSR-231 расширений OpenGLjavax.media.opengl.glu
— реализует спецификацию стандартного дополнения GLU 1.3 за исключением GLU NURBS
(В JOGL оба пакета размещены в библиотеке в jar-файле jogl.jar
)
Взаимодействие Java 2D и OpenGL
Начиная с Java Standard Edition версии 1.6, Java 2D API и OpenGL могут взаимодействовать посредством JOGL:
- наложение компонентов Swing на поверхность OpenGL
- осуществление вывода средствами OpenGL на поверхности компонентов элементов Java 2D (см. пример создания кнопки с иконкой, визуализированной средствами OpenGL (англ.))
- использование 3D графики везде, где могут использоваться графические компоненты Swing
- осуществление вывода средствами Java 2D на поверхности OpenGL
Пример построения тетраэдра
3D Tetrahedron Example
Программа показывает пример простейшей отрисовки тетраэдра с использованием JOGL.
Класс JavaRenderer
— использует GLAutoDrawable
для отрисовки 3D-сцены.
import com.jogamp.opengl.GL; import com.jogamp.opengl.GL2; import com.jogamp.opengl.GLEventListener; import com.jogamp.opengl.GLAutoDrawable; import com.jogamp.opengl.glu.GLU; public class JavaRenderer implements GLEventListener { private float rotateT = 0.0f; private static final GLU glu = new GLU(); public void display(GLAutoDrawable gLDrawable) { final GL2 gl = gLDrawable.getGL().getGL2(); 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(GL2.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 init(GLAutoDrawable gLDrawable) { final GL2 gl = gLDrawable.getGL().getGL2(); gl.glShadeModel(GL2.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(GL2.GL_PERSPECTIVE_CORRECTION_HINT,GL.GL_NICEST); } public void reshape(GLAutoDrawable gLDrawable, int x, int y, int width, int height) { final GL2 gl = gLDrawable.getGL().getGL2(); if(height <= 0) { height = 1; } final float h = (float)width / (float)height; gl.glMatrixMode(GL2.GL_PROJECTION); gl.glLoadIdentity(); glu.gluPerspective(50.0f, h, 1.0, 1000.0); gl.glMatrixMode(GL2.GL_MODELVIEW); gl.glLoadIdentity(); } public void dispose(GLAutoDrawable arg0) { } }
JavaDia
класс—Основной класс отвечающий за вызов выполнение JavaRenderer
. Код рисует 3D-сцену в GLCanvas
'е.
import java.awt.Frame; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import com.jogamp.opengl.awt.GLCanvas; public class JavaDia implements Runnable, KeyListener { 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(); int size = frame.getExtendedState(); canvas.addGLEventListener(new JavaRenderer()); frame.add(canvas); frame.setUndecorated(true); size |= Frame.MAXIMIZED_BOTH; frame.setExtendedState(size); canvas.addKeyListener(this); frame.pack(); frame.setLocationRelativeTo(null); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { bQuit = true; System.exit(0); } }); frame.setVisible(true); canvas.requestFocus(); while( !bQuit ) { canvas.display(); } } public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_ESCAPE) { displayT = null; bQuit = true; System.exit(0); } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } }
Инсталляция, подключение и использование
Поставка JOGL включает следующие части:
- Документацию к API.
- Несколько поставок исполняемого кода библиотеки под различные платформы. Каждая поставка содержит:
- две бинарные java библиотеки (
gluegen-rt.jar
иjogl.jar
), которые программист должен подключить к исполняемому java-коду. Файлы размещены в подкаталогеlib
- дополнительные нативные модули — runtime-окружение для исполнения кода библиотек JOGL. Файлы размещены в подкаталоге
lib
- краткое руководство пользователя (файл
Userguide.html
(англ.)), историю изменений версий JOGL (файлCHANGELOG.txt
(англ.)), информацию об авторских правах (файлCOPYRIGHT.txt
(англ.)), лицензионную информацию (файлLICENSE-JOGL-[сигнатура версии].txt
(англ.)), краткие инструкции (файлREADME.txt
(англ.)). Файлы размещены в корневом каталоге библиотеки
- две бинарные java библиотеки (
- исходные тексты java-библиотек JOGL
- общую поставку, содержащую весь бинарный java-код JOGL и все варианты нативного runtime-окружения, предназначенную для приложений архитектуры Java Web Start и java-апплетов
- бинарный java-код примеров
- исходный java-код примеров
Каждая часть библиотеки JOGL поставляется в отдельном zip архиве. В имени zip-архива отражено название части, информация о версии JOGL, а также информация о программно-аппаратной платформе, если часть содержит нативные компоненты.
Примечания
- ↑ [1] Архивная копия от 26 февраля 2011 на Wayback Machine
- ↑ По информации независимого сообщества opengl.org, см. Programming Language Bindings to OpenGL Архивная копия от 2 ноября 2008 на Wayback Machine
См. также
- Lightweight Java Game Library (LWJGL) — комплексное решение на основе OpenGL и OpenAL для разработчиков интерактивных мультимедиаприложений, использующих Java
- OpenGL
- Java3D
Ссылки
- Сайт разработчиков
- Исходники на Гитхабе
- Текущая сборка для скачивания
- спецификация JSR-231 «Java Bindings for OpenGL» (англ.)
- Использование OpenGL в Java-приложении — начальные шаги в использовании JOGL