Java OpenGL (JOGL)

**Java OpenGL (JOGL)**, գրադարանին նման մի բան, որն ուղղակիորեն կապում է OpenGL ֆունկցիաները Java ծրագրավորման լեզվին։ Դա JSR-231 (Java Bindings to OpenGL) հստակեցման հղումն է։ Ներկայացված է անկախ opengl.org համայնքի կողմից։ Գրադարանը սկզբնապես մշակվել է Քենեթ Բրեդլի Ռասելի և Քրիստոֆեր Ջոն Քլայնի կողմից, իսկ ավելի ուշ՝ Sun Microsystems-ի Game Technology Group-ի կողմից։ Այն ներկայումս անկախ բաց կոդով նախագիծ է։

JOGL-ը ծրագրավորողին հնարավորություն է տալիս օգտվել OpenGL API 2.0 ճշգրտման բոլոր հնարավորություններից և առաջատար արտադրողների OpenGL ընդլայնումներից։ JOGL-ը նաև տրամադրում է մուտք դեպի OpenGL երկու հիմնական հավելումներ՝ OpenGL Օգնական գրադարան (GLU) և OpenGL Developer Toolkit (GLUT) (բացառությամբ GLUT-ի պատուհանների համակարգի հետ կապված հատկանիշների, քանի որ Java-ն ունի իր սեփական խաչաձև հարթակը՝ բարձր մակարդակի պատուհանների համակարգ AWT և Swing):

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 տեսարան ցուցադրելու համար։
```java
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-ում։
```java
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`):
* JOGL Java գրադարանի սկզբնական կոդը,
* ընդհանուր բաշխում, որը պարունակում է ամբողջ JOGL java-ի երկուականը և նեյթիվ  գործարկման միջավայրի բոլոր տարբերակները, որոնք նախատեսված են Java Web Start ճարտարապետության և java հավելվածների համար,
* երկուական java կոդի օրինակներ,
* Օրինակների սկզբնաղբյուր Java կոդը։

JOGL գրադարանի յուրաքանչյուր մաս գալիս է առանձին zip արխիվում։ Zip արխիվի անվանումը արտացոլում է մասի անվանումը, JOGL տարբերակի մասին տեղեկությունները և ապարատային և ծրագրային ապահովման հարթակի մասին տեղեկությունները, եթե մասը պարունակում է հիմնական բաղադրիչներ։

## Ծանոթագրություններ

## Արտաքին հղումներ
* Сайт разработчиков
* Исходники на Гитхабе
* Текущая сборка для скачивания
* спецификация JSR-231 «Java Bindings for OpenGL»
* Использование OpenGL в Java-приложении — начальные шаги в использовании JOGL

Կատեգորիա:Ջավա