Մասնակից:ԵՆարինե/Ավազարկղ/10
Java OpenGL (JOGL), գրադարան, որն ուղղակիորեն կապում է OpenGL ֆունկցիաները Java ծրագրավորման լեզվին: Դա JSR-231 (Java Bindings to OpenGL) հստակեցման հղումն է: Ներկայացված է անկախ opengl.org համայնքի կողմից[1]: Գրադարանը սկզբնապես մշակվել է Քենեթ Բրեդլի Ռասելի և Քրիստոֆեր Ջոն Քլայնի կողմից, իսկ ավելի ուշ՝ Sun Microsystems-ի Game Technology Group-ի կողմից։ Այն ներկայումս անկախ բաց կոդով նախագիծ է:
JOGL-ը ծրագրավորողին հնարավորություն է տալիս օգտվել OpenGL API 2.0 ճշգրտման բոլոր հնարավորություններից և առաջատար արտադրողների OpenGL ընդլայնումներից: JOGL-ը նաև տրամադրում է մուտք դեպի OpenGL երկու հիմնական հավելումներ՝ OpenGL Օգնական գրադարան (GLU) և OpenGL Developer Toolkit (GLUT) (բացառությամբ GLUT-ի պատուհանների համակարգի հետ կապված հատկանիշների, քանի որ Java-ն ունի իր սեփական խաչմերուկը: բարձր մակարդակի պատուհանների համակարգ AWT և Swing)[2]:
JOGL գրադարանը պարունակում է նաև մի քանի լրացուցիչ դասեր, որոնք նկարագրված չեն JSR-231 ճշգրտման մեջ, որոնք ծառայում են OpenGL հրամանների համար տվյալների մշակման հարմարության համար և կապված են Java լեզվի առանձնահատկությունների հետ (օրինակ՝ OpenGL ֆայլի I/O տվյալների պատրաստում, հյուսվածքներ, OpenGL-ի համար տվյալների զանգվածների պատրաստում):
Լուծում խմբագրել
JOGL-ն իրականացնում է C-ով գրված OpenGL գրադարանի ցածր մակարդակի API-ին JNI ինտերֆեյսի միջոցով: Որպեսզի JOGL-ը ճիշտ աշխատի, ենթադրվում է, որ ծրագրային ապահովման և ապարատային միջավայրը աջակցում է OpenGL-ին:
JOGL-ը տարբերվում է OpenGL-ի մյուս փաթաթաններից նրանով, որ, ըստ էության, այն պարզապես ծրագրավորողին տալիս է OpenGL API-ի հետ աշխատելու հնարավորություն՝ մուտք գործելով OpenGL հրամաններ համապատասխան մեթոդների զանգերի միջոցով մի քանի դասերում տեղադրված Java մշակողի արգումենտի սովորական տեսակներով, փոխարենը: OpenGL ֆունկցիոնալությունը որոշ կամ օբյեկտի վրա հիմնված պարադիգմում ներառելը: Իրոք, ներքին JOGL կոդի մեծ մասն ինքնաբերաբար ստեղծվում է C վերնագրի ֆայլերից հատուկ օգտակար գործիքի՝ Gluegen-ի կողմից, որը հատուկ գրված է JOGL-ի ստեղծումը հեշտացնելու համար:
Այս լուծումն ունի իր առավելություններն ու թերությունները: OpenGL ճարտարապետության առանձնահատկությունները, որը, մի կողմից, դիսկրետ ավտոմատ է, իսկ մյուս կողմից՝ ընթացակարգային API, չեն համապատասխանում Java ծրագրավորման մոտեցմանը: Այնուամենայնիվ, OpenGL API-ի ուղղակի քարտեզագրումը Java-ի շատ մեթոդների վրա շատ ավելի հեշտ է դարձնում OpenGL ծածկագիրը արդեն գրված C-ով Java-ում տեղափոխելը: JOGL-ի աբստրակցիայի ցածր մակարդակը հնարավորություն է տալիս ստեղծել ծրագրեր, որոնք բավականին արդյունավետ են կատարման արագության առումով, բայց միևնույն ժամանակ բարդացնում է ծրագրավորման գործընթացը՝ համեմատած ավելի բարձր մակարդակի աբստրակցիայի և իսկապես օբյեկտի վրա հիմնված փաթաթված գրադարանների հետ՝ OpenGL-ի համար Java-ի համար: (օրինակ, օրինակ՝ Java3D): Բացի այդ, քանի որ ներքին կոդի զգալի մասը ստեղծվում է ավտոմատ կերպով, OpenGL-ի ցանկացած փոփոխություն (օրինակ՝ գրադարանի մշակումը կամ նոր ընդլայնումների հայտնվելը) կարող են արագորեն ավելացնել JOGL-ին իր մշակողների կողմից:
Մշակման և ստանդարտացման կարգավիճակը խմբագրել
Ըստ մշակողների, 2007թ.-ին JOGL-ն աջակցում է OpenGL 2.0 բնութագրի բոլոր հատկանիշներին լիարժեք հասանելիություն:
JOGL 1.1.0 տարբերակի վերջին կայուն թողարկումը JSR-231-ի (Java Bindings for OpenGL) տեղեկանք իրականացումն է (անգլ.՝reference implementation):
1.1.1-ի գալիք թողարկումը պետք է աշխատի GLU NURBS հավելման հետ (կոր գծեր և մակերեսներ գծելով ստանդարտ GLU API-ի միջոցով): Ծրագրեր կան թողարկել վերանայված JSR-231 1.1.1 ճշգրտում և ավելացնել NURBS-ի հետ կապված մուտքի կետեր JSR-231 API-ին: 2.0.2 տարբերակը լիարժեք մուտք է ապահովում OpenGL API-ի 1.0 - 4.3 տարբերակները, ինչպես նաև ES 1, ES 2 և ES 3 բնութագրերը և գրեթե բոլոր ընդլայնումները:
JSR-231 բնութագրի ակնարկ՝ Java-ի զուգակցում OpenGL API-ի հետ խմբագրել
JSR-231 հստակեցում. Java-ը կապում է OpenGL API-ին (անգլ.՝ 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-ում երկու փաթեթներն էլ գտնվում են գրադարանում՝ jogl.jar ֆայլում)
Java 2D-ի և OpenGL-ի փոխազդեցությունը խմբագրել
Սկսած Java Standard Edition 1.6 տարբերակից, Java 2D API-ն և OpenGL-ը կարող են փոխազդել JOGL-ի միջոցով.
- Swing բաղադրիչների ծածկում OpenGL մակերևույթի վրա,
- ելքի իրականացում OpenGL-ի միջոցով Java 2D տարրերի բաղադրամասերի մակերեսի վրա,
- օգտագործելով 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
ենթագրքում, - լրացուցիչ նեյթիվ մոդուլներ՝ աշխատաժամանակի միջավայր JOGL գրադարանի կոդը գործարկելու համար: Ֆայլերը գտնվում են
lib
ենթագրքում, - արագ մեկնարկի ուղեցույց (
Userguide.html
ֆայլ), JOGL տարբերակի փոփոխության պատմություն (CHANGELOG.txt
ֆայլ), հեղինակային իրավունքի մասին տեղեկություններ (COPYRIGHT.txt
ֆայլ), լիցենզիայի տվյալներ (LICENSE-JOGL-[տարբերակի վերսիա].txt
), համառոտ հրահանգներ (ֆայլREADME.txt
):
- երկու երկուական java գրադարաններ (
- JOGL Java գրադարանի սկզբնական կոդը,
- ընդհանուր բաշխում, որը պարունակում է ամբողջ JOGL java-ի երկուականը և նեյթիվ գործարկման միջավայրի բոլոր տարբերակները, որոնք նախատեսված են 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-ի միջոցով:
Արտաքին հղումներ խմբագրել
- Сайт разработчиков
- Исходники на Гитхабе
- Текущая сборка для скачивания
- спецификация JSR-231 «Java Bindings for OpenGL»(անգլ.)
- Использование OpenGL в Java-приложении — начальные шаги в использовании JOGL