Due to many confusions w/ texture usage, following list described the order and semantics of texture unit selection, binding and enabling.
gl.glActiveTexture(GL.GL_TEXTURE0 + textureUnit), 0 is default.textureId -> active textureUnit's textureTarget via gl.glBindTexture(textureTarget, textureId)textureUnit's textureTarget via glEnable(textureTarget).
textureUnit in your shader program, enable shader program.Non-power-of-two restrictions
When creating an OpenGL texture object, the Texture class will
attempt to use non-power-of-two textures (NPOT) if available, see GL#isNPOTTextureAvailable().
Further more,
GL_ARB_texture_rectangle
(RECT) will be attempted on OSX w/ ATI drivers.
If NPOT is not available or RECT not chosen, the Texture class will simply upload a non-pow2-sized
image into a standard pow2-sized texture (without any special
scaling).
Since the choice of extension (or whether one is used at
all) depends on the user's machine configuration, developers are
recommended to use getImageTexCoords and getSubImageTexCoords, as those methods will calculate the
appropriate texture coordinates for the situation.
One caveat in this approach is that certain texture wrap modes
(e.g. GL_REPEAT) are not legal when the GL_ARB_texture_rectangle
extension is in use. Another issue to be aware of is that in the
default pow2 scenario, if the original image does not have pow2
dimensions, then wrapping may not work as one might expect since
the image does not extend to the edges of the pow2 texture. If
texture wrapping is important, it is recommended to use only
pow2-sized images with the Texture class.
Performance Tips
For best performance, try to avoid calling enable /
bind / disable any more than necessary. For
example, applications using many Texture objects in the same scene
may want to reduce the number of calls to both enable and
disable. To do this it is necessary to call getTarget to make sure the OpenGL texture target is the same for
all of the Texture objects in use; non-power-of-two textures using
the GL_ARB_texture_rectangle extension use a different target than
power-of-two textures using the GL_TEXTURE_2D target. Note that
when switching between textures it is necessary to call bind, but when drawing many triangles all using the same texture,
for best performance only one call to bind should be made.
User may also utilize multiple texture units,
see order of texture commands above.
Alpha premultiplication and blending
Disclaimer: Consider performing alpha premultiplication in shader code, if really desired! Otherwise use RGBA.
The Texture class does not convert RGBA image data into premultiplied data when storing it into an OpenGL texture.
The mathematically correct way to perform blending in OpenGL with the SrcOver "source over destination" mode, or any other Porter-Duff rule, is to use premultiplied color components, which means the R/G/ B color components must have been multiplied by the alpha value. If using premultiplied color components it is important to use the correct blending function; for example, the SrcOver rule is expressed as:
gl.glBlendFunc(GL.GL_ONE, GL.GL_ONE_MINUS_SRC_ALPHA);
Also, when using a texture function like GL_MODULATE where
the current color plays a role, it is important to remember to make
sure that the color is specified in a premultiplied form, for
example:
float a = ...;
float r = r * a;
float g = g * a;
float b = b * a;
gl.glColor4f(r, g, b, a);
For reference, here is a list of the Porter-Duff compositing rules
and the associated OpenGL blend functions (source and destination
factors) to use in the face of premultiplied alpha:
| Rule | Source | Dest |
| Clear | GL_ZERO | GL_ZERO |
| Src | GL_ONE | GL_ZERO |
| SrcOver | GL_ONE | GL_ONE_MINUS_SRC_ALPHA |
| DstOver | GL_ONE_MINUS_DST_ALPHA | GL_ONE |
| SrcIn | GL_DST_ALPHA | GL_ZERO |
| DstIn | GL_ZERO | GL_SRC_ALPHA |
| SrcOut | GL_ONE_MINUS_DST_ALPHA | GL_ZERO |
| DstOut | GL_ZERO | GL_ONE_MINUS_SRC_ALPHA |
| Dst | GL_ZERO | GL_ONE |
| SrcAtop | GL_DST_ALPHA | GL_ONE_MINUS_SRC_ALPHA |
| DstAtop | GL_ONE_MINUS_DST_ALPHA | GL_SRC_ALPHA |
| AlphaXor | GL_ONE_MINUS_DST_ALPHA | GL_ONE_MINUS_SRC_ALPHA |
| Modifier and Type | Field and Description |
|---|---|
| private float | aspectRatio
The original aspect ratio of the image, before any rescaling that might have occurred due to using the GLU mipmap routines. |
| private TextureCoords | coords
The texture coordinates corresponding to the entire image. |
| private static final boolean | |
| private static final boolean | |
| private static final boolean | |
| private int | estimatedMemorySize
An estimate of the amount of texture memory this texture consumes. |
| private int | imageTarget
The image GL target type for this texture, or its sub-components if cubemap. |
| private int | imgHeight
The height of the image. |
| private int | imgWidth
The width of the image. |
| private boolean | mustFlipVertically
Indicates whether the TextureData requires a vertical flip of the texture coords. |
| private int | target
The GL target type for this texture. |
| private int | texHeight
The height of the texture. |
| private int | texID
The GL texture ID. |
| private int | texWidth
The width of the texture. |
| private boolean | usingAutoMipmapGeneration
Indicates whether we're using automatic mipmap generation support (GL_GENERATE_MIPMAP). |
| private static final boolean |
| Access | Constructor and Description |
|---|---|
| public | |
| public | Texture(final int
the OpenGL texture target, eg GL.GL_TEXTURE_2D,
GL2.GL_TEXTURE_RECTANGLE target)Constructor for use when creating e.g. cube maps, where there is no initial texture data |
| public | Texture(final int
the OpenGL texture object to wrap textureID, final int the OpenGL texture target, eg GL.GL_TEXTURE_2D,
GL2.GL_TEXTURE_RECTANGLE target, final int the width of the texture in pixels texWidth, final int the height of the texture in pixels texHeight, final int the width of the image within the texture in
pixels (if the content is a sub-rectangle in the upper
left corner); otherwise, pass in texWidth imgWidth, final int the height of the image within the texture in
pixels (if the content is a sub-rectangle in the upper
left corner); otherwise, pass in texHeight imgHeight, final boolean indicates whether the texture
coordinates must be flipped vertically
in order to properly display the
texture mustFlipVertically)Constructor to wrap an OpenGL texture ID from an external library and allows some of the base methods from the Texture class, such as binding and querying of texture coordinates, to be used with it. |
| Modifier and Type | Method and Description |
|---|---|
| public void | |
| private void | |
| public void | |
| public void | |
| public void | |
| public float | getAspectRatio()
Returns the original aspect ratio of the image, defined as (image width) / (image height), before any scaling that might have occurred as a result of using the GLU mipmap routines. |
| public int | getEstimatedMemorySize()
Returns an estimate of the amount of texture memory in bytes this Texture consumes. |
| public int | Returns: the height of the textureReturns the height of the allocated OpenGL texture in pixels. |
| public int | Returns: the height of the imageReturns the height of the image contained within this texture. |
| public int | getImageTarget()
Returns the image OpenGL "target" of this texture, or its sub-components if cubemap. |
| public TextureCoords | Returns: the texture coordinates corresponding to the entire imageReturns the set of texture coordinates corresponding to the entire image. |
| public int | Returns: the width of the imageReturns the width of the image contained within this texture. |
| public boolean | getMustFlipVertically()
Indicates whether this texture's texture coordinates must be flipped vertically in order to properly display the texture. |
| public TextureCoords | Returns: the texture coordinates corresponding to the specified sub-imageReturns the set of texture coordinates corresponding to the specified sub-image. |
| public int | |
| public int | getTextureObject(final GL
required to be valid and current in case the texture object has not been generated yet,
otherwise it may be gl)null.Returns the underlying OpenGL texture object for this texture and generates it if not done yet. |
| public int | getTextureObject()
Returns the underlying OpenGL texture object for this texture,
maybe |
| public int | Returns: the width of the textureReturns the width of the allocated OpenGL texture in pixels. |
| private static boolean | |
| private static boolean | |
| private static boolean | Returns: true if the given value is a power of two, false otherwiseReturns true if the given value is a power of two. |
| public boolean | isUsingAutoMipmapGeneration()
Indicates whether this Texture is using automatic mipmap generation (via the OpenGL texture parameter GL_GENERATE_MIPMAP). |
| private static int | Returns: the next power of twothe value val)Returns the nearest power of two that is larger than the given value. |
| private static boolean | |
| public void | setMustFlipVertically(final boolean v)
Change whether the TextureData requires a vertical flip of the texture coords. |
| public void | setTexParameterf(final GL gl, final int parameterName, final float value)
Sets the OpenGL floating-point texture parameter for the texture's target. |
| public void | setTexParameterfv(final GL gl, final int parameterName, final FloatBuffer params)
Sets the OpenGL multi-floating-point texture parameter for the texture's target. |
| public void | setTexParameterfv(final GL gl, final int parameterName, final float[] params, final int params_offset)
Sets the OpenGL multi-floating-point texture parameter for the texture's target. |
| public void | setTexParameteri(final GL gl, final int parameterName, final int value)
Sets the OpenGL integer texture parameter for the texture's target. |
| public void | setTexParameteriv(final GL gl, final int parameterName, final IntBuffer params)
Sets the OpenGL multi-integer texture parameter for the texture's target. |
| public void | setTexParameteriv(final GL gl, final int parameterName, final int[] params, final int params_offset)
Sets the OpenGL multi-integer texture parameter for the texture's target. |
| public String | |
| public void | |
| public void | updateImage(final GL gl, final TextureData data, final int targetOverride)
Updates the content area incl. |
| public void | updateSubImage(final GL gl, final TextureData
the image data to be uploaded to this texture data, final int the mipmap level of the texture to set. If
this is non-zero and the TextureData contains mipmap data, the
appropriate mipmap level will be selected. mipmapLevel, final int the x offset (in pixels) relative to the lower-left corner
of this texture x, final int the y offset (in pixels) relative to the lower-left corner
of this texture y)Updates a subregion of the content area of this texture using the given data. |
| public void | updateSubImage(final GL gl, final TextureData
the image data to be uploaded to this texture data, final int the mipmap level of the texture to set. If
this is non-zero and the TextureData contains mipmap data, the
appropriate mipmap level will be selected. mipmapLevel, final int the x offset (in pixels) relative to the lower-left corner
of this texture where the update will be applied dstx, final int the y offset (in pixels) relative to the lower-left corner
of this texture where the update will be applied dsty, final int the x offset (in pixels) relative to the lower-left corner
of the supplied TextureData from which to fetch the update rectangle srcx, final int the y offset (in pixels) relative to the lower-left corner
of the supplied TextureData from which to fetch the update rectangle srcy, final int the width (in pixels) of the rectangle to be updated width, final int the height (in pixels) of the rectangle to be updated height)Updates a subregion of the content area of this texture using the specified sub-region of the given data. |
| private void | updateSubImageImpl(final GL gl, final TextureData data, final int newTarget, final int mipmapLevel, int dstx, int dsty, int srcx, int srcy, int width, int height)
|
| private void | |
| private boolean |
| aspectRatio | back to summary |
|---|---|
| private float aspectRatio The original aspect ratio of the image, before any rescaling that might have occurred due to using the GLU mipmap routines. | |
| coords | back to summary |
|---|---|
| private TextureCoords coords The texture coordinates corresponding to the entire image. | |
| DEBUG | back to summary |
|---|---|
| private static final boolean DEBUG | |
| disableNPOT | back to summary |
|---|---|
| private static final boolean disableNPOT | |
| disableTexRect | back to summary |
|---|---|
| private static final boolean disableTexRect | |
| estimatedMemorySize | back to summary |
|---|---|
| private int estimatedMemorySize An estimate of the amount of texture memory this texture consumes. | |
| imageTarget | back to summary |
|---|---|
| private int imageTarget The image GL target type for this texture, or its sub-components if cubemap. | |
| imgHeight | back to summary |
|---|---|
| private int imgHeight The height of the image. | |
| imgWidth | back to summary |
|---|---|
| private int imgWidth The width of the image. | |
| mustFlipVertically | back to summary |
|---|---|
| private boolean mustFlipVertically Indicates whether the TextureData requires a vertical flip of the texture coords. | |
| target | back to summary |
|---|---|
| private int target The GL target type for this texture. | |
| texHeight | back to summary |
|---|---|
| private int texHeight The height of the texture. | |
| texID | back to summary |
|---|---|
| private int texID The GL texture ID. | |
| texWidth | back to summary |
|---|---|
| private int texWidth The width of the texture. | |
| usingAutoMipmapGeneration | back to summary |
|---|---|
| private boolean usingAutoMipmapGeneration Indicates whether we're using automatic mipmap generation support (GL_GENERATE_MIPMAP). | |
| VERBOSE | back to summary |
|---|---|
| private static final boolean VERBOSE | |
| Texture | back to summary |
|---|---|
| public Texture(final GL gl, final TextureData data) throws GLException | |
| Texture | back to summary |
|---|---|
| public Texture(final int target) Constructor for use when creating e.g. cube maps, where there is no initial texture data
| |
| Texture | back to summary |
|---|---|
| public Texture(final int textureID, final int target, final int texWidth, final int texHeight, final int imgWidth, final int imgHeight, final boolean mustFlipVertically) Constructor to wrap an OpenGL texture ID from an external library and allows some of the base methods from the Texture class, such as binding and querying of texture coordinates, to be used with it. Attempts to update such textures' contents will yield undefined results.
| |
| bind | back to summary |
|---|---|
| public void bind(final GL gl) throws GLException Binds this texture to the given GL context. This method is a shorthand equivalent of the following OpenGL code:
gl.glBindTexture(texture.getTarget(), texture.getTextureObject());
See the performance tips above for hints
on how to maximize performance when using many Texture objects.
| |
| checkCompressedTextureExtensions | back to summary |
|---|---|
| private void checkCompressedTextureExtensions(final GL gl, final TextureData data) | |
| destroy | back to summary |
|---|---|
| public void destroy(final GL gl) throws GLException Destroys the native resources used by this texture object.
| |
| disable | back to summary |
|---|---|
| public void disable(final GL gl) throws GLException Disables this texture's target (e.g., GL_TEXTURE_2D) in the given GL state. This method is a shorthand equivalent of the following OpenGL code: gl.glDisable(texture.getTarget());
Call is ignored if the See the performance tips above for hints on how to maximize performance when using many Texture objects.
| |
| enable | back to summary |
|---|---|
| public void enable(final GL gl) throws GLException Enables this texture's target (e.g., GL_TEXTURE_2D) in the given GL context's state. This method is a shorthand equivalent of the following OpenGL code: gl.glEnable(texture.getTarget());
Call is ignored if the See the performance tips above for hints on how to maximize performance when using many Texture objects.
| |
| getAspectRatio | back to summary |
|---|---|
| public float getAspectRatio() Returns the original aspect ratio of the image, defined as (image width) / (image height), before any scaling that might have occurred as a result of using the GLU mipmap routines. | |
| getEstimatedMemorySize | back to summary |
|---|---|
| public int getEstimatedMemorySize() Returns an estimate of the amount of texture memory in bytes this Texture consumes. It should only be treated as an estimate; most applications should not need to query this but instead let the OpenGL implementation page textures in and out as necessary. | |
| getHeight | back to summary |
|---|---|
| public int getHeight() Returns the height of the allocated OpenGL texture in pixels. Note that the texture height will be greater than or equal to the height of the image contained within.
| |
| getImageHeight | back to summary |
|---|---|
| public int getImageHeight() Returns the height of the image contained within this texture.
Note that for non-power-of-two textures in particular this may
not be equal to the result of
| |
| getImageTarget | back to summary |
|---|---|
| public int getImageTarget() Returns the image OpenGL "target" of this texture, or its sub-components if cubemap. | |
| getImageTexCoords | back to summary |
|---|---|
| public TextureCoords getImageTexCoords() Returns the set of texture coordinates corresponding to the entire image. If the TextureData indicated that the texture coordinates must be flipped vertically, the returned TextureCoords will take that into account.
| |
| getImageWidth | back to summary |
|---|---|
| public int getImageWidth() Returns the width of the image contained within this texture.
Note that for non-power-of-two textures in particular this may
not be equal to the result of
| |
| getMustFlipVertically | back to summary |
|---|---|
| public boolean getMustFlipVertically() Indicates whether this texture's texture coordinates must be
flipped vertically in order to properly display the texture. This
is handled automatically by | |
| getSubImageTexCoords | back to summary |
|---|---|
| public TextureCoords getSubImageTexCoords(final int x1, final int y1, final int x2, final int y2) Returns the set of texture coordinates corresponding to the specified sub-image. The (x1, y1) and (x2, y2) points are specified in terms of pixels starting from the lower-left of the image. (x1, y1) should specify the lower-left corner of the sub-image and (x2, y2) the upper-right corner of the sub-image. If the TextureData indicated that the texture coordinates must be flipped vertically, the returned TextureCoords will take that into account; this should not be handled by the end user in the specification of the y1 and y2 coordinates.
| |
| getTarget | back to summary |
|---|---|
| public int getTarget() Returns the OpenGL "target" of this texture. | |
| getTextureObject | back to summary |
|---|---|
| public int getTextureObject(final GL gl) Returns the underlying OpenGL texture object for this texture and generates it if not done yet. Most applications will not need to access this, since it is handled automatically by the bind(GL) and destroy(GL) APIs.
| |
| getTextureObject | back to summary |
|---|---|
| public int getTextureObject() Returns the underlying OpenGL texture object for this texture,
maybe Most applications will not need to access this, since it is handled automatically by the bind(GL) and destroy(GL) APIs.
| |
| getWidth | back to summary |
|---|---|
| public int getWidth() Returns the width of the allocated OpenGL texture in pixels. Note that the texture width will be greater than or equal to the width of the image contained within.
| |
| haveNPOT | back to summary |
|---|---|
| private static boolean haveNPOT(final GL gl) | |
| haveTexRect | back to summary |
|---|---|
| private static boolean haveTexRect(final GL gl) | |
| isPowerOfTwo | back to summary |
|---|---|
| private static boolean isPowerOfTwo(final int val) Returns true if the given value is a power of two.
| |
| isUsingAutoMipmapGeneration | back to summary |
|---|---|
| public boolean isUsingAutoMipmapGeneration() Indicates whether this Texture is using automatic mipmap generation (via the OpenGL texture parameter GL_GENERATE_MIPMAP). This will automatically be used when mipmapping is requested via the TextureData and either OpenGL 1.4 or the GL_SGIS_generate_mipmap extension is available. If so, updates to the base image (mipmap level 0) will automatically propagate down to the lower mipmap levels. Manual updates of the mipmap data at these lower levels will be ignored. | |
| nextPowerOfTwo | back to summary |
|---|---|
| private static int nextPowerOfTwo(final int val) Returns the nearest power of two that is larger than the given value. If the given value is already a power of two, this method will simply return that value.
| |
| preferTexRect | back to summary |
|---|---|
| private static boolean preferTexRect(final GL gl) | |
| setMustFlipVertically | back to summary |
|---|---|
| public void setMustFlipVertically(final boolean v) Change whether the TextureData requires a vertical flip of the texture coords.
No-op if no change, otherwise generates new | |
| setTexParameterf | back to summary |
|---|---|
| public void setTexParameterf(final GL gl, final int parameterName, final float value) Sets the OpenGL floating-point texture parameter for the texture's target. This gives control over parameters such as GL_TEXTURE_MAX_ANISOTROPY_EXT. Causes this texture to be bound to the current texture state.
| |
| setTexParameterfv | back to summary |
|---|---|
| public void setTexParameterfv(final GL gl, final int parameterName, final FloatBuffer params) Sets the OpenGL multi-floating-point texture parameter for the texture's target. Causes this texture to be bound to the current texture state.
| |
| setTexParameterfv | back to summary |
|---|---|
| public void setTexParameterfv(final GL gl, final int parameterName, final float[] params, final int params_offset) Sets the OpenGL multi-floating-point texture parameter for the texture's target. Causes this texture to be bound to the current texture state.
| |
| setTexParameteri | back to summary |
|---|---|
| public void setTexParameteri(final GL gl, final int parameterName, final int value) Sets the OpenGL integer texture parameter for the texture's target. This gives control over parameters such as GL_TEXTURE_WRAP_S and GL_TEXTURE_WRAP_T, which by default are set to GL_CLAMP_TO_EDGE if OpenGL 1.2 is supported on the current platform and GL_CLAMP if not. Causes this texture to be bound to the current texture state.
| |
| setTexParameteriv | back to summary |
|---|---|
| public void setTexParameteriv(final GL gl, final int parameterName, final IntBuffer params) Sets the OpenGL multi-integer texture parameter for the texture's target. Causes this texture to be bound to the current texture state.
| |
| setTexParameteriv | back to summary |
|---|---|
| public void setTexParameteriv(final GL gl, final int parameterName, final int[] params, final int params_offset) Sets the OpenGL multi-integer texture parameter for the texture's target. Causes this texture to be bound to the current texture state.
| |
| toString | back to summary |
|---|---|
| public String toString() Overrides java. Doc from java. Returns a string representation of the object. | |
| updateImage | back to summary |
|---|---|
| public void updateImage(final GL gl, final TextureData data) throws GLException Updates the entire content area incl.
| |
| updateImage | back to summary |
|---|---|
| public void updateImage(final GL gl, final TextureData data, final int targetOverride) throws GLException Updates the content area incl.
| |
| updateSubImage | back to summary |
|---|---|
| public void updateSubImage(final GL gl, final TextureData data, final int mipmapLevel, final int x, final int y) throws GLException Updates a subregion of the content area of this texture using the
given data. If automatic mipmap generation is in use (see
| |
| updateSubImage | back to summary |
|---|---|
| public void updateSubImage(final GL gl, final TextureData data, final int mipmapLevel, final int dstx, final int dsty, final int srcx, final int srcy, final int width, final int height) throws GLException Updates a subregion of the content area of this texture using the
specified sub-region of the given data. If automatic mipmap
generation is in use (see
| |
| updateSubImageImpl | back to summary |
|---|---|
| private void updateSubImageImpl(final GL gl, final TextureData data, final int newTarget, final int mipmapLevel, int dstx, int dsty, int srcx, int srcy, int width, int height) throws GLException | |
| updateTexCoords | back to summary |
|---|---|
| private void updateTexCoords() | |
| validateTexID | back to summary |
|---|---|
| private boolean validateTexID(final GL gl, final boolean throwException) | |