diff options
Diffstat (limited to 'doc/userguide/index.html')
-rw-r--r-- | doc/userguide/index.html | 1016 |
1 files changed, 1016 insertions, 0 deletions
diff --git a/doc/userguide/index.html b/doc/userguide/index.html new file mode 100644 index 000000000..aa0645bf9 --- /dev/null +++ b/doc/userguide/index.html @@ -0,0 +1,1016 @@ +<!DOCTYPE html PUBliC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <link href="../../../style.css" rel="stylesheet" type="text/css"/> + <title>JOGL Userguide</title> + </head> + <body> + <div id="container"> + <div id="header"> + <div id="slogan">JOGL Userguide</div> + <div id="logo"><a href="http://jogamp.org/">JOGL Userguide</a></div> + </div> + <div id="menu"> + <ul> + <li><a href="http://jogamp.org/">Home</a></li> + <li><a href="../../../gluegen/www/">Gluegen</a></li> + <li><a href="../../../joal/www/">JOAL</a></li> + <li><a href="../../../jocl/www/">JOCL</a></li> + <li><a href="../../../jogl/www/">JOGL</a></li> + <li><a href="../../../demos/www/">Demos</a></li> + <li><a href="../../../wiki/">Wiki</a></li> + <li><a href="../../../deployment/jogl-next/javadoc_public/">JavaDoc</a></li> + </ul> + </div> + <div id="main"> + <div id="text" class="fill"> + <h2><font color="red">WARNING: This document has not been updated for a long time.</font></h2> + <br/> + <br/> +<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://kenai.com/projects/gluegen/pages/Home/">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="http://download.java.net/media/jogl/builds/archive/">release build</a>. +Separate instructions are available on how to +<a href="http://download.java.net/media/jogl/doc/HowToBuild.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.all.jar, +nativewindow.all.jar, gluegen-rt.jar, and optionally newt.all.jar; for +example, +".;C:\Some\Other\Package\foo.jar;C:\Users\myhome\jogl-[version]-windows-i586\lib\jogl.all.jar;C:\Users\myhome\jogl-[version]-windows-i586\lib\nativewindow.all.jar;C:\Users\myhome\jogl-[version]-windows-i586\lib\gluegen-rt.jar;C:\Users\myhome\jogl-[version]-windows-i586\lib\newt.all.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> + +Note that the per-platform zip archives contain many more jar files +than just the three or four mentioned above. The additional jars +illustrate how JOGL may be partitioned to achieve a smaller deployment +size, in particular on smaller devices. + +</P> +<P> + +Dropping the JOGL jars and native libraries into the extension +directory of the JRE is <b>strongly discouraged</b>. Doing so will +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> + +Please read <a href="../deployment/JOGL-DEPLOYMENT.html">JOGL Deployment</a>. + +<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.jogamp.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://download.java.net/media/jogl/demos/www/">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>. + + + </div> + </div> + <div id="footer"> + <div id="footer_left"> + <span xmlns:dc="http://purl.org/dc/elements/1.1/" property="dc:title">JogAmp.org</span> + by <a xmlns:cc="http://creativecommons.org/ns#" href="http://jogamp.org" property="cc:attributionName" rel="cc:attributionURL">http://jogamp.org</a> + is licensed under a <br/> + <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 License</a>. + </div> + </div> + </div> + </body> +</html> |