JOGL Specification Overview
Preface
This specification, an optional set of packages, describes the Java(TM)
bindings to the native OpenGL(R) 3D graphics library profiles:
- OpenGL [ 1.0 .. 4.5 ], compatibility- and core profiles
- OpenGL ES [ 1.0 .. 3.2 ]
- EGL [ 1.0 .. 1.5 ]
Inclusion Criteria explains the OpenGL profile separation.
See OpenGL Runtime Requirements.
An implementation is available as
JOGL, a JogAmp module.
Other API bindings are available as JogAmp modules:
Dependencies
This binding has dependencies to the following:
OpenGL Profile Model
OpenGL today is not just a single set of functions, it offers many profiles for different
purposes, e.g. ES1, ES2 and ES3 for mobile, GL [ 3.1 .. 4.5 ] core for a programmable shader application, etc.
JOGL reflects these profiles with an OO abstraction model,
specifying interfaces encapsulating common subsets.
Package Structure
The packages defined by this specification include:
- The com.jogamp.opengl package
This package contains all Java bindings for all OpenGL profiles.
See Inclusion Criteria explaining the OpenGL profile seperation.
See OpenGL Runtime Requirements.
The main OpenGL profile interfaces are:
- {@link com.jogamp.opengl.GL2 com.jogamp.opengl.GL2} interface
This interface contains all OpenGL [ 1.0 .. 3.0 ] methods,
as well as most of it's extensions defined at the time of this specification.
OpenGL extensions whose functionality was incorporated into core OpenGL ≤ 3.0,
are subsumed into the core namespace.
See GL2 Inclusion Criteria.
See GL2 Runtime Requirements.
Future extensions will be added with a maintenance update
- {@link com.jogamp.opengl.GL3 com.jogamp.opengl.GL3} interface
This interface contains all OpenGL [ 3.1 .. 3.3 ] core methods,
as well as most of it's extensions defined at the time of this specification.
Note: OpenGL [ 3.1 .. 3.3 ] core profile does not includes fixed point functionality.
See GL3 Inclusion Criteria.
See GL3 Runtime Requirements.
Future extensions will be added with a maintenance update
- {@link com.jogamp.opengl.GL3bc com.jogamp.opengl.GL3bc} interface
This interface contains all OpenGL [ 3.1 .. 3.3 ] compatibility methods,
as well as most of it's extensions defined at the time of this specification.
Note: OpenGL [ 3.1 .. 3.3 ] compatibility profile does includes fixed point functionality.
Future extensions will be added with a maintenance update
- {@link com.jogamp.opengl.GL4 com.jogamp.opengl.GL4} interface
This interface contains all OpenGL [ 4.0 .. 4.5 ] core methods,
as well as most of it's extensions defined at the time of this specification.
Note: OpenGL [ 4.0 .. 4.5 ] core profile does not includes fixed point functionality.
Future extensions will be added with a maintenance update
- {@link com.jogamp.opengl.GL4bc com.jogamp.opengl.GL4bc} interface
This interface contains all OpenGL [ 4.0 .. 4.5 ] compatibility profile,
as well as most of it's extensions defined at the time of this specification.
Note: OpenGL [ 4.0 .. 4.5 ] compatibility profile does includes fixed point functionality.
Future extensions will be added with a maintenance update
- {@link com.jogamp.opengl.GLES1 com.jogamp.opengl.GLES1} interface
This interface contains all OpenGL ES [ 1.0 .. 1.1 ] methods,
as well as most of it's extensions defined at the time of this specification.
Future extensions will be added with a maintenance update
- {@link com.jogamp.opengl.GLES2 com.jogamp.opengl.GLES2} interface
This interface contains all OpenGL ES 2.0 methods,
as well as most of it's extensions defined at the time of this specification.
Future extensions will be added with a maintenance update
- {@link com.jogamp.opengl.GLES3 com.jogamp.opengl.GLES3} interface
This interface contains all OpenGL ES [ 3.0 .. 3.2 ] methods,
as well as most of it's extensions defined at the time of this specification.
Future extensions will be added with a maintenance update
Additionally the packages contains interfaces resembling intersecting common profiles.
These common profiles may be utilize for cross profile code supposed to either run
on desktop and mobile devices, or across GL profiles themselves:
- {@link com.jogamp.opengl.GLBase com.jogamp.opengl.GLBase} interface
Common interface containing the profile type identification and conversion methods.
Used to query which specialized profile class an instance of this object actually is and
offering a protocol to convert it to these types.
- {@link com.jogamp.opengl.GL com.jogamp.opengl.GL} interface
Common interface containing the subset of all profiles, GL4bc, GL4, GL3bc, GL3, GL2, GLES1, GLES2 and GLES3.
This interface reflects common data types, texture and framebuffer functionality.
- {@link com.jogamp.opengl.GL2ES1 com.jogamp.opengl.GL2ES1} interface
Interface containing the common subset of GL2 and GLES1.
This interface reflects the fixed functionality of OpenGL, without the immediate mode API.
- {@link com.jogamp.opengl.GL2ES2 com.jogamp.opengl.GL2ES2} interface
Interface containing the common subset of GL2 and GLES2. Interface is almost GLES2 complete.
This interface reflects the programmable shader functionality of desktop and embedded OpenGL up until GLES2.
- {@link com.jogamp.opengl.GL3ES3 com.jogamp.opengl.GL3ES3} interface
Interface containing the common subset of core GL3 and GLES3. Interface is almost GLES3 complete, lacking GL_ARB_ES3_compatibility
extension.
This interface reflects the programmable shader functionality of desktop and embedded OpenGL up until GLES3.
- {@link com.jogamp.opengl.GL4ES3 com.jogamp.opengl.GL4ES3} interface
Interface containing the common subset of core GL4 and GLES3. Interface is GLES3 complete w/o vendor extensions.
This interface reflects the programmable shader functionality of desktop and embedded OpenGL up until GLES3.
- {@link com.jogamp.opengl.GL2GL3 com.jogamp.opengl.GL2GL3} interface
Interface containing the common subset of core GL3 (OpenGL 3.1+) and GL2 (OpenGL 3.0),
also known as the OpenGL 3.0 forward compatible, non deprecated subset.
This interface reflects only the programmable shader functionality of desktop OpenGL
- The com.jogamp.opengl.glu package
This package contains bindings for the OpenGL Graphics System Utility (GLU)
Library version 1.3, inclusive, with the exception of the GLU NURBS routines
which are not exposed.
API Binding Conventions
The Java language bindings to the pre-existing C APIs in these packages
have been created using a consistent set of rules. Vendor-defined extensions
should make use of the same rules in order to provide a consistent developer
experience.
The rules for creating the Java language binding are described in the following
sections. These rules should be followed as closely as possible for all future
APIs that share the com.jogamp.opengl namespace.
Function Naming
Functions are named in the same way as in the C binding. That is, an OpenGL
API function glClear is bound to Java method GL.glClear. Although it would
be possible to drop the gl prefix (since it is redundant with the interface
name GL), the resulting code was deemed to look too foreign to experienced
OpenGL developers. For the same reason, we have also carried over all type
suffixes like 3f and 3fv from methods such as glColor3f and glColor3fv, respectively.
Extension suffixes, such as EXT, ARB, and vendor-specific suffixes, are
retained so as to match C conventions.
Mapping of Constants
Constants are named in the same way as in the C binding. For instance,
the OpenGL constant GL_RGB is bound to Java constant GL.GL_RGB.
Mapping of Primitive Types
All 8-bit integral types become byte, all 16-bit integral types become
short, and all 32-bit integral types become int. All 32-bit floating-point
types become float and all 64-bit floating-point types become double.
Integer return values that can only be GL_TRUE or GL_FALSE are mapped to
boolean.
Mapping of Pointer Arguments
OpenGL functions that take pointer arguments fall into several categories:
- Functions that take an untyped pointer argument for immediate use
- Functions that take a typed pointer argument for immediate use
- Functions that take an untyped pointer argument for deferred use
- Functions that take a typed pointer argument for deferred use
Functions that take an untyped (void*) pointer argument for immediate use
are given a single binding that takes a New I/O (NIO) Buffer object. The Buffer
may be of any type allowable by the function (and compatible with the other
arguments to the function) and may be direct or indirect. An example of
an OpenGL API in this category is glTexImage2D.
Functions that take a typed pointer (e.g., GLfloat *) argument for immediate
use are given two bindings. The first takes a Java primitive array with a
type that matches the C pointer type (i.e., GLfloat* maps to float[]). The
second takes a typed Buffer object (i.e., GLfloat* maps to FloatBuffer).
An example of an OpenGL API in this category is glColor3fv.
Functions that take an untyped (void*) pointer argument for deferred use
are given a single binding that takes a Buffer object. The Buffer may be of
any type allowable by the function (and compatible with the other arguments
to the function), but must be direct. That is, it may not have been created
from a Java primitive array using the wrap method. The functions that fall
into this category generally have names ending with the suffix "pointer."
An example of an OpenGL API in this category is glVertexPointer. Because these
functions do not consume the data located at the given pointer immediately,
but only at some unspecified later time, it is not possible to use a Java
primitive array whose memory location may change.
Functions that take a typed (e.g., GLfloat*) pointer argument for deferred
use are given a single binding that takes a typed Buffer object (i.e., GLfloat*
maps to FloatBuffer). The Buffer must be direct. That is, it may not have
been created from a Java primitive array using the wrap method. An example
of an OpenGL API in this category is glFeedbackBuffer.
Methods that read or write a specific number of values from an array or
Buffer argument do not read or write any subsequent elements of the array
or Buffer.
An outgoing C char* pointer, if representing a null-terminated, read-only
C string, maps to a Java String. An outgoing C char** pointer, if similarly
representing an array of read-only C strings, maps to a Java String[] (array
of String objects). All other char* pointers, including those representing
mutable C strings as used in some Get methods, are mapped to byte[] and ByteBuffer.
Index Parameter for Arrays
Each C method argument that is mapped to a primitive array in Java is actually
mapped to two separate parameters: the appropriate primitive array type in
Java and an integer offset parameter. The value of the integer offset is
the index which the method will start reading from within the array. Earlier
indices will be ignored. This mapping provides more congruity with existing
Java APIs and allows reuse of a single array across multiple Java method calls
by changing the index in much the same way that C pointers permit for C arrays.
Reduction of Method Explosions
Since there are two ways to expand a given C method pointer parameter,
it would be possible for C methods with multiple pointer arguments to expand
to many Java methods if one was to consider every possible combination of
mappings (the C method would expand to the number of pointer parameters to
the power of 2). In order to avoid an API explosion, we restrict a given
Java method to like kind mappings only. In other words, a given C method
with N typed pointer parameters for immediate use, where N >= 1, will map
to exactly two Java methods: One with all primitive arrays and one with all
Buffer types.
Also, methods that accept multiple Buffer arguments require all direct
or all non-direct Buffers. Direct and non-direct buffers should never be
mixed within an API call by an application.
Byte ordering of Buffers
When allocating a New I/O Buffer (in particular, a direct ByteBuffer) to
be passed to the APIs in these packages, it is essential to set the byte
ordering of the newly-allocated ByteBuffer to the native byte
ordering of the platform: e.g. ByteBuffer.allocateDirect(...).order(ByteOrder.nativeOrder());
.
The byte order of the ByteBuffer indicates how multi-byte values such as
int and float are stored in the Buffer either using methods like putInt and
putFloat or views such as IntBuffer or FloatBuffer. The Java bindings perform
no conversion or byte swapping on the outgoing data to OpenGL, and the native
OpenGL implementation expects data in the host CPU's byte order, so it is
essential to always match the byte order of the underlying platform when
filling Buffers with data.
Auto-slicing of Buffers
When a Buffer object is passed to an OpenGL function binding, the actual
pointer argument that is passed down to the OpenGL C implementation is equal
to the starting pointer of the Buffer data, plus an offset given by the Buffer.position()
function, multiplied by the data type size in bytes (1 for a ByteBuffer, 2
for a ShortBuffer, 4 for a IntBuffer or FloatBuffer, and 8 for DoubleBuffer).
The array offset given by Buffer<type>.arrayOffset() is also added
in the offset for wrapped arrays.
This feature is known as "auto-slicing," as it mimics the effect of calling
slice() on the Buffer object without the overhead of explicit object creation.
Errors and Exceptions
For performance reasons, OpenGL functions do not return error values directly.
Instead, applications must query for errors using functions such as glGetError.
This behavior is largely preserved in the Java language bindings, as described
below.
In the interest of efficiency, the Java API does not generally throw exceptions.
However, running an application with the DebugGL composable pipeline, which
is part of the API, will force an exception to be thrown at the point of failure.
Many errors are defined by OpenGL merely to set the error code, rather
than throwing an exception. For example, passing a bad enumerated parameter
value may result in the error flag being set to GL.GL_INVALID_VALUE. Attempting
to check for such errors in the binding layer would require either replicating
the error-checking logic of the underlying engine, or querying the error state
after every function. This would greatly impact performance by inhibiting
the ability of the hardware to pipeline work.
Security
Exception behavior is defined in cases that could otherwise lead to illegal
memory accesses in the underlying OpenGL engine. Implementations should take
necessary steps to prevent the GL from accessing or overwriting memory except
for properly allocated Buffers and array method arguments.
An implementation should take care to validate arguments correctly before
invoking native methods that could potentially access memory illegally. In
particular, methods that validate the contents of an array (such as a list
of GL attributes) or a Buffer should take precautions against exploits in
which a separate thread attempts to alter the contents of the argument during
the time interval following validation but preceding passage of the argument
to the underlying native engine.
Sharing of server-side OpenGL objects such as buffer objects, e.g. VBOs,
and textures among OpenGL contexts is supported in this specification.
See {@link com.jogamp.opengl.GLSharedContextSetter GLSharedContextSetter} interface
for details.
Criteria Used for Inclusion of APIs into the Java Bindings
OpenGL functions and OpenGL extensions have been included in the Java bindings
according the following rules:
- {@link com.jogamp.opengl.GL3 com.jogamp.opengl.GL3} interface
- All functions in core, forward compatible, OpenGL [ 3.1 - 3.3 ], inclusive, have been included,
as described in the header files
GL/glcorearb.h
.
- Reason for starting a new profile beginning with 3.1 are:
- OpenGL 3.1 requires a new native context, incompatible with prior versions.
- OpenGL 3.1 core profile drops fixed functionality.
- Forward compatibility, aka core, ie a context without
GL_ARB_compatibility
, is chosen because:
- It shares a common subset with ES2.x
- It is not guaranteed to be provided by all vendors.
- It is not guaranteed to be provided in future versions.
- OpenGL 3.2 core profile is compatible with OpenGL 3.1 forward compatible spec.
- OpenGL 3.2 Spec Appendix E.1: It is not possible to implement both core and compatibility profiles in a single GL context, ..
- {@link com.jogamp.opengl.GL2 com.jogamp.opengl.GL2} interface
- All functions in core OpenGL 3.0, inclusive, have been included.
- Reason for making the cut at OpenGL 3.0 are:
- Availability of 3.0 with the same native context.
- Availability of 3.0 via extensions.
- If the functionality of the OpenGL extension was subsumed into core
OpenGL by version 3.0, then the extension was dropped from the Java bindings.
However, if the core function name is not available in the native OpenGL implementation,
the extension named equivalent is used instead, e.g. GL_ARB_framebuffer_object.
- In general the native method name will be looked up as follows
- Try the interface name
- Try the extension name: ARB, EXT, ..
- Functions that deal with explicit pointer values in such a way that
they cannot be properly implemented in Java have been excluded. This
includes retrieval methods with a C void ** in the OpenGL signature like glGetBufferPointerv,
glGetPointerv, glGetVertexAttribPointerv, as well as functions that require
persistent pointer to pointer storage across function calls like vertex array
lists.
- If the extension is registered in the official OpenGL extension registry
but the specification was never completed or was discontinued (as indicated
in the specification and/or lack of inclusion in SGI's official OpenGL header
files), then the extension was not included. Using these criteria, ARB
extensions through number 42 (GL_ARB_pixel_buffer_object), inclusive, and
non-ARB extensions through number 311 (GL_REMEDY_string_marker), inclusive,
have been included in the Java bindings according to the numbering scheme
found in the official OpenGL extension registry.
- Some bindings to several vendor-specific extensions have been included
that are not found in the OpenGL extension registry. These extensions
were deemed popular enough and/or were specifically requested by users.
- Platform-specific extensions, such as those that begin with WGL, GLX,
CGL, etc., have been excluded from the public API. See the section "Accessing
platform-specific extensions" for more information about accessing these
functions on certain implementations.
OpenGL GLU API Inclusion Criteria
Bindings for all core GLU APIs have been included with the exception of
the GLU NURBS APIs. These APIs may be included in a future maintenance
release of the Java bindings.
OpenGL Extensions
Creating New Extensions
While the Java APIs for OpenGL extensions are unconditionally exposed, the
underlying functions may not be present. A program can query whether a potentially
unavailable function is actually available at runtime by using the method
GL.isFunctionAvailable.
Bindings for OpenGL extensions not covered in this specification may be
supplied by individual vendors or groups. Such bindings may be considered
for inclusion in a future version of this specification. In order to avoid fragmentation,
vendors creating extension bindings should expose new extensions using the
method GL.getExtension. This method is intended to provide a mechanism for
vendors who wish to provide access to new OpenGL extensions without changing
the public API of the core package.
Names for added extension methods and extension-defined constants and Java
bindings for C parameters should follow the guidelines set forth in this specification.
Accessing Platform-Specific Extensions
Platform-specific extensions such as those that begin with WGL, GLX, CGL,
etc. are not included in the API. Each implementation can choose to
export all, some, or none of these APIs via the GL.getPlatformGLExtensions
API which returns an Object whose underlying data type is specific to a given
implementation.
Therefore, any usage of these APIs is both platform and implementation specific.
An OpenGL ≥ 4.0 version is required to instantiate a GL4 context.
An OpenGL ≥ 3.1 version is required to instantiate a GL3 context.
Even though OpenGL extensions whose functionality was included into core
OpenGL by version 3.0, inclusive, are not included in the bindings, it should
be noted that OpenGL version 3.0 is not an absolute requirement on the runtime
system. This is because a user could query whether any particular function
is available before calling certain core APIs that might not be present.
Also, if the core function name is not available in the native OpenGL implementation,
the extension named equivalent is used instead, e.g. GL_ARB_framebuffer_object.
However, in general, it is reasonable to expect at least OpenGL 1.5 to be
installed on the runtime system and an implementor of the API is free to require
the presence of at least OpenGL 1.5 on the target system.
The JOGL reference implementation require at least OpenGL version 1.1,
due to it's dynamical function binding starting with OpenGL 1.2.
In future revisions of the API, this minimum standard may be raised.
An OpenGL ES ≥ 3.0 version is required to instantiate an ES3 context.
An OpenGL ES ≥ 2.0 version is required to instantiate an ES2 context.
An OpenGL ES [ 1.0 .. 1.1 ] version is required to instantiate an ES1 context.
Any Java Bindings for OpenGL implementation should include version information
in its jar manifest file. This information can then easily be accessed
at runtime via the java.lang.Package API. At least the following information
is included in the Reference Implementation jar file manifest: Specification
Title, Specification Vendor, Specification Version, Implementation Vendor,
and Implementation Version.
JOGL provides {@link com.jogamp.opengl.JoglVersion} implementing {@link com.jogamp.common.util.JogampVersion},
which provides users access to the specification and implementation version,
the build date and source code repository branch name and it's latest commit identifier.
New core APIs found in future versions of OpenGL, as well as new OpenGL
extensions, are expected to be added to the bindings and included into the
com.jogamp.opengl namespace via future maintenance updates to the API.
Related Links
Revision History
- Early Draft Review, October/November 2005
- Public Review, December/January 2005
- Proposed Final Draft Review, February/March 2006
- 1.0.0 Final Release, September 2006
- 1.1.0 Maintenance Release, April 2007
- 2.0.0 Maintenance Release, July 2009
- 2.0.1 Java Dependency Update to 1.5, February 2011
- 2.0.2 Major Release, July 18th 2013
- 2.3.0 Major Release, March 11th 2015