Tout d'abord, il est impératif que vos images servant de texture soient d'une taille puissance de 2 (ex. : 64×64)
Une classe pour charger vos textures :
import java.io.File; import java.io.IOException; import javax.media.opengl.GL; import javax.media.opengl.GLException; import com.sun.opengl.util.texture.Texture; import com.sun.opengl.util.texture.TextureIO; public class TextureHelper { public static Texture getTexture(String file) { Texture t = null; try { t = TextureIO.newTexture(new File(file), false); t.setTexParameteri(GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST); t.setTexParameteri(GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST); } catch (GLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return t; } }
Pour charger votre texture :
public void init(GLAutoDrawable drawable) { GL gl = drawable.getGL(); gl.glClearColor(1f, 1f, 1f, 1f); gl.glEnable(GL.GL_BLEND); gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); gl.glEnable(GL.GL_LINE_SMOOTH); gl.glEnable(GL.GL_DEPTH_TEST); // Z buffer gl.glEnable(GL.GL_LIGHTING); // Activer la lumiere gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_FILL); gl.glEnable(GL.GL_NORMALIZE); /* normalisation des vecteurs (lors de mises a l'echelle) */ gl.glClearDepth(255); gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); ecranTex = TextureHelper.getTexture("ubuntu.png"); gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); [...]
Pour appliquer une texture sur un GL_QUADS :
public static int construireEcran(GL gl, Texture t) { int i; GLUT glut = new GLUT(); i = gl.glGenLists(1); gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE); gl.glNewList(i, GL.GL_COMPILE); // Ecran gl.glPushMatrix(); t.enable(); TextureCoords tc = t.getImageTexCoords(); t.bind(); gl.glTranslatef(0, 94, -20); gl.glScalef(38, 40, 7); glut.glutSolidCube(1); gl.glBegin(GL.GL_QUADS); gl.glTexCoord2f(tc.top(), tc.left()); gl.glVertex3f(-0.5f, 0.5f, 0.505f); gl.glTexCoord2f(tc.top(), tc.right()); gl.glVertex3f(0.5f, 0.5f, 0.505f); gl.glTexCoord2f(tc.bottom(), tc.right()); gl.glVertex3f(0.5f, -0.5f, 0.505f); gl.glTexCoord2f(tc.bottom(), tc.left()); gl.glVertex3f(-0.5f, -0.5f, 0.505f); gl.glEnd(); t.disable(); gl.glPopMatrix(); gl.glEndList(); return i; }
Ce code montre également comment superposer un GL_QUADS texturé sur un SolidCube.
Il ne reste plus qu'à construire votre objet comme suit :
ecran = ClassRoomElement.construireEcran(gl, this.ecranTex);