LWJGL - Mixing 2D and 3D
- by nathan
I'm trying to mix 2D and 3D using LWJGL.
I have wrote 2D little method that allow me to easily switch between 2D and 3D.
protected static void make2D() {
glEnable(GL_BLEND);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
glOrtho(0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 0.0f, 1.0f);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
}
protected static void make3D() {
glDisable(GL_BLEND);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity(); // Reset The Projection Matrix
GLU.gluPerspective(45.0f, ((float) SCREEN_WIDTH / (float) SCREEN_HEIGHT), 0.1f, 100.0f); // Calculate The Aspect Ratio Of The Window
GL11.glMatrixMode(GL11.GL_MODELVIEW);
glLoadIdentity();
}
The in my rendering code i would do something like:
make2D();
//draw 2D stuffs here
make3D();
//draw 3D stuffs here
What i'm trying to do is to draw a 3D shape (in my case a quad) and i 2D image. I found this example and i took the code from TextureLoader, Texture and Sprite to load and render a 2D image.
Here is how i load the image.
TextureLoader loader = new TextureLoader();
Sprite s = new Sprite(loader, "player.png")
And how i render it:
make2D();
s.draw(0, 0);
It works great.
Here is how i render my quad:
glTranslatef(0.0f, 0.0f, 30.0f);
glScalef(12.0f, 9.0f, 1.0f);
DrawUtils.drawQuad();
Once again, no problem, the quad is properly rendered.
DrawUtils is a simple class i wrote containing utility method to draw primitives shapes.
Now my problem is when i want to mix both of the above, loading/rendering the 2D image, rendering the quad. When i try to load my 2D image with the following:
s = new Sprite(loader, "player.png);
My quad is not rendered anymore (i'm not even trying to render the 2D image at this point). Only the fact of creating the texture create the issue. After looking a bit at the code of Sprite and TextureLoader i found that the problem appears after the call of the glTexImage2d. In the TextureLoader class:
glTexImage2D(target,
0,
dstPixelFormat,
get2Fold(bufferedImage.getWidth()),
get2Fold(bufferedImage.getHeight()),
0,
srcPixelFormat,
GL_UNSIGNED_BYTE,
textureBuffer);
Commenting this like make the problem disappear. My question is then why? Is there anything special to do after calling this function to do 3D? Does this function alter the render part, the projection matrix?