J'ai un problème sur une application cros-plate-forme en utilisant JOGL et I différentes choses à résoudre, mais aucun d'entre eux a fonctionné. Pour commencer, il est un code pour vous montrer comment je rends ma scène (sans le code inutile pour vous):Problèmes avec la lumière sur Windows
La méthode d'affichage:
public void display(GLAutoDrawable drawable)
{
// TODO Auto-generated method stub
GL2 gl = drawable.getGL().getGL2();
setLighting(gl);
gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);
// matrice definition MODELVIEW from camera matrice
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadMatrixf(this.camera.getCameraMatrix());
gl.glDepthFunc(GL.GL_LEQUAL);
gl.glEnable(GL2.GL_NORMALIZE);
gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL2.GL_COLOR_ARRAY);
/*** Voxels Drawing */
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo[0]);
gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo[1]);
gl.glColorPointer(4, GL.GL_FLOAT, 0, 0);
gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, vbo[2]);
gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
gl.glDrawElements(GL2.GL_QUADS, numberVertToDraw, GL.GL_UNSIGNED_INT, 0);
gl.glDisable(GL.GL_BLEND);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
}
la méthode SetLighting:
private void setLighting(GL2 gl)
{
gl.glPushMatrix();
gl.glLoadIdentity();
float[] lightPos = new float[4];
lightPos[0] = 15;
lightPos[1] = 25;
lightPos[2] = 15;
lightPos[3] = 1;
gl.glEnable(GL2.GL_LIGHTING);
gl.glEnable(GL2.GL_LIGHT0);
float[] noAmbient ={ 0.8f, 0.8f, 0.8f, 1f }; // low ambient light
float[] spec = { 0.8f, 0.8f, 0.8f, 1f }; // low ambient light
float[] diffuse ={ 0.2f, 0.2f, 0.2f, 1f };
float[] rgba = {0f, 0f, 0f};
gl.glMaterialfv(GL.GL_FRONT, GL2.GL_AMBIENT, rgba, 0);
gl.glMaterialfv(GL.GL_FRONT, GL2.GL_SPECULAR, rgba, 0);
gl.glMaterialf(GL.GL_FRONT, GL2.GL_SHININESS, 1f);
FloatBuffer Light1Dir = Buffers.newDirectFloatBuffer(new float[]{-1,-1,-1});
FloatBuffer exponent = Buffers.newDirectFloatBuffer(new float[]{5}); // properties of the light
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_AMBIENT, noAmbient, 0);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPECULAR, spec, 0);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_DIFFUSE, diffuse, 0);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_POSITION, lightPos, 0);
gl.glLighti(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPOT_CUTOFF, 50);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPOT_DIRECTION, Light1Dir);
gl.glLightfv(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_SPOT_EXPONENT, exponent);
gl.glLightf(GLLightingFunc.GL_LIGHT0, GLLightingFunc.GL_CONSTANT_ATTENUATION, 1f);
gl.glLightf(GLLightingFunc.GL_LIGHT0,GLLightingFunc. GL_LINEAR_ATTENUATION, 0f);
gl.glLightf(GLLightingFunc.GL_LIGHT0,GLLightingFunc. GL_QUADRATIC_ATTENUATION, 0f);
gl.glPopMatrix();
}
Voici donc mon problème: j'exporte le pot pour avoir une application multi-plateforme. Je teste sur ma machine virtuelle Linux, et sur mon système Linux, tout fonctionne comme dans mon IDE (Eclipse). Mais quand j'essaye Windows, il n'y a pas de rendu de lumière.
En fait, j'ai fait un test en changeant le matériau de la lumière et quand je me rapproche de l'objet à la lumière, son changement de couleur. Donc la lumière est là mais elle s'allume partout avec la même intensité. Mes tests mènent à la fonction ATTENUATION (le dernier arbre de setLighting). Cette fonction n'a aucun effet sur Windows, ou elle a été réinitialisée par Windows à un moment donné, je ne sais pas.
Je tester sur Mac très bientôt et ainsi, je vais éditer ce poste.
Quelqu'un a une idée pour ça? Je n'utilise pas de shaders parce que je n'ai pas le temps d'apprendre, c'est pour un but professionnel, mais je sais que je devrais un jour. Je ne peux vraiment pas trouver comment résoudre ce problème et je n'ai rien trouvé sur le Net ...
Merci à tous pour lire ceci!
PS: Ce mon premier poste et mon français, désolé si je l'ai fait quelque chose de mal en ce qui concerne les règles du forum, et désolé pour mon éventuellement mauvais anglais =)
EDIT: je viens de faire le test sur Mac, et l'atténuation fonctionne exactement comme ça devrait marcher. Les problèmes sont sur Windows ...
Oh ouais, je n'ai pas vu cette ligne, désolé! En effet, j'ai essayé le pot sur une autre vitre et je n'ai eu aucun problème, il doit provenir de mon driver. Merci pour les liens, je vais jeter un oeil là-dessus. – AlEmerich