123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999 |
- <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
- <HTML>
- <HEAD>
- <TITLE>Jogl - User's Guide</TITLE>
- </HEAD>
- <BODY>
- <H1>Jogl - User's Guide</H1>
- <P>
- <UL>
- <LI> Overview
- <LI> Developing with JOGL
- <UL>
- <LI> Building the source tree
- <LI> Local installation for development
- <LI> Java Web Start integration
- <LI> Applet support
- </UL>
- <LI> GLDrawable and GLContext
- <LI> Creating a GLAutoDrawable
- <LI> Writing a GLEventListener
- <LI> Using the Composable Pipeline
- <LI> Heavyweight and Lightweight Issues
- <LI> Multithreading Issues
- <LI> Pbuffers
- <LI> GLU
- <LI> More Resources
- <LI> Platform notes
- <UL>
- <LI> All Platforms
- <LI> Windows
- <LI> Linux
- <LI> Solaris, Linux (X11 platforms)
- <LI> Macintosh OS X
- </UL>
- <LI> Version History
- </UL>
- <H2> Overview </H2>
- <P>
- Jogl is a Java programming language binding for the OpenGL 3D graphics
- API. It supports integration with the Java platform's AWT and Swing
- widget sets while providing a minimal and easy-to-use API that handles
- many of the issues associated with building multithreaded OpenGL
- applications. Jogl provides access to the latest OpenGL routines
- (OpenGL 2.0 with vendor extensions) as well as platform-independent
- access to hardware-accelerated offscreen rendering ("pbuffers"). Jogl
- also provides some of the most popular features introduced by other
- Java bindings for OpenGL like GL4Java, LWJGL and Magician, including a
- composable pipeline model which can provide faster debugging for
- Java-based OpenGL applications than the analogous C program.
- </P>
- <P>
- Jogl was designed for the most recent versions of the Java platform
- and for this reason supports only J2SE 1.4 and later. It also only
- supports truecolor (15 bits per pixel and higher) rendering; it does
- not support color-indexed modes. It was designed with New I/O (NIO) in
- mind and uses NIO internally in the implementation. The Jogl binding
- is itself written almost completely in the Java programming language.
- There are roughly 150 lines of handwritten C code in the entire Jogl
- source base (100 of which work around bugs in older OpenGL drivers on
- Windows); the rest of the native code is autogenerated during the
- build process by a new tool called <a
- href="http://gluegen.dev.java.net/">GlueGen</a>, the source code of
- which is available from its own java.net project.
- </P>
- <P>
- The JOGL source tree in its current form is an experimental workspace
- for the <a href="http://jcp.org/en/jsr/detail?id=231">JSR-231</a> Java
- Bindings for OpenGL JSR. JOGL is not the official reference
- implementation, but an evolving workspace. Snapshots of the JOGL
- source tree are run through the JSR-231 Technology Compatibility Kit
- (TCK) to become the official reference implementation (RI). As of this
- writing the JSR has not been finalized, so the first official RI of
- the JSR has not yet been produced.
- </P>
- <H2> Developing with JOGL </H2>
- <H3> Building the source tree </H3>
- <P>
- Most developers using JOGL will download the most current <a
- href="https://jogl.dev.java.net/servlets/ProjectDocumentList">release
- build</a>. Separate instructions are available on how to <a
- href="https://jogl.dev.java.net/unbranded-source/browse/*checkout*/jogl/doc/HowToBuild.html?rev=HEAD&content-type=text/html">build
- the source tree</a>.
- </P>
- <H3> Local installation for development </H3>
- <P>
- The JOGL distribution for developers comes in the form of a zip
- archive which contains the Java classes to call OpenGL from Java, as
- well as the associated JNI native libraries. JOGL depends on some
- run-time support classes and native code provided by the GlueGen
- project; these classes and native code are also provided in the zip
- bundles.
- </P>
- <P>
- If you are developing a new application which uses JOGL, download the
- zip archive for your platform (for example.,
- jogl-[version]-windows-i586.zip) and unzip it. Modify your CLASSPATH
- environment variable to include the full paths to jogl.jar and
- gluegen-rt.jar; for example,
- ".;C:\Some\Other\Package\foo.jar;C:\Users\myhome\jogl-[version]-windows-i586\lib\jogl.jar;C:\Users\myhome\jogl-[version]-windows-i586\lib\gluegen-rt.jar".
- (If you did not previously set the CLASSPATH environment variable, you
- may want to make sure that ".", the current directory, is on your new
- CLASSPATH.) Modify your PATH environment variable (Windows),
- LD_LIBRARY_PATH environment variable (Solaris and Linux), or
- DYLD_LIBRARY_PATH environment variable (Mac OS X) to contain the full
- path to the "lib" directory; for example, on Windows, add
- "C:\Users\myhome\jogl-[version]-windows-i586\lib" to your PATH using
- the System control panel, Advanced tab, Environment Variables
- button. At this point your Java installation should be able to see the
- JOGL class files. Users of IDEs such as NetBeans and Eclipse should
- consult the IDE's documentation to see how to add jar files and native
- libraries to their current project.
- </P>
- <P>
- Dropping the JOGL jar and native library into the extension directory
- of the JRE is <b>strongly discouraged</b>. Doing so can cause
- conflicts with third-party applications launched via Java Web Start,
- and causes confusion later when upgrading the distribution.
- </P>
- <P>
- If you are on the Linux platform, please see the Linux-specific
- platform notes, below, with information on incompatibility between the
- JPackage Java RPMs and JOGL.
- </P>
- <H3> Java Web Start integration </H3>
- <P>
- The recommended distribution vehicle for applications using JOGL is
- Java Web Start. JOGL-based applications do not even need to be signed;
- all that is necessary is to reference the JOGL extension JNLP file.
- Because the JOGL jar files are signed, an unsigned application can
- reference the signed JOGL library and continue to run inside the
- sandbox.
- </P>
- <P>
- To reference JOGL within your application's JNLP file, simply place
- the following line in the <code><resources></code> section:
- <PRE>
- <extension name="jogl" href="http://download.java.net/media/jogl/builds/archive/jsr-231-webstart-current/jogl.jnlp" />
- </PRE>
- This JNLP file points to the current JSR-231 unofficial development
- build. For reference, the extension JNLP file for the most recent
- official JSR-231 build is available at
- <PRE>
- <extension name="jogl" href="http://download.java.net/media/jogl/builds/archive/jsr-231-1.1.0/webstart/jogl.jnlp" />
- </PRE>
- Note that before JOGL transitioned to the JSR-231 APIs, there were
- releases of the library in the <code>net.java.games.jogl</code>
- namespace under version numbers "1.0", "1.1", and "1.1.1". All of
- these releases have been superseded by JSR-231. Please update your
- applications.
- </P>
- <H3> Applet support </H3>
- <P>
- Lilian Chamontin, in conjunction with several other members of the
- JOGL community, has contributed a JOGL applet installer. This
- installer uses some clever tricks to allow deployment of unsigned
- applets which use JOGL into existing web browsers and JREs as far back
- as 1.4.2, which is the earliest version of Java supported by JOGL.
- </P>
- <P>
- The JOGLAppletInstaller is distributed inside jogl.jar as a utility
- class in com.sun.opengl.util. It requires that the developer host a
- local, signed copy of jogl.jar and all of the jogl-natives jars; the
- certificates must be the same on all of these jars. Note that in the
- release builds of JOGL all of these jars are signed by Sun
- Microsystems, so the developer can deploy applets without needing any
- certificates.
- </P>
- <P>
- The JOGLAppletInstaller javadoc describes the basic steps for
- deployment of an applet utilizing JOGL. Please refer to this
- documentation for more information. A live example of deploying an
- unsigned JOGL applet will be added to this documentation shortly once
- the first signed build of the JOGLAppletInstaller has been shipped.
- </P>
- <H2> GLDrawable and GLContext </H2>
- <P>
- The JSR-231 APIs specify interfaces two low-level OpenGL abstractions:
- drawables and contexts. An OpenGL drawable is effectively a surface
- upon which OpenGL rendering will be performed. In order to perform
- rendering, an OpenGL rendering context is needed. Contexts and
- drawables typically go hand-in-hand. More than one context may be
- created for a particular drawable. In the JSR-231 abstractions, a
- context is always associated with exactly one drawable.
- </P>
- <P>
- Most end users will not need to use these abstractions directly.
- However, when sharing textures, display lists and other OpenGL objects
- between widgets, the concrete identifier for the "namespace" for these
- objects is the GLContext.
- </P>
- <H2> Creating a GLAutoDrawable </H2>
- <P>
- Jogl provides two basic widgets into which OpenGL rendering can be
- performed. The GLCanvas is a heavyweight AWT widget which supports
- hardware acceleration and which is intended to be the primary widget
- used by applications. The GLJPanel is a fully Swing-compatible
- lightweight widget which supports hardware acceleration but which is
- not as fast as the GLCanvas because it typically reads back the frame
- buffer in order to draw it using Java2D. The GLJPanel is intended to
- provide 100% correct Swing integration in the circumstances where a
- GLCanvas can not be used. See <a href =
- "http://java.sun.com/products/jfc/tsc/articles/mixing/">this
- article</a> on <a href = "http://java.sun.com/products/jfc/tsc/">The
- Swing Connection</a> for more information about mixing lightweight and
- heavyweight widgets. See also the section on "Heavyweight and
- Lightweight Issues" below. Recent work in the Mustang release of the
- JDK has sped up the GLJPanel significantly when the Java2D OpenGL
- pipeline is enabled; see <a
- href="http://www.javagaming.org/forums/index.php?topic=10813.0">this
- forum discussion</a> for more details.
- </P>
- <P>
- Both the GLCanvas and GLJPanel implement a common interface called
- GLAutoDrawable so applications can switch between them with minimal
- code changes. The GLAutoDrawable interface provides
- <UL>
- <LI> access to the GL object for calling OpenGL routines
- <LI> a callback mechanism (GLEventListener) for performing OpenGL
- rendering
- <LI> a <CODE>display()</CODE> method for forcing OpenGL rendering to
- be performed synchronously
- <LI> AWT- and Swing-independent abstractions for getting and setting
- the size of the widget and adding and removing event listeners
- </UL>
- </P>
- <P>
- When creating GLCanvas and GLJPanel instances, the user may request a
- certain set of OpenGL parameters in the form of a GLCapabilities
- object, customize the format selection algorithm by specifying a
- GLCapabilitiesChooser, share textures and display lists with other
- GLDrawables, and specify the display device on which the
- GLAutoDrawable will be created (GLCanvas only).
- </P>
- <P>
- A GLCapabilities object specifies the OpenGL parameters for a
- newly-created widget, such as the color, alpha,, z-buffer and
- accumulation buffer bit depths and whether the widget is
- double-buffered. The default capabilities are loosely specified but
- provide for truecolor RGB, a reasonably large depth buffer,
- double-buffered, with no alpha, stencil, or accumulation buffers.
- </P>
- <P>
- An application can override the default pixel format selection
- algorithm by providing a GLCapabilitiesChooser to the GLCanvas or
- GLJPanel constructor. (Not all platforms support the
- GLCapabilitiesChooser mechanism, however; it may be ignored, in
- particular on Mac OS X where pixel format selection is very different
- than on other platforms.) The chooseCapabilities method will be called
- with all of the available pixel formats as an array of GLCapabilities
- objects, as well as the index indicating the window system's
- recommended choice; it should return an integer index into this
- array. The DefaultGLCapabilitiesChooser uses the window system's
- recommendation when it is available, and otherwise attempts to use a
- platform-independent selection algorithm.
- </P>
- <P>
- The GLJPanel can be made non-opaque according to Swing's rendering
- model, so it can act as an overlay to other Swing or Java2D drawing.
- In order to enable this, set up your GLCapabilities object with a
- non-zero alpha depth (a common value is 8 bits) and call
- setOpaque(false) on the GLJPanel once it has been created. Java2D
- rendering underneath it will then show through areas where OpenGL has
- produced an alpha value less than 1.0. See the JGears and JRefract
- demos for examples of how to use this functionality.
- </P>
- <H2> Writing a GLEventListener </H2>
- <P>
- Applications implement the GLEventListener interface to perform OpenGL
- drawing via callbacks. When the methods of the GLEventListener are
- called, the underlying OpenGL context associated with the drawable is
- already current. The listener fetches the GL object out of the
- GLAutoDrawable and begins to perform rendering.
- </P>
- <P>
- The <CODE>init()</CODE> method is called when a new OpenGL context is
- created for the given GLAutoDrawable. Any display lists or textures
- used during the application's normal rendering loop can be safely
- initialized in <CODE>init()</CODE>. It is important to note that
- because the underlying AWT window may be destroyed and recreated while
- using the same GLCanvas and GLEventListener, the GLEventListener's
- <CODE>init()</CODE> method may be called more than once during the
- lifetime of the application. The init() method should therefore be
- kept as short as possible and only contain the OpenGL initialization
- required for the <CODE>display()</CODE> method to run properly. It is
- the responsibility of the application to keep track of how its various
- OpenGL contexts share display lists, textures and other OpenGL objects
- so they can be either be reinitialized or so that reinitialization can
- be skipped when the <CODE>init()</CODE> callback is called.
- </P>
- <P>
- Note also that the GLEventListener should be added to the
- GLAutoDrawable before the GLAutoDrawable is shown or rendered to for
- the first time. If this is not done, it is possible that the init()
- method will not be called on the GLEventListener. JOGL does not
- maintain internal state to keep track of whether init() has been
- called on a particular GLEventListener since the last time an OpenGL
- context was created for that GLAutoDrawable.
- </P>
- <P>
- The <CODE>display()</CODE> method is called to perform per-frame
- rendering. The <CODE>reshape()</CODE> method is called when the
- drawable has been resized; the default implementation automatically
- resizes the OpenGL viewport so often it is not necessary to do any
- work in this method. The <CODE>displayChanged()</CODE> method is
- designed to allow applications to support on-the-fly screen mode
- switching, but support for this is not yet implemented so the body of
- this method should remain empty.
- </P>
- <P>
- It is strongly recommended that applications always refetch the GL
- object out of the GLAutoDrawable upon each call to the
- <CODE>init()</CODE>, <CODE>display()</CODE> and <CODE>reshape()</CODE>
- methods and pass the GL object down on the stack to any drawing
- routines, as opposed to storing the GL in a field and referencing it
- from there. The reason is that multithreading issues inherent to the
- AWT toolkit make it difficult to reason about which threads certain
- operations are occurring on, and if the GL object is stored in a field
- it is unfortunately too easy to accidentally make OpenGL calls from a
- thread that does not have a current context. This will usually cause
- the application to crash. For more information please see the section
- on multithreading.
- </P>
- <H2> Using the Composable Pipeline </H2>
- <P>
- Jogl supports the "composable pipeline" paradigm introduced by the
- Magician Java binding for OpenGL. The DebugGL pipeline calls
- <CODE>glGetError</CODE> after each OpenGL call, reporting any errors
- found. It can greatly speed up development time because of its
- fine-grained error checking as opposed to the manual error checking
- usually required in OpenGL programs written in C. The TraceGL prints
- logging information upon each OpenGL call and is helpful when an
- application crash makes it difficult to see where the error occurred.
- </P>
- <P>
- To use these pipelines, call <CODE>GLAutoDrawable.setGL</CODE> at the
- beginning of the <CODE>init</CODE> method in your GLEventListener. For
- example,
- <PRE>
- class MyListener implements GLEventListener {
- public void init(GLDrawable drawable) {
- drawable.setGL(new DebugGL(drawable.getGL()));
- // ...
- }
- // ...
- }
- </PRE>
- </P>
- <P>
- Note that the GLAutoDrawable.setGL() method simply calls setGL() on
- the default OpenGL context created by the GLAutoDrawable, so
- sophisticated applications creating their own OpenGL contexts can use
- the composable pipeline with these contexts by setting the GL object
- in the context object itself. The composable pipeline needs to be
- re-installed every time GLContext.makeCurrent() returns
- CONTEXT_CURRENT_NEW.
- </P>
- <H2> Heavyweight and Lightweight Issues </H2>
- <P>
- As mentioned above, JOGL supplies both a heavyweight (GLCanvas) and a
- lightweight (GLJPanel) widget to be able to provide the fastest
- possible performance for applications which need it as well as 100%
- correct Swing integration, again for applications which need it. The
- GLCanvas usually provides higher performance than the GLJPanel, though
- in recent releases the GLJPanel's speed has been improved when the
- Java2D/OpenGL pipeline is active as described in <a
- href="http://www.javagaming.org/forums/index.php?topic=10813.0">this
- forum discussion</a>. Nonetheless, the GLCanvas can be used in almost
- every kind of application except those using JInternalFrames. Please
- see the Swing Connection article mentioned above for details on mixing
- heavyweight and lightweight widgets. A couple of common pitfalls are
- described here.
- </P>
- <P>
- When using JPopupMenus or Swing tool tips in conjunction with the
- GLCanvas, it is necessary to disable the use of lightweight widgets
- for the popups. See the methods
- <CODE>ToolTipManager.setLightWeightPopupEnabled</CODE>,
- <CODE>JPopupMenu.setLightWeightPopupEnabled</CODE>, and
- <CODE>JPopupMenu.setDefaultLightWeightPopupEnabled</CODE>.
- </P>
- <P>
- There are occasionally problems with certain LayoutManagers and
- component configurations where if a GLCanvas is placed in the middle
- of a set of lightweight widgets then it may only grow and never
- shrink. These issues are documented somewhat in <a href =
- "https://jogl.dev.java.net/issues/show_bug.cgi?id=135">JOGL Issue
- 135</a> and most recently in the thread <a
- href="http://javagaming.org/forums/index.php?topic=8699.0">"Resize
- behaviour"</a> in the JOGL forum. The root cause is behavior of the
- Canvas, and in particular its ComponentPeer. The implementation of
- getPreferredSize() calls getMinimumSize() and getMinimumSize() turns
- around and calls Component.getSize(). This effectively means that the
- Canvas will report its preferred size as being as large as the
- component has ever been. For some layout managers this doesn't seem to
- matter, but for others like the BoxLayout it does. See the test case
- attached to Issue 135 for an example. Replacing the GLCanvas with an
- ordinary Canvas yields the same behavior.
- </P>
- <P>
- One suggestion was to override getPreferredSize() so that if a
- preferred size has not been set by the user, to default to (0,
- 0). This works fine for some test cases but breaks all of the other
- JOGL demos because they use a different LayoutManager. There appear to
- be a lot of interactions between heavyweight vs. lightweight widgets
- and layout managers. One experiment which was done was to override
- setSize() in GLCanvas to update the preferred size. This works down
- to the size specified by the user; if the window is resized any
- smeller the same problem appears. If reshape() (the base routine of
- setSize(), setBounds(), etc.) is changed to do the same thing, the
- demo breaks in the same way it originally did. Therefore this solution
- is fragile because it isn't clear which of these methods are used
- internally by the AWT and for what purposes.
- </P>
- <P>
- There are two possible solutions, both application-specific. The best
- and most portable appears to be to put the GLCanvas into a JPanel and
- set the JPanel's preferred size to (0, 0). The JPanel will cause this
- constraint to be enforced on its contained GLCanvas. The other
- workaround is to call <CODE>setPreferredSize(new Dimension(0,
- 0))</CODE> on a newly-created GLCanvas; this method is new in 1.5.
- </P>
- <P>
- Another issue that occasionally arises on Windows is flickering during
- live resizing of a GLCanvas. This is caused by the AWT's repainting
- the background of the Canvas and can not be overridden on a per-Canvas
- basis, for example when subclassing Canvas into GLCanvas. The
- repainting of the background of Canvases on Windows can be disabled by
- specifying the system property
- <CODE>-Dsun.awt.noerasebackground=true</CODE>. Whether to specify this
- flag depends on the application and should not be done universally,
- but instead on a case-by-case basis. Some more detail is in the thread
- <a href="http://javagaming.org/forums/index.php?topic=8770.0">"TIP:
- JOGL + Swing flicker"</a> in the JOGL forum.
- </P>
- <H2> Multithreading Issues </H2>
- <P>
- Jogl was designed to interoperate with the AWT, an inherently
- multithreaded GUI toolkit. OpenGL, in contrast, was originally
- designed in single-threaded C programming environments. For this
- reason Jogl provides a framework in which it is possible to write
- correct multithreaded OpenGL applications using the GLEventListener
- paradigm.
- </P>
- <P>
- If an application written using Jogl interacts in any way with the
- mouse or keyboard, the AWT is processing these events and the
- multithreaded aspects of the program must be considered.
- </P>
- <P>
- OpenGL applications usually behave in one of two ways: either they
- repaint only on demand, for example when mouse input comes in, or they
- repaint continually, regardless of whether user input is coming in. In
- the repaint-on-demand model, the application can merely call
- <CODE>GLAutoDrawable.display()</CODE> manually at the end of the mouse
- or keyboard listener to cause repainting to be done. Alternatively if
- the application knows the concrete type of the GLDrawable it can call
- repaint() to have the painting scheduled for a later time.
- </P>
- <P>
- In the continuous repaint model, the application typically has a main
- loop which is calling <CODE>GLAutoDrawable.display()</CODE>
- repeatedly, or is using the Animator class, which does this
- internally. In both of these cases the OpenGL rendering will be done
- on this thread rather than the internal AWT event queue thread which
- dispatches mouse and keyboard events.
- </P>
- <P>
- Both of these models (repaint-on-demand and repaint continually) still
- require the user to think about which thread keyboard and mouse events
- are coming in on, and which thread is performing the OpenGL rendering.
- OpenGL rendering <B>may not</B> occur directly inside the mouse or
- keyboard handlers, because the OpenGL context for the drawable is not
- current at this point (hence the warning about storing a GL object in
- a field, where it can be fetched and accidentally used by another
- thread). However, a mouse or keyboard listener may invoke
- <CODE>GLAutoDrawable.display()</CODE>.
- </P>
- <P>
- It is generally recommended that applications perform as little work
- as possible inside their mouse and keyboard handlers to keep the GUI
- responsive. However, since OpenGL commands can not be run from
- directly within the mouse or keyboard event listener, the best
- practice is to store off state when the listener is entered and
- retrieve this state during the next call to
- <CODE>GLEventListener.display()</CODE>.
- </P>
- <P>
- Furthermore, it is recommended that if there are long computational
- sequences in the GLEventListener's <CODE>display</CODE> method which
- reference variables which may be being simultaneously modified by the
- AWT thread (mouse and keyboard listeners) that copies of these
- variables be made upon entry to <CODE>display</CODE> and these copies
- be referenced throughout display() and the methods it calls. This will
- prevent the values from changing while the OpenGL rendering is being
- performed. Errors of this kind show up in many ways, including certain
- kinds of flickering of the rendered image as certain pieces of objects
- are rendered in one place and other pieces are rendered elsewhere in
- the scene. Restructuring the display() method as described has solved
- all instances of this kind of error that have been seen with Jogl to
- date.
- </P>
- <P>
- Prior to Jogl 1.1 b10, the Jogl library attempted to give applications
- strict control over which thread or threads performed OpenGL
- rendering. The <CODE>setRenderingThread()</CODE>,
- <CODE>setNoAutoRedrawMode()</CODE> and <CODE>display()</CODE> APIs
- were originally designed to allow the application to create its own
- animation thread and avoid OpenGL context switching on platforms that
- supported it. Unfortunately, serious stability issues caused by
- multithreading bugs in either vendors' OpenGL drivers or in the Java
- platform implementation have arisen on three of Jogl's major supported
- platforms: Windows, Linux and Mac OS X. In order to address these
- bugs, the threading model in Jogl 1.1 b10 and later has changed.
- </P>
- <P>
- All GLEventListener callbacks and other internal OpenGL context
- management are now performed on one thread. (In the current
- implementation, this thread is the AWT event queue thread, which is a
- thread internal to the implementation of the AWT and which is always
- present when the AWT is being used. Future versions of Jogl may change
- the thread on which the OpenGL work is performed.) When the
- <CODE>GLAutoDrawable.display()</CODE> method is called from user code,
- it now performs the work synchronously on the AWT event queue thread,
- even if the calling thread is a different thread. The
- <CODE>setRenderingThread()</CODE> optimization is now a no-op. The
- <CODE>setNoAutoRedrawMode()</CODE> API still works as previously
- advertised, though now that all work is done on the AWT event queue
- thread it no longer needs to be used in most cases. (It was previously
- useful for working around certain kinds of OpenGL driver bugs.)
- </P>
- <P>
- Most applications will not see a change in behavior from this change
- in the Jogl implementation. Applications which use thread-local
- storage or complex multithreading and synchronization may see a change
- in their control flow requiring code changes. While it is strongly
- recommended to change such applications to work under the new
- threading model, the old threading model can be used by specifying the
- system property <CODE>-Djogl.1thread=auto</CODE> or
- <CODE>-Djogl.1thread=false</CODE>. The "auto" setting is equivalent to
- the behavior in 1.1 b09 and before, where on ATI cards the
- single-threaded mode would be used. The "false' setting is equivalent
- to disabling the single-threaded mode. "true" is now the default
- setting.
- </P>
- <P>
- In the JSR-231 APIs the single-threaded behavior continues to be the
- default and the <CODE>setRenderingThread()</CODE> and
- <CODE>setNoAutoRedrawMode()</CODE> APIs have been removed. The public
- <CODE>Threading</CODE> class still provides some control over the
- internal use of threads in the library as well as external access to
- these mechanisms.
- </P>
- <H2> Pbuffers </H2>
- <P>
- Jogl exposes hardware-accelerated offscreen rendering (pbuffers) with
- a minimal and platform-agnostic API. Several recent demos have been
- successfully ported from C/C++ to Java using Jogl's pbuffer APIs.
- However, the pbuffer support in Jogl remains one of the more
- experimental aspects of the package and the APIs may need to change in
- the future.
- </P>
- <P>
- To create a pbuffer, call
- <CODE>GLDrawableFactory.createGLPbuffer()</CODE>. It is wise to call
- <CODE>GLDrawableFactory.canCreateGLPbuffer()</CODE> first to ensure
- the graphics card has pbuffer support first. The pbuffer is created
- immediately and is available for rendering as soon as
- <CODE>createGLPbuffer</CODE> returns.
- </P>
- <P>
- A pbuffer is used in conjunction with the GLEventListener mechanism by
- calling its display() method. Rendering, as always, occurs while the
- pbuffer's OpenGL context is current. There are render-to-texture
- options that can be specified in the GLCapabilities for the pbuffer
- which can make it easier to operate upon the resulting pixels. These
- APIs are however highly experimental and not yet implemented on all
- platforms.
- </P>
- <H2> GLU </H2>
- <P>
- Jogl contains support for the GLU (OpenGL Utility Library) version
- 1.3. Jogl originally supported GLU by wrapping the C version of the
- APIs, but over time, and thanks to the contributions of several
- individuals, it now uses a pure-Java version of SGI's GLU library. The
- pure Java port is enabled by default, and addresses stability issues
- on certain Linux distributions as well as the lack of native GLU 1.3
- support on the Windows platform. In case of problems with the Java
- port, the C version of the GLU library may be used by specifying the
- system property <CODE>-Djogl.glu.nojava</CODE> on the command
- line. All of the same functionality is exposed with both the Java and
- C versions of the GLU library; currently NURBS support is the only
- missing feature on both sides. If you run into problems with the Java
- port of the GLU library please file a bug using the Issue Tracker on
- the Jogl home page.
- </P>
- <P>
- To use the GLU, simply instantiate a GLU object via <CODE>new
- GLU()</CODE> at the beginning of your program. The methods on the GLU
- object may be called at any point when an OpenGL context is current.
- Because the GLU implementation is not thread-safe, one GLU object
- should be created for each GLEventListener or other entity performing
- OpenGL rendering in a given thread.
- </P>
- <H2> More Resources </H2>
- <P>
- The <A HREF="http://javagaming.org/forums/index.php?board=25.0">JOGL
- forum</A> on <A HREF="http://javagaming.org/">javagaming.org</A> is
- the best place to ask questions about the library. Many users, as well
- as the Jogl developers, read this forum frequently, and the archived
- threads contain a lot of useful information (which still needs to be
- distilled into documentation).
- </P>
- <P>
- The <A HREF="http://jogl-demos.dev.java.net/">JOGL demos</A> provide
- several examples of usage of the library.
- </P>
- <P>
- Pepijn Van Eeckhoudt, Kevin Duling and Abdul Bezrati have done <A
- HREF="http://pepijn.fab4.be/software/nehe-java-ports/">JOGL ports of
- many of the the NeHe demos</A>. These are small examples of various
- pieces of OpenGL functionality. See also the <A
- HREF="http://nehe.gamedev.net/">NeHe web site</A>.
- </P>
- <P>
- Pepijn also did a <A
- HREF="http://www.glexcess.com/files/glexcess.jar">JOGL port</a> of
- Paolo Martella's <A HREF="http://www.glexcess.com/">GLExcess</A>
- demo. To see the news update about this port, go to the main GLExcess
- site and scroll down.
- </P>
- <P>
- Gregory Pierce's <A
- HREF="http://javagaming.org/forums/index.php?topic=1474.0">introduction
- to JOGL</a> is a useful tutorial on starting to use the JOGL library.
- </P>
- <P>
- For release information about the JOGL library, please see the <A
- HREF="http://javagaming.org/forums/index.php?topic=1596.0">JOGL Release
- Information</A> thread on the JOGL forum on javagaming.org.
- </P>
- <P>
- Please post on the JOGL forum if you have a resource you'd like to add
- to this documentation.
- </P>
- <H2> Platform Notes </H2>
- <H3> All Platforms </H3>
- <P>
- The following issues, among others, are outstanding on all platforms:
- </P>
- <UL>
- <LI> A few remaining stability issues, mostly on older graphics cards.
- <LI> JOGL now supports experimental integration and interoperability
- with the Java2D/OpenGL pipeline in Java SE 6 (Mustang), enabling a
- much faster GLJPanel as well as other features. Please see <a
- href="http://www.javagaming.org/forums/index.php?topic=10813.0">this
- forum discussion</a> for more details.
- </UL>
- <H3> Windows </H3>
- <P>
- For correct operation, it is necessary to specify the system property
- <CODE>-Dsun.java2d.noddraw=true</CODE> when running JOGL applications
- on Windows; this system property disables the use of DirectDraw by
- Java2D. There are driver-level incompatibilities between DirectDraw
- and OpenGL which manifest themselves as application crashes, poor
- performance, bad flickering, and other artifacts. This poor behavior
- may exhibit itself when OpenGL and DirectDraw are simply used in the
- same application, not even just in the same window, so disabling
- Java2D's DirectDraw pipeline and forcing it to use its GDI pipeline is
- the only way to work around these issues. Java Web Start applications
- may set this system property by adding the following line to the
- <CODE><resources></CODE> section of the JNLP file: <PRE>
- <property name="sun.java2d.noddraw" value="true"/> </PRE>
- </P>
- <P>
- There is a serious memory leak in ATI's OpenGL drivers which is
- exhibited on Windows XP on Mobility Radeon 9700 hardware. It's
- possible it will be present on other hardware as well though it was
- not reproducible at the time of this writing on desktop Radeon
- hardware or older ATI mobile chips. The bug is documented in <A
- HREF="https://jogl.dev.java.net/issues/show_bug.cgi?id=166">JOGL Issue
- 166</A> and a bug has been filed with ATI. You can confirm the
- presence of the bug either with the test case in that bug report or by
- simply running the Gears demo; if the process size grows over time in
- the Task Manager, the memory leak is present on your hardware. For the
- time being, you can work around this memory leak by specifying the
- system property <CODE>-Djogl.GLContext.nofree</CODE> on the command
- line when launching your JOGL applications. There is no good
- general-purpose workaround for this bug which behaves well on all
- hardware.
- </P>
- <H3> Linux </H3>
- <P>
- The Sun JDK "compatibility" RPMs (java-1.5.0-sun-compat,
- java-1.6.0-sun-compat) provided by jpackage.org are incompatible with
- JOGL. These RPMs symlink an internal JDK directory to /usr/lib, which
- overrides how both NVidia and ATI currently provide their drivers to
- some Linux distributions, which is through an override in
- /etc/ld.so.conf (actually, in /etc/ld.so.conf.d). The implicit
- presence of /usr/lib on LD_LIBRARY_PATH forces the /usr/lib/libGL.so.1
- version of OpenGL to be used, which is typically Mesa and which will
- provide only software rendering.
- </P>
- <P>
- Unfortunately the JPackage maintainers have so far been unreceptive to
- changing their installation mechanism; see <a
- href="https://www.zarb.org/pipermail/jpackage-discuss/2007-January/010871.html">this
- mailing list posting</a>. Until this is resolved, we strongly
- discourage the use of the JPackage installers for the Sun JDK.
- Instead, download the JRE or JDK installers directly from Sun's
- website.
- </P>
- <P>
- Archived forum postings illustrating this problem are <a
- href="http://www.javagaming.org/forums/index.php?topic=15610.0">here</a>
- and <a
- href="http://www.javagaming.org/forums/index.php?topic=16105.0">here</a>.
- </P>
- <H3> Solaris, Linux (X11 platforms) </H3>
- <P>
- Support has been added to the JOGL library for allowing multiple
- threads to each have an OpenGL context current simultaneously, for
- example to implement multi-head CAVE-like environments. Normally a
- global AWT lock is held between calls to GLContext.makeCurrent() /
- release() for on-screen heavyweight contexts (for example, those
- associated with a Canvas or GLCanvas). We have found this to be
- necessary for stability purposes on all supported X11 platforms, even
- with relatively robust drivers such as those from NVidia.
- </P>
- <P>
- To enable multiple GLContexts to be made current simultaneously on X11
- platforms, specify the command line argument
- <CODE>-Djogl.GLContext.optimize</CODE> when starting the JVM. Note
- that this may incur robustness problems, in particular when resizing
- or moving windows. We have also found that ATI's proprietary drivers
- do not work at all with this flag, apparently because they cause GLX
- tokens to be sent to the X server for various GL calls even for direct
- contexts. For this reason if the GLX vendor is ATI then this flag
- currently has no effect.
- </P>
- <H3> Mac OS X </H3>
- <P>
- There are some problems with visual artifacts and stability problems
- with some of the Jogl demos on Mac OS X. It appears that at least some
- of these problems are due to bugs in Apple's OpenGL support. Bugs have
- been filed about these problems and it is hoped they will be addressed
- in the near future.
- </P>
- <P>
- The Mac OS X port of Jogl, in particular the GL interface and its
- implementation, can be used either with the provided GLCanvas widget
- or with the Cocoa NSOpenGLView. In order to use it with Cocoa the
- following steps should be taken:
- <UL>
- <LI> Create an "external" OpenGL context using the
- <CODE>GLDrawableFactory.createExternalGLContext()</CODE> API. The
- context object must be created while a real underlying OpenGL context
- is current.
- <LI> Fetch the GL instance out of the context using getGL() as usual.
- Only use the GL instance when the OpenGL context from the NSOpenGLView
- is current.
- </UL>
- <B>NOTE:</B> the Cocoa interoperability has not been retested
- recently, though similar interoperability has been tested on other
- platforms. Please report any problems found with using Jogl with an
- NSOpenGLView.
- </P>
- <P>
- The following issues remain with the Mac OS X port:
- <UL>
- <LI> Due to the mechanism by which the Cocoa graphics system selects
- OpenGL pixel formats, the GLCapabilitiesChooser mechanism can not be
- implemented on Mac OS X as on other platforms. Currently the
- underlying Cocoa pixel format selection is used on an
- NSOpenGLPixelFormat derived from the settings in the GLCapabilities,
- and the GLCapabilitiesChooser is ignored.
- </UL>
- </P>
- <H2> Version History </H2>
- <P>
- JOGL's version history can be found online in the <a
- href="http://javagaming.org/forums/index.php?topic=1596.0">"JOGL Release
- Information"</a> thread in the JOGL forum. Comments about the 1.1
- release train are in the thread <a
- href="http://javagaming.org/forums/index.php?topic=4217.0">"JOGL 1.1
- released"</a>.
- </BODY>
- </HTML>
|