Java OpenGL ( JSR-231 ) | |
---|---|
Captură de ecran care demonstrează refracția în timp real folosind JOGL pe Mac OS X | |
Tip de | bibliotecă |
Dezvoltator | Comunitatea JogAmp |
Scris in | Java |
Sistem de operare | multiplatformă |
Platformă hardware | Mașină virtuală Java |
ultima versiune | 2.3.2 ( 10 octombrie 2015 ) |
Versiune de testare | 2.4.0 |
Licență | Licență BSD cu 2 clauze |
Site-ul web | jogamp.org/jogl/w… ( engleză) |
Java OpenGL (JOGL) este o bibliotecă care leagă direct funcțiile OpenGL la limbajul de programare Java . Este implementarea de referință a specificației JSR-231 (Java Bindings to OpenGL). Prezentat de comunitatea independentă opengl.org [1] (vezi Legăturile limbajului de programare la OpenGL ). Biblioteca a fost dezvoltată inițial de Kenneth Bradley Russell și Christopher John Kline și mai târziu de Game Technology Group de la Sun Microsystems . În prezent, este un proiect open source independent.
JOGL oferă programatorului acces la toate caracteristicile specificației OpenGL API 2.0 și la toate extensiile OpenGL de la furnizori de top [2] . JOGL oferă, de asemenea, acces la cele două suplimente principale OpenGL - OpenGL Helper Library (GLU) și OpenGL Developer Toolkit (GLUT) (cu excepția caracteristicilor legate de sistemul de ferestre ale GLUT, deoarece Java are propria sa multiplatformă sistem de ferestre de nivel înalt AWT și Swing ) .
Biblioteca JOGL conține, de asemenea, câteva clase suplimentare care nu sunt descrise în specificația JSR-231, care servesc pentru confortul procesării datelor pentru comenzile OpenGL și legate de caracteristicile limbajului Java (cum ar fi datele I/O ale fișierului OpenGL, pregătirea texturi, pregătirea matricelor de date pentru OpenGL).
JOGL implementează accesul la API -ul de nivel scăzut al bibliotecii OpenGL scrise în C prin interfața JNI . Pentru ca JOGL să funcționeze corect, se presupune că mediul software și hardware acceptă OpenGL.
JOGL diferă de alte wrapper-uri OpenGL prin faptul că, în esență, oferă programatorului pur și simplu capacitatea de a lucra cu API-ul OpenGL prin accesarea comenzilor OpenGL prin apeluri la metodele corespunzătoare cu tipurile obișnuite de argumente pentru dezvoltatori Java plasate în mai multe clase, în loc de încapsularea funcționalității OpenGL într-o paradigmă orientată pe obiecte. Într-adevăr, majoritatea codului JOGL intern este generat automat din fișierele antet C de un utilitar special , Gluegen , scris special pentru a facilita crearea JOGL.
Această soluție are avantajele și dezavantajele ei. Caracteristicile arhitecturii OpenGL, care, pe de o parte, este un automat discret și, pe de altă parte, un API procedural, nu corespund abordării programării în Java. Cu toate acestea, maparea directă a API-ului OpenGL la multe metode Java face mult mai ușoară portarea codului OpenGL deja scris în C în Java. Nivelul scăzut de abstractizare al JOGL face posibilă construirea de programe destul de eficiente din punct de vedere al vitezei de execuție, dar în același timp complică procesul de programare în comparație cu un nivel mai ridicat de abstractizare și biblioteci de wrapper cu adevărat orientate pe obiecte peste OpenGL pentru Java (de exemplu, cum ar fi Java3D ). De asemenea, deoarece o parte semnificativă a codului intern este generată automat, orice modificări aduse OpenGL (cum ar fi dezvoltarea bibliotecii sau apariția unor noi extensii) pot fi adăugate rapid la JOGL de către dezvoltatorii săi.
Potrivit dezvoltatorilor, în 2007 JOGL acceptă acces deplin la toate caracteristicile specificației OpenGL 2.0.
Cea mai recentă versiune stabilă a JOGL versiunea 1.1.0 este implementarea de referință a JSR - 231 (Java Bindings for OpenGL).
Versiunea 1.1.1 viitoare va trebui să funcționeze cu suplimentul GLU NURBS (desenând linii curbe și suprafețe prin API-ul GLU standard). Există planuri de a lansa o specificație JSR-231 1.1.1 revizuită și de a adăuga puncte de intrare legate de NURBS la API-ul JSR-231. Versiunea 2.0.2 oferă acces complet la versiunile API OpenGL 1.0 - 4.3, precum și la specificațiile ES 1, ES 2 și ES 3 și la aproape toate extensiile.
Specificația JSR-231: legarea Java (TM) la API-ul OpenGL(R), legarea Java(TM) la API-ul OpenGL(R) ) definește un model pentru legarea unei implementări native a bibliotecii OpenGL (o implementare pentru un anumit sistem de operare) la limbajul de programare Java.
Specificația JSR-231 definește două pachete:
(În JOGL ambele pachete sunt plasate în bibliotecă într-un fișier jar jogl.jar )
Începând cu Java Standard Edition versiunea 1.6 , API-ul Java 2D și OpenGL pot comunica prin JOGL:
Programul arată un exemplu al celui mai simplu desen al unui tetraedru folosind JOGL.
Clasă JavaRenderer - folosită GLAutoDrawablepentru a desena o scenă 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 ; clasă publică JavaRenderer implementează GLEventListener { private float rotateT = 0.0f ; privat static final GLU glu = GLU nou (); 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 ( rotireT , 1.0f , 0.0f , 0.0f ); gl . glRotatef ( rotireT , 0.0f , 1.0f , 0.0f ); gl . glRotatef ( rotireT , 0.0f , 0.0f , 1.0f ); gl . glRotatef ( rotireT , 0.0f , 1.0f , 0.0f ); gl . glBegin ( GL2 . GL_TRIANGLES ); // Față 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 ); // Partea dreapta orientată spre față 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 ); // Partea stângă orientată spre față 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 ); // Fund 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 . gland (); rotireT += 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 remodelare ( GLAutoDrawable gLDrawable , int x , int y , int width , int high ) { final GL2 gl = gLDrawable . getGL (). getGL2 (); if ( inaltime <= 0 ) { inaltime = 1 ; } final float h = ( plutitor ) latime / ( plutitor ) inaltime ; 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 dispun ( GLAutoDrawable arg0 ) { } }JavaDiaclass — Clasa principală responsabilă pentru apelarea execute JavaRenderer. Codul desenează o scenă 3D în GLCanvas'e.
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 ; clasă publică JavaDia implementează Runnable , KeyListener { private static Thread displayT = new Thread ( new JavaDia ()); privat static boolean bQuit = false ; public static void main ( String [] args ) { displayT . începe (); } public void run () { Frame frame = new Frame ( "Jogl 3D Shape/Rotation" ); GLCanvas canvas = GLCanvas nou (); int size = frame . getExtendedState (); pânză . addGLEventListener ( nou JavaRenderer ()); cadru . adaugă ( pânză ); cadru . set Nedecorat ( adevărat ); dimensiune |= Cadru . MAXIMIZED_BOTH ; cadru . setExtendedState ( dimensiune ); pânză . addKeyListener ( aceasta ); cadru . pachet (); cadru . setLocationRelativeTo ( null ); cadru . addWindowListener ( new WindowAdapter () { public void windowClosing ( WindowEvent e ) { bQuit = true ; System . exit ( 0 ); } }); cadru . setVisible ( adevărat ); pânză . cerereFocus (); in timp ce ( ! bIesire ) { canvas . afișaj (); } } public void keyPressed ( KeyEvent e ) { if ( e . getKeyCode ( ) == KeyEvent . VK_ESCAPE ) { displayT = null ; b Ieșire = adevărat ; Sistem . ieșire ( 0 ); } } public void keyReleased ( KeyEvent e ) { } public void keyTyped ( KeyEvent e ) { } }Livrarea JOGL include următoarele părți:
Fiecare parte a bibliotecii JOGL vine într-o arhivă zip separată . Numele arhivei zip reflectă numele piesei, informații despre versiunea JOGL și informații despre platforma hardware și software dacă piesa conține componente native.