Textures in LWJGL

Hey im having some problems getting texture loading to work.
Im loading the texture data with bufferedImage.getData().getPixels(0,0, width,height,pixels);

How do i call glGenTextures when it takes (int,int)instead of (int,int[]), as in gl4Java?

What is the correct method for loading textures in LWJGL?

Thanks heaps! Harley :slight_smile:

everything in lwjgl not ordinary parameters like floats, int etc. are direct buffers of some kind, including write back parameters from GL.

So to make genTextures work, you’d have to do something like:


        ByteBuffer buf = ByteBuffer.allocateDirect(4);
        buf.order(ByteOrder.nativeOrder());
        IntBuffer int_buf = buf.asIntBuffer();
        GL.genTextures(1, Sys.getDirectBufferAddress(int_buf));
        if (int_buf.buffer().get(0) == 0)
               throw new RuntimeException("Could not allocate new texture id!");
        return int_buf.get(0);

Likewise, when you want to upload pixel data into a GL texture, it has to be in a buffer and given as an address to GL through Sys.getDirectBufferAddress(…).

It might seem overly complicated, but it really is a the fastest way to call GL, that is using explicit C pointers.

Sys.getDirectBufferAddress() returns the int pointer address of a direct buffer (DON’T use a non-direct buffer), and thats’ why for every gl function taking an array or simply a pointer, an int is taken by lwjgl.

Don’t scare yourself because of this, lwjgl is really a slick binding, and almost every user of it (I believe) simply encapsulates the behaviour in utility classes.

The lwjgl author also released spgl (also on sourceforge) that sits on top of lwjgl and exposes more friendly behaviour.

  • elias

Any thoughts on creating a single texture generating func ? such as gen1Texture()… so you don’t have to deal with the byte buffers if you don’t want to. But then again… why would you want only 1 texture?

I never saw the use for generating multiple texture handles at the same time. I always end up allocating them one after another - I see no use for consecutive texture handles.

Anyway, lwjgl is designed with simplicity and speed in mind. Therefore it’s easy to get the ā€œtalking to a device driverā€ feeling with it, but that’s intentional. lwjgl makes no attempt to be user friendly if that would make the layer between e.g. opengl and you any thicker. And that’s why lwjgl will never include utility/helper functions like the one you mentioned. The Shaven Puppy Game Library by the same author is built ont top of lwjgl and tries to do just that.

  • elias
  • elias

true… but there are cases such as this where it is just more efficient to do it JNI


GLuint texture;
glGenTextures(1, &texture);
return (jint) texture;

as opposed to the 4 byte, bytebuffer that would have to be generated then disposed of for the same effect within java.

  • Tristan

Nah, the utility class just holds one reference to a static ā€˜result’ buffer, and never release it.

  • elias