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. В настоящее время является независимым открытым проектом. JOGL предоставляет программисту доступ ко всем возможностям API OpenGL спецификации 4.5 и ко всем расширениям 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 его разработчиками. Состояние разработки и стандартизация
По уверениям разработчиков, на 2023 год JOGL поддерживает полный доступ ко всем возможностям спецификации OpenGL 4.5. Последний стабильный релиз JOGL версии 2.5.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.3.2 предоставляется полный доступ к OpenGL API версий 1.0 — 4.5, а также спецификациям ES 1, ES 2 and ES 3 и почти всем расширениям. Планируется поддержка Wayland и Vulkan. Обзор спецификации JSR-231: сопряжение Java с API OpenGLСпецификация JSR-231: сопряжение Java с API OpenGL (англ. Java(TM) binding to the OpenGL(R) API), — определяет модель привязки собственной реализации библиотеки OpenGL (реализации под конкретную операционную систему) к языку программирования Java. Спецификация JSR-231 определяет два пакета:
(В JOGL оба пакета размещены в библиотеке в jar-файле Взаимодействие Java 2D и OpenGLНачиная с Java Standard Edition версии 1.6, Java 2D API и OpenGL могут взаимодействовать посредством JOGL:
3D Tetrahedron ExampleПрограмма показывает пример простейшей отрисовки тетраэдра с использованием JOGL. Класс 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) {
}
}
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 включает следующие части:
Каждая часть библиотеки JOGL поставляется в отдельном zip архиве. В имени zip-архива отражено название части, информация о версии JOGL, а также информация о программно-аппаратной платформе, если часть содержит нативные компоненты. Примечания
См. также
Ссылки
|
Portal di Ensiklopedia Dunia