Java OpenGL

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

Java OpenGL (JSR-231)
Скриншот программы Java OpenGL (JSR-231)
Скриншот, демонстрирующий преломление в реальном времени с использованием JOGL на Mac OS X
Типбиблиотека
РазработчикJogAmp Community
Написана наJava
Операционная система кроссплатформенный
Аппаратная платформа Java Virtual Machine
Последняя версия2.3.2 (10 октября 2015 года)
Тестовая версия2.4.0
Лицензия2-пунктная лицензия BSD[d]
Сайтjogamp.org/jogl/w… (англ.)

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 расширений OpenGL
  • javax.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:

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

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-библиотек JOGL
  • общую поставку, содержащую весь бинарный java-код JOGL и все варианты нативного runtime-окружения, предназначенную для приложений архитектуры Java Web Start и java-апплетов
  • бинарный java-код примеров
  • исходный java-код примеров

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

Примечания

См. также

  • Lightweight Java Game Library (LWJGL) — комплексное решение на основе OpenGL и OpenAL для разработчиков интерактивных мультимедиаприложений, использующих Java
  • OpenGL
  • Java3D

Ссылки

🔥 Top keywords: Заглавная страницаЯндексДуров, Павел ВалерьевичСлужебная:ПоискYouTubeЛунин, Андрей АлексеевичПодносова, Ирина ЛеонидовнаВКонтактеФоллаут (телесериал)WildberriesTelegramРеал Мадрид (футбольный клуб)Богуславская, Зоя БорисовнаДуров, Валерий СемёновичРоссияXVideosСписок умерших в 2024 годуЧикатило, Андрей РомановичFallout (серия игр)Список игроков НХЛ, забросивших 500 и более шайбПопков, Михаил ВикторовичOzon17 апреляИльин, Иван АлександровичMail.ruСёгун (мини-сериал, 2024)Слово пацана. Кровь на асфальтеПутин, Владимир ВладимировичЛига чемпионов УЕФАГагарина, Елена ЮрьевнаБишимбаев, Куандык ВалихановичЛига чемпионов УЕФА 2023/2024Турнир претендентов по шахматам 2024Манчестер СитиMGM-140 ATACMSРоссийский миротворческий контингент в Нагорном КарабахеЗагоризонтный радиолокаторПинапВодительское удостоверение в Российской Федерации