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

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

Ծանոթագրություններ խմբագրել

  1. [1] Արխիվացված է Փետրվար 26, 2011 Wayback Machine-ի միջոցով:
  2. По информации независимого сообщества opengl.org, см. Programming Language Bindings to OpenGL Արխիվացված է Նոյեմբեր 2, 2008 Wayback Machine-ի միջոցով:

Արտաքին հղումներ խմբագրել