2015-07-23 1 views
0

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 ...

Répondre

0

Cela n'a rien à voir avec le système d'exploitation. Veuillez exécuter un exemple simple du livre rouge OpenGL porté à JOGL, par exemple this one. Je suppose que le problème vient du pilote OpenGL.

Je vous conseille de lire this en essayant de faire un gros JAR.

J'ai au moins une ancienne carte graphique sans lumière fonctionnant correctement sous GNU Linux.

Veuillez traduire votre première ligne de commentaires en anglais, pensez à la grande majorité des utilisateurs de StackOverflow qui ne comprennent pas notre langue maternelle.

+0

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